diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..0f099897b1 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..88b96088e3 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +*_compressed_*.js +*_uncompressed_*.js +/msg/* +/tests/jsunit/* diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000000..8499f3be2c --- /dev/null +++ b/.eslintrc @@ -0,0 +1,26 @@ +{ + "rules": { + "curly": [2, "multi-line"], + "eol-last": [2], + "indent": [2, 2, {"SwitchCase": 1}], # Blockly/Google use 2-space indents + "linebreak-style": [2, "unix"], + "max-len": [2, 120, 4], + "no-trailing-spaces": [2, { "skipBlankLines": true }], + "no-unused-vars": [2, {"args": "after-used", "varsIgnorePattern": "^_"}], + "quotes": [0], # Blockly mixes single and double quotes + "semi": [2, "always"], + "space-before-function-paren": [2, "never"], # Blockly doesn't have space before function paren + "strict": [0], # Blockly uses 'use strict' in files + "no-cond-assign": [0], # Blockly often uses cond-assignment in loops + "valid-jsdoc": [2, {"requireReturn": false}], + "no-redeclare": [0] # Preference from Blockly/Google + }, + "env": { + "browser": true + }, + "globals": { + "Blockly": true, # Blockly global + "goog": true # goog closure libraries/includes + }, + "extends": "eslint:recommended" +} diff --git a/.gitignore b/.gitignore index 00504a0a94..45cccac2ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,14 @@ -node_modules -npm-debug.log +# OSX .DS_Store + +# NPM +/node_modules +npm-* + +# Localization / I18N +common.pyc .settings .project *.pyc *.komodoproject +/nbproject/private/ diff --git a/.jshintignore b/.jshintignore deleted file mode 100644 index 9cc962747a..0000000000 --- a/.jshintignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules/ -tests/ -demos/ -**/*_compressed.js -**/*_uncompressed.js -**/*_test.js \ No newline at end of file diff --git a/COPYING b/LICENSE similarity index 100% rename from COPYING rename to LICENSE diff --git a/README.md b/README.md index 5de76cb2ee..15f1952112 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,23 @@ -# Blockly +# scratch-blocks +#### Scratch Blocks is a library for building creative computing interfaces. -Google's Blockly is a web-based, visual programming editor. Users can drag -blocks together to build programs. All code is free and open source. +![](https://cloud.githubusercontent.com/assets/747641/15227351/c37c09da-1854-11e6-8dc7-9a298f2b1f01.jpg) -**The project page is https://developers.google.com/blockly/** +## Introduction +Scratch Blocks is a fork of Google's [Blockly](https://github.com/google/blockly) project that provides a design specification and codebase for building creative computing interfaces. Together with the [Scratch Virtual Machine (VM)](https://github.com/LLK/scratch-vm) this codebase allows for the rapid design and development of visual programming interfaces. -![](https://developers.google.com/blockly/sample.png) +*This project is in active development and should be considered a "developer preview" at this time.* + +## Two Types of Blocks + +![](https://cloud.githubusercontent.com/assets/747641/15255731/dad4d028-190b-11e6-9c16-8df7445adc96.png) + +Scratch Blocks brings together two different programming "grammars" that the Scratch Team has designed and continued to refine over the past decade. The standard [Scratch](https://scratch.mit.edu) grammar uses blocks that snap together vertically, much like LEGO bricks. For our [ScratchJr](https://scratchjr.org) software, intended for younger children, we developed blocks that are labelled with icons rather than words, and snap together horizontally rather than vertically. We have found that the horizontal grammar is not only friendlier for beginning programmers but also better suited for devices with small screens. + +*Only the horizontal grammar is available for preview at this time. The vertical grammar is in the design phase and will be added to the project over the next several months.* + +## Documentation +The "getting started" guide including [FAQ](https://github.com/LLK/scratch-blocks/wiki/FAQ) and [design documentation](https://github.com/LLK/scratch-blocks/wiki/Design) can be found in the [wiki](https://github.com/LLK/scratch-blocks/wiki). + +## Donate +We provide [Scratch](https://scratch.mit.edu) free of charge, and want to keep it that way! Please consider making a [donation](https://secure.donationpay.org/scratchfoundation/) to support our continued engineering, design, community, and resource development efforts. Donations of any size are appreciated. Thank you! diff --git a/TRADEMARK b/TRADEMARK new file mode 100644 index 0000000000..3e1ec5bf48 --- /dev/null +++ b/TRADEMARK @@ -0,0 +1,7 @@ +The Scratch trademarks, including the Scratch name, logo, the Scratch Cat, Gobo, Pico, Nano, Tera and Giga graphics (the "Marks"), are property of the Massachusetts Institute of Technology (MIT), and the use of the Marks is governed by this policy. + +You may use the Marks to refer to Scratch in Substantially Unmodified form. + +"Substantially Unmodified" means the source code provided by MIT, possibly with minor modifications including but not limited to: bug fixes (including security), changing the locations of files for better integration with the host operating system, adding documentation, and changes to the dynamic linking of libraries. + +A version is not "Substantially Unmodified" if it incorporates features not present in a release of Scratch by MIT. If you do make a substantial modification, to avoid confusion with versions of Scratch produced by MIT you must remove all Marks from your version of the software and refrain from using any of the Marks to refer to your version. diff --git a/appengine/README.txt b/appengine/README.txt deleted file mode 100644 index 6ad341cb10..0000000000 --- a/appengine/README.txt +++ /dev/null @@ -1,43 +0,0 @@ - - Running an App Engine server - -This directory contains the files needed to setup the optional Blockly server. -Although Blockly itself is 100% client-side, the server enables cloud storage -and sharing. Store your programs in Datastore and get a unique URL that allows -you to load the program on any computer. - -To run your own App Engine instance you'll need to create this directory -structure: - -blockly/ - |- app.yaml - |- index.yaml - |- index_redirect.py - |- README.txt - |- storage.js - |- storage.py - |- closure-library/ (Optional) - `- static/ - |- blocks/ - |- core/ - |- demos/ - |- generators/ - |- media/ - |- msg/ - |- tests/ - |- blockly_compressed.js - |- blockly_uncompressed.js (Optional) - |- blocks_compressed.js - |- dart_compressed.js - |- javascript_compressed.js - |- php_compressed.js - `- python_compressed.js - -Instructions for fetching the optional Closure library may be found here: - https://developers.google.com/blockly/hacking/closure - -Go to https://appengine.google.com/ and create your App Engine application. -Modify the 'application' name of app.yaml to your App Engine application name. - -Finally, upload this directory structure to your App Engine account, -wait a minute, then go to http://YOURAPPNAME.appspot.com/ diff --git a/appengine/app.yaml b/appengine/app.yaml deleted file mode 100644 index 001c4e4810..0000000000 --- a/appengine/app.yaml +++ /dev/null @@ -1,82 +0,0 @@ -application: blockly-demo -version: 1 -runtime: python27 -api_version: 1 -threadsafe: no - -handlers: -# Redirect obsolete URLs. -# Blockly files moved from /blockly to /static on 5 Dec 2012. -- url: /blockly/.* - static_files: redirect.html - upload: redirect.html -# Code, Maze and Turtle moved from demos on 29 Dec 2012. -- url: /static/demos/(maze|turtle)/.* - static_files: redirect.html - upload: redirect.html -# Apps was disbanded on 20 Nov 2014. -- url: /static/apps/.* - static_files: redirect.html - upload: redirect.html - - -# Storage API. -- url: /storage - script: storage.py - secure: always -- url: /storage\.js - static_files: storage.js - upload: storage\.js - secure: always - -# Blockly files. -- url: /static - static_dir: static - secure: always - -# Closure library for uncompiled Blockly. -- url: /closure-library - static_dir: closure-library - secure: always - -# Redirect for root directory. -- url: / - script: index_redirect.py - secure: always - -# Favicon. -- url: /favicon\.ico - static_files: favicon.ico - upload: favicon\.ico - secure: always - expiration: "30d" - -# Apple icon. -- url: /apple-touch-icon\.png - static_files: apple-touch-icon.png - upload: apple-touch-icon\.png - secure: always - expiration: "30d" - -# robot.txt -- url: /robots\.txt - static_files: robots.txt - upload: robots\.txt - secure: always - - -skip_files: -# App Engine default patterns. -- ^(.*/)?#.*#$ -- ^(.*/)?.*~$ -- ^(.*/)?.*\.py[co]$ -- ^(.*/)?.*/RCS/.*$ -- ^(.*/)?\..*$ -# Custom skip patterns. -- ^static/appengine/.*$ -- ^static/demos/plane/soy/.+\.jar$ -- ^static/demos/plane/template.soy$ -- ^static/demos/plane/xlf/.*$ -- ^static/i18n/.*$ -- ^static/msg/json/.*$ -- ^.+\.soy$ diff --git a/appengine/apple-touch-icon.png b/appengine/apple-touch-icon.png deleted file mode 100644 index 455abac2d7..0000000000 Binary files a/appengine/apple-touch-icon.png and /dev/null differ diff --git a/appengine/favicon.ico b/appengine/favicon.ico deleted file mode 100644 index 683ec6d5d2..0000000000 Binary files a/appengine/favicon.ico and /dev/null differ diff --git a/appengine/index.yaml b/appengine/index.yaml deleted file mode 100644 index a3b9e05e35..0000000000 --- a/appengine/index.yaml +++ /dev/null @@ -1,11 +0,0 @@ -indexes: - -# AUTOGENERATED - -# This index.yaml is automatically updated whenever the dev_appserver -# detects that a new type of query is run. If you want to manage the -# index.yaml file manually, remove the above marker line (the line -# saying "# AUTOGENERATED"). If you want to manage some indexes -# manually, move them above the marker line. The index.yaml file is -# automatically uploaded to the admin console when you next deploy -# your application using appcfg.py. diff --git a/appengine/index_redirect.py b/appengine/index_redirect.py deleted file mode 100644 index 286a8e87cd..0000000000 --- a/appengine/index_redirect.py +++ /dev/null @@ -1,2 +0,0 @@ -print("Status: 302") -print("Location: /static/demos/index.html") diff --git a/appengine/redirect.html b/appengine/redirect.html deleted file mode 100644 index 9c29bac59f..0000000000 --- a/appengine/redirect.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - diff --git a/appengine/robots.txt b/appengine/robots.txt deleted file mode 100644 index 428c409a75..0000000000 --- a/appengine/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: /storage diff --git a/appengine/storage.js b/appengine/storage.js deleted file mode 100644 index 87d9cae760..0000000000 --- a/appengine/storage.js +++ /dev/null @@ -1,194 +0,0 @@ -/** - * @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 Loading and saving blocks with localStorage and cloud storage. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -// Create a namespace. -var BlocklyStorage = {}; - -/** - * Backup code blocks to localStorage. - * @param {!Blockly.WorkspaceSvg} workspace Workspace. - * @private - */ -BlocklyStorage.backupBlocks_ = function(workspace) { - if ('localStorage' in window) { - var xml = Blockly.Xml.workspaceToDom(workspace); - // Gets the current URL, not including the hash. - var url = window.location.href.split('#')[0]; - window.localStorage.setItem(url, Blockly.Xml.domToText(xml)); - } -}; - -/** - * Bind the localStorage backup function to the unload event. - * @param {Blockly.WorkspaceSvg=} opt_workspace Workspace. - */ -BlocklyStorage.backupOnUnload = function(opt_workspace) { - var workspace = opt_workspace || Blockly.getMainWorkspace(); - window.addEventListener('unload', - function() {BlocklyStorage.backupBlocks_(workspace);}, false); -}; - -/** - * Restore code blocks from localStorage. - * @param {Blockly.WorkspaceSvg=} opt_workspace Workspace. - */ -BlocklyStorage.restoreBlocks = function(opt_workspace) { - var url = window.location.href.split('#')[0]; - if ('localStorage' in window && window.localStorage[url]) { - var workspace = opt_workspace || Blockly.getMainWorkspace(); - var xml = Blockly.Xml.textToDom(window.localStorage[url]); - Blockly.Xml.domToWorkspace(workspace, xml); - } -}; - -/** - * Save blocks to database and return a link containing key to XML. - * @param {Blockly.WorkspaceSvg=} opt_workspace Workspace. - */ -BlocklyStorage.link = function(opt_workspace) { - var workspace = opt_workspace || Blockly.getMainWorkspace(); - var xml = Blockly.Xml.workspaceToDom(workspace); - var data = Blockly.Xml.domToText(xml); - BlocklyStorage.makeRequest_('/storage', 'xml', data, workspace); -}; - -/** - * Retrieve XML text from database using given key. - * @param {string} key Key to XML, obtained from href. - * @param {Blockly.WorkspaceSvg=} opt_workspace Workspace. - */ -BlocklyStorage.retrieveXml = function(key, opt_workspace) { - var workspace = opt_workspace || Blockly.getMainWorkspace(); - BlocklyStorage.makeRequest_('/storage', 'key', key, workspace); -}; - -/** - * Global reference to current AJAX request. - * @type {XMLHttpRequest} - * @private - */ -BlocklyStorage.httpRequest_ = null; - -/** - * Fire a new AJAX request. - * @param {string} url URL to fetch. - * @param {string} name Name of parameter. - * @param {string} content Content of parameter. - * @param {!Blockly.WorkspaceSvg} workspace Workspace. - * @private - */ -BlocklyStorage.makeRequest_ = function(url, name, content, workspace) { - if (BlocklyStorage.httpRequest_) { - // AJAX call is in-flight. - BlocklyStorage.httpRequest_.abort(); - } - BlocklyStorage.httpRequest_ = new XMLHttpRequest(); - BlocklyStorage.httpRequest_.name = name; - BlocklyStorage.httpRequest_.onreadystatechange = - BlocklyStorage.handleRequest_; - BlocklyStorage.httpRequest_.open('POST', url); - BlocklyStorage.httpRequest_.setRequestHeader('Content-Type', - 'application/x-www-form-urlencoded'); - BlocklyStorage.httpRequest_.send(name + '=' + encodeURIComponent(content)); - BlocklyStorage.httpRequest_.workspace = workspace; -}; - -/** - * Callback function for AJAX call. - * @private - */ -BlocklyStorage.handleRequest_ = function() { - if (BlocklyStorage.httpRequest_.readyState == 4) { - if (BlocklyStorage.httpRequest_.status != 200) { - BlocklyStorage.alert(BlocklyStorage.HTTPREQUEST_ERROR + '\n' + - 'httpRequest_.status: ' + BlocklyStorage.httpRequest_.status); - } else { - var data = BlocklyStorage.httpRequest_.responseText.trim(); - if (BlocklyStorage.httpRequest_.name == 'xml') { - window.location.hash = data; - BlocklyStorage.alert(BlocklyStorage.LINK_ALERT.replace('%1', - window.location.href)); - } else if (BlocklyStorage.httpRequest_.name == 'key') { - if (!data.length) { - BlocklyStorage.alert(BlocklyStorage.HASH_ERROR.replace('%1', - window.location.hash)); - } else { - BlocklyStorage.loadXml_(data, BlocklyStorage.httpRequest_.workspace); - } - } - BlocklyStorage.monitorChanges_(BlocklyStorage.httpRequest_.workspace); - } - BlocklyStorage.httpRequest_ = null; - } -}; - -/** - * Start monitoring the workspace. If a change is made that changes the XML, - * clear the key from the URL. Stop monitoring the workspace once such a - * change is detected. - * @param {!Blockly.WorkspaceSvg} workspace Workspace. - * @private - */ -BlocklyStorage.monitorChanges_ = function(workspace) { - var startXmlDom = Blockly.Xml.workspaceToDom(workspace); - var startXmlText = Blockly.Xml.domToText(startXmlDom); - function change() { - var xmlDom = Blockly.Xml.workspaceToDom(workspace); - var xmlText = Blockly.Xml.domToText(xmlDom); - if (startXmlText != xmlText) { - window.location.hash = ''; - workspace.removeChangeListener(bindData); - } - } - var bindData = workspace.addChangeListener(change); -}; - -/** - * Load blocks from XML. - * @param {string} xml Text representation of XML. - * @param {!Blockly.WorkspaceSvg} workspace Workspace. - * @private - */ -BlocklyStorage.loadXml_ = function(xml, workspace) { - try { - xml = Blockly.Xml.textToDom(xml); - } catch (e) { - BlocklyStorage.alert(BlocklyStorage.XML_ERROR + '\nXML: ' + xml); - return; - } - // Clear the workspace to avoid merge. - workspace.clear(); - Blockly.Xml.domToWorkspace(workspace, xml); -}; - -/** - * Present a text message to the user. - * Designed to be overridden if an app has custom dialogs, or a butter bar. - * @param {string} message Text to alert. - */ -BlocklyStorage.alert = function(message) { - window.alert(message); -}; diff --git a/appengine/storage.py b/appengine/storage.py deleted file mode 100644 index 4a572073f4..0000000000 --- a/appengine/storage.py +++ /dev/null @@ -1,85 +0,0 @@ -"""Blockly Demo: Storage - -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. -""" - -"""Store and retrieve XML with App Engine. -""" - -__author__ = "q.neutron@gmail.com (Quynh Neutron)" - -import cgi -from random import randint -from google.appengine.ext import db -from google.appengine.api import memcache -import logging - -print "Content-Type: text/plain\n" - -def keyGen(): - # Generate a random string of length KEY_LEN. - KEY_LEN = 6 - CHARS = "abcdefghijkmnopqrstuvwxyz23456789" # Exclude l, 0, 1. - max_index = len(CHARS) - 1 - return "".join([CHARS[randint(0, max_index)] for x in range(KEY_LEN)]) - -class Xml(db.Model): - # A row in the database. - xml_hash = db.IntegerProperty() - xml_content = db.TextProperty() - -forms = cgi.FieldStorage() -if "xml" in forms: - # Store XML and return a generated key. - xml_content = forms["xml"].value - xml_hash = hash(xml_content) - lookup_query = db.Query(Xml) - lookup_query.filter("xml_hash =", xml_hash) - lookup_result = lookup_query.get() - if lookup_result: - xml_key = lookup_result.key().name() - else: - trials = 0 - result = True - while result: - trials += 1 - if trials == 100: - raise Exception("Sorry, the generator failed to get a key for you.") - xml_key = keyGen() - result = db.get(db.Key.from_path("Xml", xml_key)) - xml = db.Text(xml_content, encoding="utf_8") - row = Xml(key_name = xml_key, xml_hash = xml_hash, xml_content = xml) - row.put() - print xml_key - -if "key" in forms: - # Retrieve stored XML based on the provided key. - key_provided = forms["key"].value - # Normalize the string. - key_provided = key_provided.lower().strip() - # Check memcache for a quick match. - xml = memcache.get("XML_" + key_provided) - if xml is None: - # Check datastore for a definitive match. - result = db.get(db.Key.from_path("Xml", key_provided)) - if not result: - xml = "" - else: - xml = result.xml_content - # Save to memcache for next hit. - if not memcache.add("XML_" + key_provided, xml, 3600): - logging.error("Memcache set failed.") - print xml.encode("utf-8") diff --git a/blockly_compressed_horizontal.js b/blockly_compressed_horizontal.js new file mode 100644 index 0000000000..8ad580c2b1 --- /dev/null +++ b/blockly_compressed_horizontal.js @@ -0,0 +1,1490 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + +var COMPILED=!0,goog=goog||{};goog.global=this;goog.isDef=function(a){return void 0!==a};goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||!c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]?c[d]:c[d]={}}; +goog.define=function(a,b){var c=b;COMPILED||(goog.global.CLOSURE_UNCOMPILED_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_UNCOMPILED_DEFINES,a)?c=goog.global.CLOSURE_UNCOMPILED_DEFINES[a]:goog.global.CLOSURE_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_DEFINES,a)&&(c=goog.global.CLOSURE_DEFINES[a]));goog.exportPath_(a,c)};goog.DEBUG=!1;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG; +goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1;goog.provide=function(a){if(goog.isInModuleLoader_())throw Error("goog.provide can not be used within a goog.module.");if(!COMPILED&&goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');goog.constructNamespace_(a)};goog.constructNamespace_=function(a,b){if(!COMPILED){delete goog.implicitNamespaces_[a];for(var c=a;(c=c.substring(0,c.lastIndexOf(".")))&&!goog.getObjectByName(c);)goog.implicitNamespaces_[c]=!0}goog.exportPath_(a,b)}; +goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/;goog.module=function(a){if(!goog.isString(a)||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly.");if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module.");goog.moduleLoaderState_.moduleName=a;if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a]}}; +goog.module.get=function(a){return goog.module.getInternal_(a)};goog.module.getInternal_=function(a){if(!COMPILED)return goog.isProvided_(a)?a in goog.loadedModules_?goog.loadedModules_[a]:goog.getObjectByName(a):null};goog.moduleLoaderState_=null;goog.isInModuleLoader_=function(){return null!=goog.moduleLoaderState_}; +goog.module.declareLegacyNamespace=function(){if(!COMPILED&&!goog.isInModuleLoader_())throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");if(!COMPILED&&!goog.moduleLoaderState_.moduleName)throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.");goog.moduleLoaderState_.declareLegacyNamespace=!0}; +goog.setTestOnly=function(a){if(goog.DISALLOW_TEST_ONLY_CODE)throw a=a||"",Error("Importing test-only code into non-debug environment"+(a?": "+a:"."));};goog.forwardDeclare=function(a){};COMPILED||(goog.isProvided_=function(a){return a in goog.loadedModules_||!goog.implicitNamespaces_[a]&&goog.isDefAndNotNull(goog.getObjectByName(a))},goog.implicitNamespaces_={"goog.module":!0}); +goog.getObjectByName=function(a,b){for(var c=a.split("."),d=b||goog.global,e;e=c.shift();)if(goog.isDefAndNotNull(d[e]))d=d[e];else return null;return d};goog.globalize=function(a,b){var c=b||goog.global,d;for(d in a)c[d]=a[d]}; +goog.addDependency=function(a,b,c,d){if(goog.DEPENDENCIES_ENABLED){var e;a=a.replace(/\\/g,"/");var f=goog.dependencies_;d&&"boolean"!==typeof d||(d=d?{module:"goog"}:{});for(var g=0;e=b[g];g++)f.nameToPath[e]=a,f.pathIsModule[a]="goog"==d.module;for(d=0;b=c[d];d++)a in f.requires||(f.requires[a]={}),f.requires[a][b]=!0}};goog.ENABLE_DEBUG_LOADER=!0;goog.logToConsole_=function(a){goog.global.console&&goog.global.console.error(a)}; +goog.require=function(a){if(!COMPILED){goog.ENABLE_DEBUG_LOADER&&goog.IS_OLD_IE_&&goog.maybeProcessDeferredDep_(a);if(goog.isProvided_(a))return goog.isInModuleLoader_()?goog.module.getInternal_(a):null;if(goog.ENABLE_DEBUG_LOADER){var b=goog.getPathFromDeps_(a);if(b)return goog.writeScripts_(b),null}a="goog.require could not find: "+a;goog.logToConsole_(a);throw Error(a);}};goog.basePath="";goog.nullFunction=function(){}; +goog.abstractMethod=function(){throw Error("unimplemented abstract method");};goog.addSingletonGetter=function(a){a.getInstance=function(){if(a.instance_)return a.instance_;goog.DEBUG&&(goog.instantiatedSingletons_[goog.instantiatedSingletons_.length]=a);return a.instance_=new a}};goog.instantiatedSingletons_=[];goog.LOAD_MODULE_USING_EVAL=!0;goog.SEAL_MODULE_EXPORTS=goog.DEBUG;goog.loadedModules_={};goog.DEPENDENCIES_ENABLED=!COMPILED&&goog.ENABLE_DEBUG_LOADER; +goog.DEPENDENCIES_ENABLED&&(goog.dependencies_={pathIsModule:{},nameToPath:{},requires:{},visited:{},written:{},deferred:{}},goog.inHtmlDocument_=function(){var a=goog.global.document;return null!=a&&"write"in a},goog.findBasePath_=function(){if(goog.isDef(goog.global.CLOSURE_BASE_PATH))goog.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_())for(var a=goog.global.document.getElementsByTagName("SCRIPT"),b=a.length-1;0<=b;--b){var c=a[b].src,d=c.lastIndexOf("?"),d=-1==d?c.length: +d;if("base.js"==c.substr(d-7,7)){goog.basePath=c.substr(0,d-7);break}}},goog.importScript_=function(a,b){(goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_)(a,b)&&(goog.dependencies_.written[a]=!0)},goog.IS_OLD_IE_=!(goog.global.atob||!goog.global.document||!goog.global.document.all),goog.importModule_=function(a){goog.importScript_("",'goog.retrieveAndExecModule_("'+a+'");')&&(goog.dependencies_.written[a]=!0)},goog.queuedModules_=[],goog.wrapModule_=function(a,b){return goog.LOAD_MODULE_USING_EVAL&& +goog.isDef(goog.global.JSON)?"goog.loadModule("+goog.global.JSON.stringify(b+"\n//# sourceURL="+a+"\n")+");":'goog.loadModule(function(exports) {"use strict";'+b+"\n;return exports});\n//# sourceURL="+a+"\n"},goog.loadQueuedModules_=function(){var a=goog.queuedModules_.length;if(0\x3c/script>')},goog.appendScriptSrcNode_=function(a){var b=goog.global.document, +c=b.createElement("script");c.type="text/javascript";c.src=a;c.defer=!1;c.async=!1;b.head.appendChild(c)},goog.writeScriptTag_=function(a,b){if(goog.inHtmlDocument_()){var c=goog.global.document;if(!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING&&"complete"==c.readyState){if(/\bdeps.js$/.test(a))return!1;throw Error('Cannot write "'+a+'" after document load');}var d=goog.IS_OLD_IE_;void 0===b?d?(d=" onreadystatechange='goog.onScriptLoad_(this, "+ ++goog.lastNonModuleScriptIndex_+")' ",c.write(''); + // Load fresh Closure Library. + document.write(''); + document.write(''); +} diff --git a/blocks/colour.js b/blocks/colour.js index 7c92122baf..ceb9efc5b7 100644 --- a/blocks/colour.js +++ b/blocks/colour.js @@ -51,9 +51,16 @@ Blockly.Blocks['colour_picker'] = { ], "output": "Colour", "colour": Blockly.Blocks.colour.HUE, - "tooltip": Blockly.Msg.COLOUR_PICKER_TOOLTIP, "helpUrl": Blockly.Msg.COLOUR_PICKER_HELPURL }); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + // Colour block is trivial. Use tooltip of parent block if it exists. + this.setTooltip(function() { + var parent = thisBlock.getParent(); + return (parent && parent.getInputsInline() && parent.tooltip) || + Blockly.Msg.COLOUR_PICKER_TOOLTIP; + }); } }; diff --git a/blocks/lists.js b/blocks/lists.js index 57463c5bfd..4895dd256c 100644 --- a/blocks/lists.js +++ b/blocks/lists.js @@ -119,13 +119,18 @@ Blockly.Blocks['lists_create_with'] = { 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('ADD' + i).connection.targetConnection; + if (connection && connections.indexOf(connection) == -1) { + connection.disconnect(); + } + } this.itemCount_ = connections.length; this.updateShape_(); // Reconnect any child blocks. for (var i = 0; i < this.itemCount_; i++) { - if (connections[i]) { - this.getInput('ADD' + i).connection.connect(connections[i]); - } + Blockly.Mutator.reconnect(connections[i], this, 'ADD' + i); } }, /** @@ -150,28 +155,26 @@ Blockly.Blocks['lists_create_with'] = { * @this Blockly.Block */ updateShape_: function() { - // Delete everything. - if (this.getInput('EMPTY')) { + if (this.itemCount_ && this.getInput('EMPTY')) { this.removeInput('EMPTY'); - } else { - var i = 0; - while (this.getInput('ADD' + i)) { - this.removeInput('ADD' + i); - i++; - } - } - // Rebuild block. - if (this.itemCount_ == 0) { + } else if (!this.itemCount_ && !this.getInput('EMPTY')) { this.appendDummyInput('EMPTY') .appendField(Blockly.Msg.LISTS_CREATE_EMPTY_TITLE); - } else { - for (var i = 0; i < this.itemCount_; i++) { + } + // Add new inputs. + for (var i = 0; i < this.itemCount_; i++) { + if (!this.getInput('ADD' + i)) { var input = this.appendValueInput('ADD' + i); if (i == 0) { input.appendField(Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH); } } } + // Remove deleted inputs. + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } } }; @@ -640,6 +643,46 @@ Blockly.Blocks['lists_getSublist'] = { } }; +Blockly.Blocks['lists_sort'] = { + /** + * Block for sorting a list. + * @this Blockly.Block + */ + 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'] = { /** * Block for splitting text into a list, or joining a list into text. diff --git a/blocks/logic.js b/blocks/logic.js index 857b042594..5dab77d865 100644 --- a/blocks/logic.js +++ b/blocks/logic.js @@ -94,17 +94,7 @@ Blockly.Blocks['controls_if'] = { domToMutation: function(xmlElement) { this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10) || 0; this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10) || 0; - for (var i = 1; i <= this.elseifCount_; i++) { - this.appendValueInput('IF' + i) - .setCheck('Boolean') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); - this.appendStatementInput('DO' + i) - .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); - } - if (this.elseCount_) { - this.appendStatementInput('ELSE') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); - } + this.updateShape_(); }, /** * Populate the mutator's dialog with this block's components. @@ -135,44 +125,23 @@ Blockly.Blocks['controls_if'] = { * @this Blockly.Block */ compose: function(containerBlock) { - // Disconnect the else input blocks and remove the inputs. - if (this.elseCount_) { - this.removeInput('ELSE'); - } - this.elseCount_ = 0; - // Disconnect all the elseif input blocks and remove the inputs. - for (var i = this.elseifCount_; i > 0; i--) { - this.removeInput('IF' + i); - this.removeInput('DO' + i); - } - this.elseifCount_ = 0; - // Rebuild the block's optional inputs. var clauseBlock = containerBlock.nextConnection.targetBlock(); + // Count number of inputs. + this.elseifCount_ = 0; + this.elseCount_ = 0; + var valueConnections = [null]; + var statementConnections = [null]; + var elseStatementConnection = null; while (clauseBlock) { switch (clauseBlock.type) { case 'controls_if_elseif': this.elseifCount_++; - var ifInput = this.appendValueInput('IF' + this.elseifCount_) - .setCheck('Boolean') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); - var doInput = this.appendStatementInput('DO' + this.elseifCount_); - doInput.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); - // Reconnect any child blocks. - if (clauseBlock.valueConnection_) { - ifInput.connection.connect(clauseBlock.valueConnection_); - } - if (clauseBlock.statementConnection_) { - doInput.connection.connect(clauseBlock.statementConnection_); - } + valueConnections.push(clauseBlock.valueConnection_); + statementConnections.push(clauseBlock.statementConnection_); break; case 'controls_if_else': this.elseCount_++; - var elseInput = this.appendStatementInput('ELSE'); - elseInput.appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); - // Reconnect any child blocks. - if (clauseBlock.statementConnection_) { - elseInput.connection.connect(clauseBlock.statementConnection_); - } + elseStatementConnection = clauseBlock.statementConnection_; break; default: throw 'Unknown block type.'; @@ -180,6 +149,13 @@ Blockly.Blocks['controls_if'] = { clauseBlock = clauseBlock.nextConnection && clauseBlock.nextConnection.targetBlock(); } + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 1; i <= this.elseifCount_; i++) { + Blockly.Mutator.reconnect(valueConnections[i], this, 'IF' + i); + Blockly.Mutator.reconnect(statementConnections[i], this, 'DO' + i); + } + Blockly.Mutator.reconnect(elseStatementConnection, this, 'ELSE'); }, /** * Store pointers to any connected child blocks. @@ -211,6 +187,35 @@ Blockly.Blocks['controls_if'] = { clauseBlock = clauseBlock.nextConnection && clauseBlock.nextConnection.targetBlock(); } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function() { + // Delete everything. + if (this.getInput('ELSE')) { + this.removeInput('ELSE'); + } + var i = 1; + while (this.getInput('IF' + i)) { + this.removeInput('IF' + i); + this.removeInput('DO' + i); + i++; + } + // Rebuild block. + for (var i = 1; i <= this.elseifCount_; i++) { + this.appendValueInput('IF' + i) + .setCheck('Boolean') + .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); + this.appendStatementInput('DO' + i) + .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); + } + if (this.elseCount_) { + this.appendStatementInput('ELSE') + .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); + } } }; @@ -307,22 +312,26 @@ Blockly.Blocks['logic_compare'] = { /** * Called whenever anything on the workspace changes. * Prevent mismatched types from being compared. + * @param {!Blockly.Events.Abstract} e Change event. * @this Blockly.Block */ - onchange: function() { + onchange: function(e) { var blockA = this.getInputTargetBlock('A'); var blockB = this.getInputTargetBlock('B'); // Disconnect blocks that existed prior to this change if they don't match. if (blockA && blockB && !blockA.outputConnection.checkType_(blockB.outputConnection)) { // Mismatch between two inputs. Disconnect previous and bump it away. + // Ensure that any disconnections are grouped with the causing event. + Blockly.Events.setGroup(e.group); for (var i = 0; i < this.prevBlocks_.length; i++) { var block = this.prevBlocks_[i]; if (block === blockA || block === blockB) { - block.setParent(null); + block.unplug(); block.bumpNeighbours_(); } } + Blockly.Events.setGroup(false); } this.prevBlocks_[0] = blockA; this.prevBlocks_[1] = blockB; @@ -447,9 +456,10 @@ Blockly.Blocks['logic_ternary'] = { /** * Called whenever anything on the workspace changes. * Prevent mismatched types. + * @param {!Blockly.Events.Abstract} e Change event. * @this Blockly.Block */ - onchange: function() { + onchange: function(e) { var blockA = this.getInputTargetBlock('THEN'); var blockB = this.getInputTargetBlock('ELSE'); var parentConnection = this.outputConnection.targetConnection; @@ -458,13 +468,16 @@ Blockly.Blocks['logic_ternary'] = { for (var i = 0; i < 2; i++) { var block = (i == 1) ? blockA : blockB; if (block && !block.outputConnection.checkType_(parentConnection)) { + // Ensure that any disconnections are grouped with the causing event. + Blockly.Events.setGroup(e.group); if (parentConnection === this.prevParentConnection_) { - this.setParent(null); - parentConnection.sourceBlock_.bumpNeighbours_(); + this.unplug(); + parentConnection.getSourceBlock().bumpNeighbours_(); } else { - block.setParent(null); + block.unplug(); block.bumpNeighbours_(); } + Blockly.Events.setGroup(false); } } } diff --git a/blocks/loops.js b/blocks/loops.js index 06e55960d3..d9d8cbfcd1 100644 --- a/blocks/loops.js +++ b/blocks/loops.js @@ -71,7 +71,7 @@ Blockly.Blocks['controls_repeat'] = { "message0": Blockly.Msg.CONTROLS_REPEAT_TITLE, "args0": [ { - "type": "field_input", + "type": "field_number", "name": "TIMES", "text": "10" } @@ -84,7 +84,7 @@ Blockly.Blocks['controls_repeat'] = { }); this.appendStatementInput('DO') .appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO); - this.getField('TIMES').setChangeHandler( + this.getField('TIMES').setValidator( Blockly.FieldTextInput.nonnegativeIntegerValidator); } }; @@ -168,26 +168,6 @@ Blockly.Blocks['controls_for'] = { thisBlock.getFieldValue('VAR')); }); }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - }, /** * Add menu option to create getter block for loop variable. * @param {!Array} options List of menu options to add to. @@ -242,26 +222,6 @@ Blockly.Blocks['controls_forEach'] = { thisBlock.getFieldValue('VAR')); }); }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - }, customContextMenu: Blockly.Blocks['controls_for'].customContextMenu }; @@ -293,18 +253,15 @@ Blockly.Blocks['controls_flow_statements'] = { /** * 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() { + onchange: function(e) { var legal = false; // Is the block nested in a loop? var block = this; do { - if (block.type == 'controls_repeat' || - block.type == 'controls_repeat_ext' || - block.type == 'controls_forEach' || - block.type == 'controls_for' || - block.type == 'controls_whileUntil') { + if (this.LOOP_TYPES.indexOf(block.type) != -1) { legal = true; break; } @@ -315,5 +272,12 @@ Blockly.Blocks['controls_flow_statements'] = { } else { this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); } - } + }, + /** + * List of block types that are loops and thus do not need warnings. + * To add a new loop type add this to your code: + * Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop'); + */ + LOOP_TYPES: ['controls_repeat', 'controls_repeat_ext', 'controls_forEach', + 'controls_for', 'controls_whileUntil'] }; diff --git a/blocks/math.js b/blocks/math.js index f89704143e..ebc0366c52 100644 --- a/blocks/math.js +++ b/blocks/math.js @@ -28,11 +28,13 @@ goog.provide('Blockly.Blocks.math'); goog.require('Blockly.Blocks'); +goog.require('Blockly.Colours'); + /** * Common HSV hue for all blocks in this category. */ -Blockly.Blocks.math.HUE = 230; +Blockly.Blocks.math.HUE = Blockly.Colours.textField; Blockly.Blocks['math_number'] = { /** @@ -43,34 +45,85 @@ Blockly.Blocks['math_number'] = { this.setHelpUrl(Blockly.Msg.MATH_NUMBER_HELPURL); this.setColour(Blockly.Blocks.math.HUE); this.appendDummyInput() - .appendField(new Blockly.FieldTextInput('0', - Blockly.FieldTextInput.numberValidator), 'NUM'); + .appendField(new Blockly.FieldNumber('0', + Blockly.FieldTextInput.numberValidator, 20, -Infinity, Infinity), 'NUM'); this.setOutput(true, 'Number'); - this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + // Number block is trivial. Use tooltip of parent block if it exists. + this.setTooltip(function() { + var parent = thisBlock.getParent(); + return (parent && parent.getInputsInline() && parent.tooltip) || + Blockly.Msg.MATH_NUMBER_TOOLTIP; + }); } }; -Blockly.Blocks['math_arithmetic'] = { +Blockly.Blocks['math_whole_number'] = { /** - * Block for basic arithmetic operator. + * Block for whole number value, with min of 0 and max Infinity, precision 0. * @this Blockly.Block */ init: function() { - var OPERATORS = - [[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']]; - this.setHelpUrl(Blockly.Msg.MATH_ARITHMETIC_HELPURL); + this.setHelpUrl(Blockly.Msg.MATH_NUMBER_HELPURL); this.setColour(Blockly.Blocks.math.HUE); + this.appendDummyInput() + .appendField(new Blockly.FieldNumber('0', + Blockly.FieldNumber.numberValidator, 0, 0, Infinity), 'NUM'); this.setOutput(true, 'Number'); - this.appendValueInput('A') - .setCheck('Number'); - this.appendValueInput('B') - .setCheck('Number') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); - this.setInputsInline(true); + } +}; + +Blockly.Blocks['math_positive_number'] = { + /** + * Block for positive number value, with min of 0 and max Infinity, precision 20. + * @this Blockly.Block + */ + init: function() { + this.setHelpUrl(Blockly.Msg.MATH_NUMBER_HELPURL); + this.setColour(Blockly.Blocks.math.HUE); + this.appendDummyInput() + .appendField(new Blockly.FieldNumber('0', + Blockly.FieldNumber.numberValidator, 20, 0, Infinity), 'NUM'); + this.setOutput(true, 'Number'); + } +}; + +Blockly.Blocks['math_arithmetic'] = { + /** + * Block for basic arithmetic operator. + * @this Blockly.Block + */ + 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": true, + "output": "Number", + "colour": Blockly.Blocks.math.HUE, + "helpUrl": Blockly.Msg.MATH_ARITHMETIC_HELPURL + }); // Assign 'this' to a variable for use in the tooltip closure below. var thisBlock = this; this.setTooltip(function() { @@ -93,20 +146,32 @@ Blockly.Blocks['math_single'] = { * @this Blockly.Block */ init: function() { - var OPERATORS = - [[Blockly.Msg.MATH_SINGLE_OP_ROOT, 'ROOT'], - [Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE, 'ABS'], - ['-', 'NEG'], - ['ln', 'LN'], - ['log10', 'LOG10'], - ['e^', 'EXP'], - ['10^', 'POW10']]; - this.setHelpUrl(Blockly.Msg.MATH_SINGLE_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendValueInput('NUM') - .setCheck('Number') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); + 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 + }); // Assign 'this' to a variable for use in the tooltip closure below. var thisBlock = this; this.setTooltip(function() { @@ -131,19 +196,31 @@ Blockly.Blocks['math_trig'] = { * @this Blockly.Block */ init: function() { - var OPERATORS = - [[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']]; - this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendValueInput('NUM') - .setCheck('Number') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); + 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 + }); // Assign 'this' to a variable for use in the tooltip closure below. var thisBlock = this; this.setTooltip(function() { @@ -167,19 +244,27 @@ Blockly.Blocks['math_constant'] = { * @this Blockly.Block */ init: function() { - var CONSTANTS = - [['\u03c0', 'PI'], - ['e', 'E'], - ['\u03c6', 'GOLDEN_RATIO'], - ['sqrt(2)', 'SQRT2'], - ['sqrt(\u00bd)', 'SQRT1_2'], - ['\u221e', 'INFINITY']]; - this.setHelpUrl(Blockly.Msg.MATH_CONSTANT_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendDummyInput() - .appendField(new Blockly.FieldDropdown(CONSTANTS), 'CONSTANT'); - this.setTooltip(Blockly.Msg.MATH_CONSTANT_TOOLTIP); + 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 + }); } }; @@ -282,26 +367,6 @@ Blockly.Blocks['math_change'] = { return Blockly.Msg.MATH_CHANGE_TOOLTIP.replace('%1', thisBlock.getFieldValue('VAR')); }); - }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } } }; @@ -311,17 +376,29 @@ Blockly.Blocks['math_round'] = { * @this Blockly.Block */ init: function() { - var OPERATORS = - [[Blockly.Msg.MATH_ROUND_OPERATOR_ROUND, 'ROUND'], - [Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP, 'ROUNDUP'], - [Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN, 'ROUNDDOWN']]; - this.setHelpUrl(Blockly.Msg.MATH_ROUND_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendValueInput('NUM') - .setCheck('Number') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); - this.setTooltip(Blockly.Msg.MATH_ROUND_TOOLTIP); + 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 + }); } }; @@ -498,11 +575,12 @@ Blockly.Blocks['math_random_float'] = { * @this Blockly.Block */ init: function() { - this.setHelpUrl(Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL); - this.setColour(Blockly.Blocks.math.HUE); - this.setOutput(true, 'Number'); - this.appendDummyInput() - .appendField(Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM); - this.setTooltip(Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP); + 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 + }); } }; diff --git a/blocks/procedures.js b/blocks/procedures.js index eab8646a8f..0b7ad45e27 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -117,18 +117,30 @@ Blockly.Blocks['procedures_defnoreturn'] = { paramString = Blockly.Msg.PROCEDURES_BEFORE_PARAMS + ' ' + this.arguments_.join(', '); } + // The params field is deterministic based on the mutation, + // no need to fire a change event. + Blockly.Events.disable(); this.setFieldValue(paramString, 'PARAMS'); + Blockly.Events.enable(); }, /** * Create XML to represent the argument inputs. + * @param {=boolean} opt_paramIds If true include the IDs of the parameter + * quarks. Used by Blockly.Procedures.mutateCallers for reconnection. * @return {!Element} XML storage element. * @this Blockly.Block */ - mutationToDom: function() { + mutationToDom: function(opt_paramIds) { var container = document.createElement('mutation'); + if (opt_paramIds) { + container.setAttribute('name', this.getFieldValue('NAME')); + } for (var i = 0; i < this.arguments_.length; i++) { var parameter = document.createElement('arg'); parameter.setAttribute('name', this.arguments_[i]); + if (opt_paramIds && this.paramIds_) { + parameter.setAttribute('paramId', this.paramIds_[i]); + } container.appendChild(parameter); } @@ -151,6 +163,7 @@ Blockly.Blocks['procedures_defnoreturn'] = { } } this.updateParams_(); + Blockly.Procedures.mutateCallers(this); // Show or hide the statement input. this.setStatements_(xmlElement.getAttribute('statements') !== 'false'); @@ -185,8 +198,7 @@ Blockly.Blocks['procedures_defnoreturn'] = { connection = paramBlock.nextConnection; } // Initialize procedure's callers with blank IDs. - Blockly.Procedures.mutateCallers(this.getFieldValue('NAME'), - this.workspace, this.arguments_, null); + Blockly.Procedures.mutateCallers(this); return containerBlock; }, /** @@ -206,8 +218,7 @@ Blockly.Blocks['procedures_defnoreturn'] = { paramBlock.nextConnection.targetBlock(); } this.updateParams_(); - Blockly.Procedures.mutateCallers(this.getFieldValue('NAME'), - this.workspace, this.arguments_, this.paramIds_); + Blockly.Procedures.mutateCallers(this); // Show/hide the statement input. var hasStatements = containerBlock.getFieldValue('STATEMENTS'); @@ -217,24 +228,15 @@ Blockly.Blocks['procedures_defnoreturn'] = { if (hasStatements) { this.setStatements_(true); // Restore the stack, if one was saved. - var stackConnection = this.getInput('STACK').connection; - if (stackConnection.targetConnection || - !this.statementConnection_ || - this.statementConnection_.targetConnection || - this.statementConnection_.sourceBlock_.workspace != - this.workspace) { - // Block no longer exists or has been attached elsewhere. - this.statementConnection_ = null; - } else { - stackConnection.connect(this.statementConnection_); - } + Blockly.Mutator.reconnect(this.statementConnection_, this, 'STACK'); + this.statementConnection_ = null; } else { // Save the stack, then disconnect it. var stackConnection = this.getInput('STACK').connection; this.statementConnection_ = stackConnection.targetConnection; if (this.statementConnection_) { var stackBlock = stackConnection.targetBlock(); - stackBlock.setParent(null); + stackBlock.unplug(); stackBlock.bumpNeighbours_(); } this.setStatements_(false); @@ -448,15 +450,15 @@ Blockly.Blocks['procedures_callnoreturn'] = { */ init: function() { this.appendDummyInput('TOPROW') - .appendField('', 'NAME'); + .appendField(this.id, 'NAME'); this.setPreviousStatement(true); this.setNextStatement(true); this.setColour(Blockly.Blocks.procedures.HUE); - // Tooltip is set in domToMutation. + // Tooltip is set in renameProcedure. this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL); this.arguments_ = []; this.quarkConnections_ = {}; - this.quarkArguments_ = null; + this.quarkIds_ = null; }, /** * Returns the name of the procedure this block calls. @@ -489,74 +491,81 @@ Blockly.Blocks['procedures_callnoreturn'] = { * @param {!Array.} paramIds IDs of params (consistent for each * parameter through the life of a mutator, regardless of param renaming), * e.g. ['piua', 'f8b_', 'oi.o']. + * @private * @this Blockly.Block */ - setProcedureParameters: function(paramNames, paramIds) { + setProcedureParameters_: function(paramNames, paramIds) { // Data structures: // this.arguments = ['x', 'y'] // Existing param names. // this.quarkConnections_ {piua: null, f8b_: Blockly.Connection} // Look-up of paramIds to connections plugged into the call block. - // this.quarkArguments_ = ['piua', 'f8b_'] + // this.quarkIds_ = ['piua', 'f8b_'] // Existing param IDs. // Note that quarkConnections_ may include IDs that no longer exist, but // which might reappear if a param is reattached in the mutator. + var defBlock = Blockly.Procedures.getDefinition(this.getProcedureCall(), + this.workspace); + var mutatorOpen = defBlock && defBlock.mutator && + defBlock.mutator.isVisible(); + if (!mutatorOpen) { + this.quarkConnections_ = {}; + this.quarkIds_ = null; + } if (!paramIds) { // Reset the quarks (a mutator is about to open). - this.quarkConnections_ = {}; - this.quarkArguments_ = null; return; } if (goog.array.equals(this.arguments_, paramNames)) { // No change. - this.quarkArguments_ = paramIds; + this.quarkIds_ = paramIds; return; } - this.setCollapsed(false); if (paramIds.length != paramNames.length) { throw 'Error: paramNames and paramIds must be the same length.'; } - if (!this.quarkArguments_) { + this.setCollapsed(false); + if (!this.quarkIds_) { // Initialize tracking for this block. this.quarkConnections_ = {}; if (paramNames.join('\n') == this.arguments_.join('\n')) { // No change to the parameters, allow quarkConnections_ to be // populated with the existing connections. - this.quarkArguments_ = paramIds; + this.quarkIds_ = paramIds; } else { - this.quarkArguments_ = []; + this.quarkIds_ = []; } } // Switch off rendering while the block is rebuilt. var savedRendered = this.rendered; this.rendered = false; // Update the quarkConnections_ with existing connections. - for (var i = this.arguments_.length - 1; i >= 0; i--) { + for (var i = 0; i < this.arguments_.length; i++) { var input = this.getInput('ARG' + i); if (input) { var connection = input.connection.targetConnection; - this.quarkConnections_[this.quarkArguments_[i]] = connection; - // Disconnect all argument blocks and remove all inputs. - this.removeInput('ARG' + i); + this.quarkConnections_[this.quarkIds_[i]] = connection; + if (mutatorOpen && connection && + paramIds.indexOf(this.quarkIds_[i]) == -1) { + // This connection should no longer be attached to this block. + connection.disconnect(); + connection.getSourceBlock().bumpNeighbours_(); + } } } // Rebuild the block's arguments. this.arguments_ = [].concat(paramNames); - this.renderArgs_(); - this.quarkArguments_ = paramIds; + this.updateShape_(); + this.quarkIds_ = paramIds; // Reconnect any child blocks. - if (this.quarkArguments_) { + if (this.quarkIds_) { for (var i = 0; i < this.arguments_.length; i++) { - var input = this.getInput('ARG' + i); - var quarkName = this.quarkArguments_[i]; - if (quarkName in this.quarkConnections_) { - var connection = this.quarkConnections_[quarkName]; - if (!connection || connection.targetConnection || - connection.sourceBlock_.workspace != this.workspace) { + var quarkId = this.quarkIds_[i]; + if (quarkId in this.quarkConnections_) { + var connection = this.quarkConnections_[quarkId]; + if (!Blockly.Mutator.reconnect(connection, this, 'ARG' + i)) { // Block no longer exists or has been attached elsewhere. - delete this.quarkConnections_[quarkName]; - } else { - input.connection.connect(connection); + delete this.quarkConnections_[quarkId]; } } } @@ -568,28 +577,45 @@ Blockly.Blocks['procedures_callnoreturn'] = { } }, /** - * Render the arguments. - * @this Blockly.Block + * Modify this block to have the correct number of arguments. * @private + * @this Blockly.Block */ - renderArgs_: function() { + updateShape_: function() { for (var i = 0; i < this.arguments_.length; i++) { - var input = this.appendValueInput('ARG' + i) - .setAlign(Blockly.ALIGN_RIGHT) - .appendField(this.arguments_[i]); - input.init(); - } - // Add 'with:' if there are parameters. - var input = this.getInput('TOPROW'); - if (input) { + var field = this.getField('ARGNAME' + i); + if (field) { + // Ensure argument name is up to date. + // The argument name field is deterministic based on the mutation, + // no need to fire a change event. + Blockly.Events.disable(); + field.setValue(this.arguments_[i]); + Blockly.Events.enable(); + } else { + // Add new input. + field = new Blockly.FieldLabel(this.arguments_[i]); + var input = this.appendValueInput('ARG' + i) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(field, 'ARGNAME' + i); + input.init(); + } + } + // Remove deleted inputs. + while (this.getInput('ARG' + i)) { + this.removeInput('ARG' + i); + i++; + } + // Add 'with:' if there are parameters, remove otherwise. + var topRow = this.getInput('TOPROW'); + if (topRow) { if (this.arguments_.length) { if (!this.getField('WITH')) { - input.appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS, 'WITH'); - input.init(); + topRow.appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS, 'WITH'); + topRow.init(); } } else { if (this.getField('WITH')) { - input.removeField('WITH'); + topRow.removeField('WITH'); } } } @@ -616,25 +642,16 @@ Blockly.Blocks['procedures_callnoreturn'] = { */ domToMutation: function(xmlElement) { var name = xmlElement.getAttribute('name'); - this.setFieldValue(name, 'NAME'); - this.setTooltip( - (this.outputConnection ? Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP : - Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP).replace('%1', name)); - var def = Blockly.Procedures.getDefinition(name, this.workspace); - if (def && def.mutator && def.mutator.isVisible()) { - // Initialize caller with the mutator's IDs. - this.setProcedureParameters(def.arguments_, def.paramIds_); - } else { - var args = []; - for (var i = 0, childNode; childNode = xmlElement.childNodes[i]; i++) { - if (childNode.nodeName.toLowerCase() == 'arg') { - args.push(childNode.getAttribute('name')); - } + this.renameProcedure(this.getProcedureCall(), name); + var args = []; + var paramIds = []; + for (var i = 0, childNode; childNode = xmlElement.childNodes[i]; i++) { + if (childNode.nodeName.toLowerCase() == 'arg') { + args.push(childNode.getAttribute('name')); + paramIds.push(childNode.getAttribute('paramId')); } - // For the second argument (paramIds) use the arguments list as a dummy - // list. - this.setProcedureParameters(args, args); } + this.setProcedureParameters_(args, paramIds); }, /** * Notification that a variable is renaming. @@ -647,7 +664,7 @@ Blockly.Blocks['procedures_callnoreturn'] = { for (var i = 0; i < this.arguments_.length; i++) { if (Blockly.Names.equals(oldName, this.arguments_[i])) { this.arguments_[i] = newName; - this.getInput('ARG' + i).fieldRow[0].setText(newName); + this.getField('ARGNAME' + i).setValue(newName); } } }, @@ -683,13 +700,13 @@ Blockly.Blocks['procedures_callreturn'] = { this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL); this.arguments_ = []; this.quarkConnections_ = {}; - this.quarkArguments_ = null; + this.quarkIds_ = null; }, getProcedureCall: Blockly.Blocks['procedures_callnoreturn'].getProcedureCall, renameProcedure: Blockly.Blocks['procedures_callnoreturn'].renameProcedure, - setProcedureParameters: - Blockly.Blocks['procedures_callnoreturn'].setProcedureParameters, - renderArgs_: Blockly.Blocks['procedures_callnoreturn'].renderArgs_, + 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, @@ -742,15 +759,15 @@ Blockly.Blocks['procedures_ifreturn'] = { /** * 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() { + onchange: function(e) { var legal = false; // Is the block nested in a procedure? var block = this; do { - if (block.type == 'procedures_defnoreturn' || - block.type == 'procedures_defreturn') { + if (this.FUNCTION_TYPES.indexOf(block.type) != -1) { legal = true; break; } @@ -774,5 +791,11 @@ Blockly.Blocks['procedures_ifreturn'] = { } else { this.setWarningText(Blockly.Msg.PROCEDURES_IFRETURN_WARNING); } - } + }, + /** + * 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: ['procedures_defnoreturn', 'procedures_defreturn'] }; diff --git a/blocks/text.js b/blocks/text.js index 4d85c974c5..6a4bf87c65 100644 --- a/blocks/text.js +++ b/blocks/text.js @@ -28,11 +28,13 @@ goog.provide('Blockly.Blocks.texts'); goog.require('Blockly.Blocks'); +goog.require('Blockly.Colours'); + /** * Common HSV hue for all blocks in this category. */ -Blockly.Blocks.texts.HUE = 160; +Blockly.Blocks.texts.HUE = Blockly.Colours.textField; Blockly.Blocks['text'] = { /** @@ -43,11 +45,16 @@ Blockly.Blocks['text'] = { this.setHelpUrl(Blockly.Msg.TEXT_TEXT_HELPURL); this.setColour(Blockly.Blocks.texts.HUE); this.appendDummyInput() - .appendField(this.newQuote_(true)) - .appendField(new Blockly.FieldTextInput(''), 'TEXT') - .appendField(this.newQuote_(false)); + .appendField(new Blockly.FieldTextInput(''), 'TEXT'); this.setOutput(true, 'String'); - this.setTooltip(Blockly.Msg.TEXT_TEXT_TOOLTIP); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + // Text block is trivial. Use tooltip of parent block if it exists. + this.setTooltip(function() { + var parent = thisBlock.getParent(); + return (parent && parent.getInputsInline() && parent.tooltip) || + Blockly.Msg.TEXT_TEXT_TOOLTIP; + }); }, /** * Create an image of an open or closed quote. @@ -131,13 +138,18 @@ Blockly.Blocks['text_join'] = { 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('ADD' + i).connection.targetConnection; + if (connection && connections.indexOf(connection) == -1) { + connection.disconnect(); + } + } this.itemCount_ = connections.length; this.updateShape_(); // Reconnect any child blocks. for (var i = 0; i < this.itemCount_; i++) { - if (connections[i]) { - this.getInput('ADD' + i).connection.connect(connections[i]); - } + Blockly.Mutator.reconnect(connections[i], this, 'ADD' + i); } }, /** @@ -162,29 +174,27 @@ Blockly.Blocks['text_join'] = { * @this Blockly.Block */ updateShape_: function() { - // Delete everything. - if (this.getInput('EMPTY')) { + if (this.itemCount_ && this.getInput('EMPTY')) { this.removeInput('EMPTY'); - } else { - var i = 0; - while (this.getInput('ADD' + i)) { - this.removeInput('ADD' + i); - i++; - } - } - // Rebuild block. - if (this.itemCount_ == 0) { + } else if (!this.itemCount_ && !this.getInput('EMPTY')) { this.appendDummyInput('EMPTY') .appendField(this.newQuote_(true)) .appendField(this.newQuote_(false)); - } else { - for (var i = 0; i < this.itemCount_; i++) { + } + // Add new inputs. + for (var i = 0; i < this.itemCount_; i++) { + if (!this.getInput('ADD' + i)) { var input = this.appendValueInput('ADD' + i); if (i == 0) { input.appendField(Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH); } } } + // Remove deleted inputs. + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } }, newQuote_: Blockly.Blocks['text'].newQuote_ }; @@ -241,26 +251,6 @@ Blockly.Blocks['text_append'] = { return Blockly.Msg.TEXT_APPEND_TOOLTIP.replace('%1', thisBlock.getFieldValue('VAR')); }); - }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } } }; @@ -622,11 +612,7 @@ Blockly.Blocks['text_prompt_ext'] = { * @this Blockly.Block */ updateType_: function(newOp) { - if (newOp == 'NUMBER') { - this.outputConnection.setCheck('Number'); - } else { - this.outputConnection.setCheck('String'); - } + this.outputConnection.setCheck(newOp == 'NUMBER' ? 'Number' : 'String'); }, /** * Create XML to represent the output type. @@ -667,9 +653,7 @@ Blockly.Blocks['text_prompt'] = { }); this.appendDummyInput() .appendField(dropdown, 'TYPE') - .appendField(this.newQuote_(true)) - .appendField(new Blockly.FieldTextInput(''), 'TEXT') - .appendField(this.newQuote_(false)); + .appendField(new Blockly.FieldTextInput(''), 'TEXT'); this.setOutput(true, 'String'); // Assign 'this' to a variable for use in the tooltip closure below. var thisBlock = this; @@ -679,7 +663,6 @@ Blockly.Blocks['text_prompt'] = { 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 diff --git a/blocks/variables.js b/blocks/variables.js index 5aab716eba..3b7d99f929 100644 --- a/blocks/variables.js +++ b/blocks/variables.js @@ -49,26 +49,6 @@ Blockly.Blocks['variables_get'] = { this.setTooltip(Blockly.Msg.VARIABLES_GET_TOOLTIP); this.contextMenuMsg_ = Blockly.Msg.VARIABLES_GET_CREATE_SET; }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - }, contextMenuType_: 'variables_set', /** * Add menu option to create getter/setter block for this setter/getter. @@ -115,26 +95,6 @@ Blockly.Blocks['variables_set'] = { }); this.contextMenuMsg_ = Blockly.Msg.VARIABLES_SET_CREATE_GET; }, - /** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @this Blockly.Block - */ - getVars: function() { - return [this.getFieldValue('VAR')]; - }, - /** - * Notification that a variable is renaming. - * If the name matches one of this block's variables, rename it. - * @param {string} oldName Previous name of variable. - * @param {string} newName Renamed variable. - * @this Blockly.Block - */ - renameVar: function(oldName, newName) { - if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { - this.setFieldValue(newName, 'VAR'); - } - }, contextMenuType_: 'variables_get', customContextMenu: Blockly.Blocks['variables_get'].customContextMenu }; diff --git a/blocks_compressed.js b/blocks_compressed.js index 405c811547..8f70577f22 100644 --- a/blocks_compressed.js +++ b/blocks_compressed.js @@ -3,16 +3,12 @@ // 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,tooltip:Blockly.Msg.COLOUR_PICKER_TOOLTIP,helpUrl:Blockly.Msg.COLOUR_PICKER_HELPURL})}}; -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={};Blockly.Blocks.lists.HUE=260;Blockly.Blocks.lists_create_empty={init:function(){this.jsonInit({message0:Blockly.Msg.LISTS_CREATE_EMPTY_TITLE,output:"Array",colour:Blockly.Blocks.lists.HUE,tooltip:Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP,helpUrl:Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL})}}; Blockly.Blocks.lists_create_with={init:function(){this.setHelpUrl(Blockly.Msg.LISTS_CREATE_WITH_HELPURL);this.setColour(Blockly.Blocks.lists.HUE);this.itemCount_=3;this.updateShape_();this.setOutput(!0,"Array");this.setMutator(new Blockly.Mutator(["lists_create_with_item"]));this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP)},mutationToDom:function(){var a=document.createElement("mutation");a.setAttribute("items",this.itemCount_);return a},domToMutation:function(a){this.itemCount_=parseInt(a.getAttribute("items"), -10);this.updateShape_()},decompose:function(a){var b=a.newBlock("lists_create_with_container");b.initSvg();for(var c=b.getInput("STACK").connection,d=0;d","LT"],["\u2265","LTE"],["<","GT"],["\u2264","GTE"]]:[["=","EQ"],["\u2260","NEQ"],["<","LT"],["\u2264","LTE"],[">","GT"],["\u2265","GTE"]];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 b=this;this.setTooltip(function(){var a= -b.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(){var a=this.getInputTargetBlock("A"),b=this.getInputTargetBlock("B");if(a&&b&&!a.outputConnection.checkType_(b.outputConnection))for(var c=0;cd;d++){var e=1==d?a:b;e&&!e.outputConnection.checkType_(c)&&(c===this.prevParentConnection_?(this.setParent(null),c.sourceBlock_.bumpNeighbours_()):(e.setParent(null),e.bumpNeighbours_()))}this.prevParentConnection_=c}};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_input",name:"TIMES",text:"10"}],previousStatement:null,nextStatement:null,colour:Blockly.Blocks.loops.HUE,tooltip:Blockly.Msg.CONTROLS_REPEAT_TOOLTIP,helpUrl:Blockly.Msg.CONTROLS_REPEAT_HELPURL});this.appendStatementInput("DO").appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);this.getField("TIMES").setChangeHandler(Blockly.FieldTextInput.nonnegativeIntegerValidator)}}; -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"))})},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(a,b){Blockly.Names.equals(a,this.getFieldValue("VAR"))&&this.setFieldValue(b,"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"))})},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(a,b){Blockly.Names.equals(a,this.getFieldValue("VAR"))&&this.setFieldValue(b,"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(){var a=!1,b=this;do{if("controls_repeat"==b.type||"controls_repeat_ext"==b.type||"controls_forEach"==b.type||"controls_for"==b.type||"controls_whileUntil"==b.type){a=!0;break}b=b.getSurroundParent()}while(b);a?this.setWarningText(null):this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING)}};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.FieldTextInput("0",Blockly.FieldTextInput.numberValidator),"NUM");this.setOutput(!0,"Number");this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP)}}; -Blockly.Blocks.math_arithmetic={init:function(){var a=[[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"]];this.setHelpUrl(Blockly.Msg.MATH_ARITHMETIC_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendValueInput("A").setCheck("Number");this.appendValueInput("B").setCheck("Number").appendField(new Blockly.FieldDropdown(a), -"OP");this.setInputsInline(!0);var b=this;this.setTooltip(function(){var a=b.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}[a]})}}; -Blockly.Blocks.math_single={init:function(){var a=[[Blockly.Msg.MATH_SINGLE_OP_ROOT,"ROOT"],[Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE,"ABS"],["-","NEG"],["ln","LN"],["log10","LOG10"],["e^","EXP"],["10^","POW10"]];this.setHelpUrl(Blockly.Msg.MATH_SINGLE_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendValueInput("NUM").setCheck("Number").appendField(new Blockly.FieldDropdown(a),"OP");var b=this;this.setTooltip(function(){var a=b.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}[a]})}}; -Blockly.Blocks.math_trig={init:function(){var a=[[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"]];this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendValueInput("NUM").setCheck("Number").appendField(new Blockly.FieldDropdown(a),"OP");var b=this;this.setTooltip(function(){var a= -b.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}[a]})}}; -Blockly.Blocks.math_constant={init:function(){this.setHelpUrl(Blockly.Msg.MATH_CONSTANT_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendDummyInput().appendField(new Blockly.FieldDropdown([["\u03c0","PI"],["e","E"],["\u03c6","GOLDEN_RATIO"],["sqrt(2)","SQRT2"],["sqrt(\u00bd)","SQRT1_2"],["\u221e","INFINITY"]]),"CONSTANT");this.setTooltip(Blockly.Msg.MATH_CONSTANT_TOOLTIP)}}; +this.getFieldValue("MODE"));return a},domToMutation:function(a){this.updateType_(a.getAttribute("mode"))}};/* + + Visual Blocks Editor + + Copyright 2016 Massachusetts Institute of Technology + All rights reserved. + + 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. +*/ +Blockly.Colours={motion:{primary:"#4C97FF",secondary:"#4280D7",tertiary:"#3373CC"},looks:{primary:"#9966FF",secondary:"#855CD6",tertiary:"#774DCB"},sounds:{primary:"#D65CD6",secondary:"#BF40BF",tertiary:"#A63FA6"},control:{primary:"#FFAB19",secondary:"#EC9C13",tertiary:"#CF8B17"},event:{primary:"#FFD500",secondary:"#DBC200",tertiary:"#CCAA00"},text:"#575E75",workspace:"#F5F8FF",toolbox:"#DDDDDD",toolboxText:"#000000",flyout:"#DDDDDD",scrollbar:"#CCCCCC",scrollbarHover:"#BBBBBB",textField:"#FFFFFF", +insertionMarker:"#949494",insertionMarkerOpacity:.6,dragShadowOpacity:.3,stackGlow:"#FFF200",stackGlowOpacity:1,fieldShadow:"rgba(0,0,0,0.1)",dropDownShadow:"rgba(0, 0, 0, .3)",numPadBackground:"#547AB2",numPadBorder:"#435F91",numPadActiveBackground:"#435F91",numPadText:"#FFFFFF"};Blockly.Blocks.math={};Blockly.Blocks.math.HUE=Blockly.Colours.textField;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",Blockly.FieldTextInput.numberValidator,20,-Infinity,Infinity),"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_whole_number={init:function(){this.setHelpUrl(Blockly.Msg.MATH_NUMBER_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.appendDummyInput().appendField(new Blockly.FieldNumber("0",Blockly.FieldNumber.numberValidator,0,0,Infinity),"NUM");this.setOutput(!0,"Number")}}; +Blockly.Blocks.math_positive_number={init:function(){this.setHelpUrl(Blockly.Msg.MATH_NUMBER_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.appendDummyInput().appendField(new Blockly.FieldNumber("0",Blockly.FieldNumber.numberValidator,20,0,Infinity),"NUM");this.setOutput(!0,"Number")}}; +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"))})},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(a, -b){Blockly.Names.equals(a,this.getFieldValue("VAR"))&&this.setFieldValue(b,"VAR")}}; -Blockly.Blocks.math_round={init:function(){var a=[[Blockly.Msg.MATH_ROUND_OPERATOR_ROUND,"ROUND"],[Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP,"ROUNDUP"],[Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN,"ROUNDDOWN"]];this.setHelpUrl(Blockly.Msg.MATH_ROUND_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendValueInput("NUM").setCheck("Number").appendField(new Blockly.FieldDropdown(a),"OP");this.setTooltip(Blockly.Msg.MATH_ROUND_TOOLTIP)}}; +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.setHelpUrl(Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL);this.setColour(Blockly.Blocks.math.HUE);this.setOutput(!0,"Number");this.appendDummyInput().appendField(Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM);this.setTooltip(Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP)}};Blockly.Blocks.procedures={};Blockly.Blocks.procedures.HUE=290; +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.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};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.procedures={};Blockly.Blocks.procedures.HUE=290; Blockly.Blocks.procedures_defnoreturn={init:function(){var a=new Blockly.FieldTextInput(Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE,Blockly.Procedures.rename);a.setSpellcheck(!1);this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE).appendField(a,"NAME").appendField("","PARAMS");this.setMutator(new Blockly.Mutator(["procedures_mutatorarg"]));Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT&&this.setCommentText(Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT);this.setColour(Blockly.Blocks.procedures.HUE); this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP);this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL);this.arguments_=[];this.setStatements_(!0);this.statementConnection_=null},validate:function(){var a=Blockly.Procedures.findLegalName(this.getFieldValue("NAME"),this);this.setFieldValue(a,"NAME")},setStatements_:function(a){this.hasStatements_!==a&&(a?(this.appendStatementInput("STACK").appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK", -"RETURN")):this.removeInput("STACK",!0),this.hasStatements_=a)},updateParams_:function(){for(var a=!1,b={},c=0;c","LT"],["\u2265","LTE"],["<","GT"],["\u2264","GTE"]]:[["=","EQ"],["\u2260","NEQ"],["<","LT"],["\u2264","LTE"],[">","GT"],["\u2265","GTE"]];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 b=this;this.setTooltip(function(){var a= +b.getFieldValue("OP");return{EQ:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ,NEQ:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ,LT:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT,LTE:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE,GT:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT,GTE:Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE}[a]});this.prevBlocks_=[null,null]},onchange:function(a){var b=this.getInputTargetBlock("A"),c=this.getInputTargetBlock("B");if(b&&c&&!b.outputConnection.checkType_(c.outputConnection)){Blockly.Events.setGroup(a.group);for(a=0;a< +this.prevBlocks_.length;a++){var d=this.prevBlocks_[a];if(d===b||d===c)d.unplug(),d.bumpNeighbours_()}Blockly.Events.setGroup(!1)}this.prevBlocks_[0]=b;this.prevBlocks_[1]=c}}; +Blockly.Blocks.logic_operation={init:function(){var a=[[Blockly.Msg.LOGIC_OPERATION_AND,"AND"],[Blockly.Msg.LOGIC_OPERATION_OR,"OR"]];this.setHelpUrl(Blockly.Msg.LOGIC_OPERATION_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.setOutput(!0,"Boolean");this.appendValueInput("A").setCheck("Boolean");this.appendValueInput("B").setCheck("Boolean").appendField(new Blockly.FieldDropdown(a),"OP");this.setInputsInline(!0);var b=this;this.setTooltip(function(){var a=b.getFieldValue("OP");return{AND:Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND, +OR:Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR}[a]})}};Blockly.Blocks.logic_negate={init:function(){this.jsonInit({message0:Blockly.Msg.LOGIC_NEGATE_TITLE,args0:[{type:"input_value",name:"BOOL",check:"Boolean"}],output:"Boolean",colour:Blockly.Blocks.logic.HUE,tooltip:Blockly.Msg.LOGIC_NEGATE_TOOLTIP,helpUrl:Blockly.Msg.LOGIC_NEGATE_HELPURL})}}; +Blockly.Blocks.logic_boolean={init:function(){this.jsonInit({message0:"%1",args0:[{type:"field_dropdown",name:"BOOL",options:[[Blockly.Msg.LOGIC_BOOLEAN_TRUE,"TRUE"],[Blockly.Msg.LOGIC_BOOLEAN_FALSE,"FALSE"]]}],output:"Boolean",colour:Blockly.Blocks.logic.HUE,tooltip:Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP,helpUrl:Blockly.Msg.LOGIC_BOOLEAN_HELPURL})}}; +Blockly.Blocks.logic_null={init:function(){this.jsonInit({message0:Blockly.Msg.LOGIC_NULL,output:null,colour:Blockly.Blocks.logic.HUE,tooltip:Blockly.Msg.LOGIC_NULL_TOOLTIP,helpUrl:Blockly.Msg.LOGIC_NULL_HELPURL})}}; +Blockly.Blocks.logic_ternary={init:function(){this.setHelpUrl(Blockly.Msg.LOGIC_TERNARY_HELPURL);this.setColour(Blockly.Blocks.logic.HUE);this.appendValueInput("IF").setCheck("Boolean").appendField(Blockly.Msg.LOGIC_TERNARY_CONDITION);this.appendValueInput("THEN").appendField(Blockly.Msg.LOGIC_TERNARY_IF_TRUE);this.appendValueInput("ELSE").appendField(Blockly.Msg.LOGIC_TERNARY_IF_FALSE);this.setOutput(!0);this.setTooltip(Blockly.Msg.LOGIC_TERNARY_TOOLTIP);this.prevParentConnection_=null},onchange:function(a){var b= +this.getInputTargetBlock("THEN"),c=this.getInputTargetBlock("ELSE"),d=this.outputConnection.targetConnection;if((b||c)&&d)for(var e=0;2>e;e++){var f=1==e?b:c;f&&!f.outputConnection.checkType_(d)&&(Blockly.Events.setGroup(a.group),d===this.prevParentConnection_?(this.unplug(),d.getSourceBlock().bumpNeighbours_()):(f.unplug(),f.bumpNeighbours_()),Blockly.Events.setGroup(!1))}this.prevParentConnection_=d}}; \ No newline at end of file diff --git a/blocks_compressed_horizontal.js b/blocks_compressed_horizontal.js new file mode 100644 index 0000000000..adcd2982c8 --- /dev/null +++ b/blocks_compressed_horizontal.js @@ -0,0 +1,49 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + +/* + + Visual Blocks Editor + + Copyright 2016 Massachusetts Institute of Technology + All rights reserved. + + 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. +*/ +Blockly.Colours={motion:{primary:"#4C97FF",secondary:"#4280D7",tertiary:"#3373CC"},looks:{primary:"#9966FF",secondary:"#855CD6",tertiary:"#774DCB"},sounds:{primary:"#D65CD6",secondary:"#BF40BF",tertiary:"#A63FA6"},control:{primary:"#FFAB19",secondary:"#EC9C13",tertiary:"#CF8B17"},event:{primary:"#FFD500",secondary:"#DBC200",tertiary:"#CCAA00"},text:"#575E75",workspace:"#F5F8FF",toolbox:"#DDDDDD",toolboxText:"#000000",flyout:"#DDDDDD",scrollbar:"#CCCCCC",scrollbarHover:"#BBBBBB",textField:"#FFFFFF", +insertionMarker:"#949494",insertionMarkerOpacity:.6,dragShadowOpacity:.3,stackGlow:"#FFF200",stackGlowOpacity:1,fieldShadow:"rgba(0,0,0,0.1)",dropDownShadow:"rgba(0, 0, 0, .3)",numPadBackground:"#547AB2",numPadBorder:"#435F91",numPadActiveBackground:"#435F91",numPadText:"#FFFFFF"};Blockly.Blocks.event={};Blockly.Blocks.event_whenflagclicked={init:function(){this.jsonInit({id:"event_whenflagclicked",message0:"%1",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_whenflagclicked.svg",width:40,height:40,alt:"When green flag clicked",flip_rtl:!0}],inputsInline:!0,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}}; +Blockly.Blocks.dropdown_whenbroadcast={init:function(){this.appendDummyInput().appendField(new Blockly.FieldIconMenu([{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_when-broadcast-received_blue.svg",value:"blue",width:48,height:48,alt:"Blue"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_when-broadcast-received_green.svg",value:"green",width:48,height:48,alt:"Green"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_when-broadcast-received_coral.svg",value:"coral", +width:48,height:48,alt:"Coral"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_when-broadcast-received_magenta.svg",value:"magenta",width:48,height:48,alt:"Magenta"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_when-broadcast-received_orange.svg",value:"orange",width:48,height:48,alt:"Orange"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_when-broadcast-received_purple.svg",value:"purple",width:48,height:48,alt:"Purple"}]),"CHOICE");this.setOutput(!0);this.setColour(Blockly.Colours.event.primary, +Blockly.Colours.event.secondary,Blockly.Colours.event.tertiary)}}; +Blockly.Blocks.event_whenbroadcastreceived={init:function(){this.jsonInit({id:"event_whenbroadcastreceived",message0:"%1 %2",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_when-broadcast-received_blue.svg",width:40,height:40,alt:"Broadcast received"},{type:"input_value",name:"CHOICE"}],inputsInline:!0,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}}; +Blockly.Blocks.dropdown_broadcast={init:function(){this.appendDummyInput().appendField(new Blockly.FieldIconMenu([{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_broadcast_blue.svg",value:"blue",width:48,height:48,alt:"Blue"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_broadcast_green.svg",value:"green",width:48,height:48,alt:"Green"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_broadcast_coral.svg",value:"coral",width:48,height:48,alt:"Coral"},{src:Blockly.mainWorkspace.options.pathToMedia+ +"icons/event_broadcast_magenta.svg",value:"magenta",width:48,height:48,alt:"Magenta"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_broadcast_orange.svg",value:"orange",width:48,height:48,alt:"Orange"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_broadcast_purple.svg",value:"purple",width:48,height:48,alt:"Purple"}]),"CHOICE");this.setOutput(!0);this.setColour(Blockly.Colours.event.primary,Blockly.Colours.event.secondary,Blockly.Colours.event.tertiary)}}; +Blockly.Blocks.event_broadcast={init:function(){this.jsonInit({id:"event_broadcast",message0:"%1 %2",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_broadcast_blue.svg",width:40,height:40,alt:"Broadcast"},{type:"input_value",name:"CHOICE"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}};Blockly.Blocks.wedo={}; +Blockly.Blocks.dropdown_wedo_setcolor={init:function(){this.appendDummyInput().appendField(new Blockly.FieldIconMenu([{src:Blockly.mainWorkspace.options.pathToMedia+"icons/set-led_mystery.svg",value:"mystery",width:48,height:48,alt:"Mystery"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/set-led_yellow.svg",value:"yellow",width:48,height:48,alt:"Yellow"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/set-led_orange.svg",value:"orange",width:48,height:48,alt:"Orange"},{src:Blockly.mainWorkspace.options.pathToMedia+ +"icons/set-led_coral.svg",value:"coral",width:48,height:48,alt:"Coral"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/set-led_magenta.svg",value:"magenta",width:48,height:48,alt:"Magenta"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/set-led_purple.svg",value:"purple",width:48,height:48,alt:"Purple"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/set-led_blue.svg",value:"blue",width:48,height:48,alt:"Blue"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/set-led_green.svg", +value:"green",width:48,height:48,alt:"Green"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/set-led_white.svg",value:"white",width:48,height:48,alt:"White"}]),"CHOICE");this.setOutput(!0);this.setColour(Blockly.Colours.looks.primary,Blockly.Colours.looks.secondary,Blockly.Colours.looks.tertiary)}}; +Blockly.Blocks.wedo_setcolor={init:function(){this.jsonInit({id:"wedo_setcolor",message0:"%1 %2",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/set-led_blue.svg",width:40,height:40,alt:"Set LED Color"},{type:"input_value",name:"CHOICE"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.looks.primary,colourSecondary:Blockly.Colours.looks.secondary,colourTertiary:Blockly.Colours.looks.tertiary})}}; +Blockly.Blocks.wedo_motorclockwise={init:function(){this.jsonInit({id:"wedo_motorclockwise",message0:"%1 %2",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_motor-clockwise.svg",width:40,height:40,alt:"Turn motor clockwise"},{type:"input_value",name:"DURATION",check:"Number"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.motion.primary,colourSecondary:Blockly.Colours.motion.secondary,colourTertiary:Blockly.Colours.motion.tertiary})}}; +Blockly.Blocks.wedo_motorcounterclockwise={init:function(){this.jsonInit({id:"wedo_motorcounterclockwise",message0:"%1 %2",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_motor-counterclockwise.svg",width:40,height:40,alt:"Turn motor counter-clockwise"},{type:"input_value",name:"DURATION",check:"Number"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.motion.primary,colourSecondary:Blockly.Colours.motion.secondary,colourTertiary:Blockly.Colours.motion.tertiary})}}; +Blockly.Blocks.dropdown_wedo_motorspeed={init:function(){this.appendDummyInput().appendField(new Blockly.FieldIconMenu([{src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_motor-speed_slow.svg",value:"slow",width:48,height:48,alt:"Slow"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_motor-speed_med.svg",value:"medium",width:48,height:48,alt:"Medium"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_motor-speed_fast.svg",value:"fast",width:48,height:48,alt:"Fast"}]),"CHOICE"); +this.setOutput(!0);this.setColour(Blockly.Colours.motion.primary,Blockly.Colours.motion.secondary,Blockly.Colours.motion.tertiary)}}; +Blockly.Blocks.wedo_motorspeed={init:function(){this.jsonInit({id:"wedo_motorspeed",message0:"%1 %2",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_motor-speed_fast.svg",width:40,height:40,alt:"Motor Speed"},{type:"input_value",name:"CHOICE"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.motion.primary,colourSecondary:Blockly.Colours.motion.secondary,colourTertiary:Blockly.Colours.motion.tertiary})}}; +Blockly.Blocks.dropdown_wedo_whentilt={init:function(){this.appendDummyInput().appendField(new Blockly.FieldIconMenu([{type:"placeholder",width:48,height:48},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_when-tilt-forward.svg",value:"forward",width:48,height:48,alt:"Tilt forward"},{type:"placeholder",width:48,height:48},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_when-tilt-left.svg",value:"left",width:48,height:48,alt:"Tilt left"},{src:Blockly.mainWorkspace.options.pathToMedia+ +"icons/wedo_when-tilt.svg",value:"any",width:48,height:48,alt:"Tilt any"},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_when-tilt-right.svg",value:"right",width:48,height:48,alt:"Tilt right"},{type:"placeholder",width:48,height:48},{src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_when-tilt-backward.svg",value:"backward",width:48,height:48,alt:"Tilt backward"}]),"CHOICE");this.setOutput(!0);this.setColour(Blockly.Colours.event.primary,Blockly.Colours.event.secondary,Blockly.Colours.event.tertiary)}}; +Blockly.Blocks.wedo_whentilt={init:function(){this.jsonInit({id:"wedo_whentilt",message0:"%1 %2",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_when-tilt.svg",width:40,height:40,alt:"When tilted"},{type:"input_value",name:"CHOICE"}],inputsInline:!0,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}}; +Blockly.Blocks.wedo_whendistanceclose={init:function(){this.jsonInit({id:"wedo_whendistanceclose",message0:"%1",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/wedo_when-distance_close.svg",width:40,height:40,alt:"When distance close"}],inputsInline:!0,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}};Blockly.Blocks.control={}; +Blockly.Blocks.control_repeat={init:function(){this.jsonInit({id:"control_repeat",message0:"%1 %2 %3",args0:[{type:"input_statement",name:"SUBSTACK"},{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/control_repeat.svg",width:40,height:40,alt:"*",flip_rtl:!0},{type:"input_value",name:"TIMES",check:"Number"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.control.primary,colourSecondary:Blockly.Colours.control.secondary,colourTertiary:Blockly.Colours.control.tertiary})}}; +Blockly.Blocks.control_forever={init:function(){this.jsonInit({id:"control_forever",message0:"%1 %2",args0:[{type:"input_statement",name:"SUBSTACK"},{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/control_forever.svg",width:40,height:40,alt:"*",flip_rtl:!0}],inputsInline:!0,previousStatement:null,colour:Blockly.Colours.control.primary,colourSecondary:Blockly.Colours.control.secondary,colourTertiary:Blockly.Colours.control.tertiary})}}; +Blockly.Blocks.control_repeat={init:function(){this.jsonInit({id:"control_repeat",message0:"%1 %2 %3",args0:[{type:"input_statement",name:"SUBSTACK"},{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/control_repeat.svg",width:40,height:40,alt:"*",flip_rtl:!0},{type:"input_value",name:"TIMES",check:"Number"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.control.primary,colourSecondary:Blockly.Colours.control.secondary,colourTertiary:Blockly.Colours.control.tertiary})}}; +Blockly.Blocks.control_stop={init:function(){this.jsonInit({id:"control_stop",message0:"%1",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/control_stop.svg",width:40,height:40,alt:"Stop"}],inputsInline:!0,previousStatement:null,colour:Blockly.Colours.control.primary,colourSecondary:Blockly.Colours.control.secondary,colourTertiary:Blockly.Colours.control.tertiary})}}; +Blockly.Blocks.control_wait={init:function(){this.jsonInit({id:"control_wait",message0:"%1 %2",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/control_wait.svg",width:40,height:40,alt:"Wait"},{type:"input_value",name:"DURATION",check:"Number"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.control.primary,colourSecondary:Blockly.Colours.control.secondary,colourTertiary:Blockly.Colours.control.tertiary})}}; \ No newline at end of file diff --git a/blocks_compressed_vertical.js b/blocks_compressed_vertical.js new file mode 100644 index 0000000000..404ec29c6c --- /dev/null +++ b/blocks_compressed_vertical.js @@ -0,0 +1,35 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + +/* + + Visual Blocks Editor + + Copyright 2016 Massachusetts Institute of Technology + All rights reserved. + + 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. +*/ +Blockly.Colours={motion:{primary:"#4C97FF",secondary:"#4280D7",tertiary:"#3373CC"},looks:{primary:"#9966FF",secondary:"#855CD6",tertiary:"#774DCB"},sounds:{primary:"#D65CD6",secondary:"#BF40BF",tertiary:"#A63FA6"},control:{primary:"#FFAB19",secondary:"#EC9C13",tertiary:"#CF8B17"},event:{primary:"#FFD500",secondary:"#DBC200",tertiary:"#CCAA00"},text:"#575E75",workspace:"#F5F8FF",toolbox:"#DDDDDD",toolboxText:"#000000",flyout:"#DDDDDD",scrollbar:"#CCCCCC",scrollbarHover:"#BBBBBB",textField:"#FFFFFF", +insertionMarker:"#949494",insertionMarkerOpacity:.6,dragShadowOpacity:.3,stackGlow:"#FFF200",stackGlowOpacity:1,fieldShadow:"rgba(0,0,0,0.1)",dropDownShadow:"rgba(0, 0, 0, .3)",numPadBackground:"#547AB2",numPadBorder:"#435F91",numPadActiveBackground:"#435F91",numPadText:"#FFFFFF"};Blockly.Blocks.event={};Blockly.Blocks.event_whenflagclicked={init:function(){this.jsonInit({id:"event_whenflagclicked",message0:"when %1 clicked",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_whenflagclicked.svg",width:20,height:20,alt:"flag",flip_rtl:!0}],inputsInline:!0,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}}; +Blockly.Blocks.event_whenbroadcastreceived={init:function(){this.jsonInit({id:"event_whenbroadcastreceived",message0:"when I receive ...",args0:[],inputsInline:!0,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}}; +Blockly.Blocks.event_broadcast={init:function(){this.jsonInit({id:"event_broadcast",message0:"broadcast ...",args0:[],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}}; +Blockly.Blocks.event_broadcast_text={init:function(){this.jsonInit({id:"event_broadcast",message0:"%1 %2",args0:[{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/event_broadcast.svg",width:40,height:40,alt:"Broadcast"},{type:"input_value",name:"STRING"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}};Blockly.Blocks.wedo={};Blockly.Blocks.wedo_setcolor={init:function(){this.jsonInit({id:"wedo_setcolor",message0:"set color to ...",args0:[],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.looks.primary,colourSecondary:Blockly.Colours.looks.secondary,colourTertiary:Blockly.Colours.looks.tertiary})}}; +Blockly.Blocks.wedo_motorclockwise={init:function(){this.jsonInit({id:"wedo_motorclockwise",message0:"turn motor clockwise for %1 secs",args0:[{type:"input_value",name:"DURATION",check:"Number"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.motion.primary,colourSecondary:Blockly.Colours.motion.secondary,colourTertiary:Blockly.Colours.motion.tertiary})}}; +Blockly.Blocks.wedo_motorcounterclockwise={init:function(){this.jsonInit({id:"wedo_motorcounterclockwise",message0:"turn motor counterclockwise for %1 secs",args0:[{type:"input_value",name:"DURATION",check:"Number"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.motion.primary,colourSecondary:Blockly.Colours.motion.secondary,colourTertiary:Blockly.Colours.motion.tertiary})}}; +Blockly.Blocks.wedo_motorspeed={init:function(){this.jsonInit({id:"wedo_motorspeed",message0:"set motor speed to ...",args0:[],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.motion.primary,colourSecondary:Blockly.Colours.motion.secondary,colourTertiary:Blockly.Colours.motion.tertiary})}}; +Blockly.Blocks.wedo_whentilt={init:function(){this.jsonInit({id:"wedo_whentilt",message0:"when tilted ...",args0:[],inputsInline:!0,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}}; +Blockly.Blocks.wedo_whendistanceclose={init:function(){this.jsonInit({id:"wedo_whendistanceclose",message0:"when distance is near",args0:[],inputsInline:!0,nextStatement:null,colour:Blockly.Colours.event.primary,colourSecondary:Blockly.Colours.event.secondary,colourTertiary:Blockly.Colours.event.tertiary})}};Blockly.Blocks.control={};Blockly.Blocks.control_forever={init:function(){this.jsonInit({id:"control_forever",message0:"forever %1 %2 %3",lastDummyAlign0:"RIGHT",args0:[{type:"input_dummy"},{type:"input_statement",name:"SUBSTACK"},{type:"field_image",src:Blockly.mainWorkspace.options.pathToMedia+"icons/control_forever.svg",width:10,height:10,alt:"*",flip_rtl:!0}],inputsInline:!0,previousStatement:null,colour:Blockly.Colours.control.primary,colourSecondary:Blockly.Colours.control.secondary,colourTertiary:Blockly.Colours.control.tertiary})}}; +Blockly.Blocks.control_repeat={init:function(){this.jsonInit({id:"control_repeat",message0:"repeat %1 times %2 %3",args0:[{type:"input_value",name:"TIMES",check:"Number"},{type:"input_dummy"},{type:"input_statement",name:"SUBSTACK"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.control.primary,colourSecondary:Blockly.Colours.control.secondary,colourTertiary:Blockly.Colours.control.tertiary})}}; +Blockly.Blocks.control_stop={init:function(){this.jsonInit({id:"control_stop",message0:"stop all scripts",args0:[],inputsInline:!0,previousStatement:null,colour:Blockly.Colours.control.primary,colourSecondary:Blockly.Colours.control.secondary,colourTertiary:Blockly.Colours.control.tertiary})}}; +Blockly.Blocks.control_wait={init:function(){this.jsonInit({id:"control_wait",message0:"wait %1 secs",args0:[{type:"input_value",name:"DURATION",check:"Number"}],inputsInline:!0,previousStatement:null,nextStatement:null,colour:Blockly.Colours.control.primary,colourSecondary:Blockly.Colours.control.secondary,colourTertiary:Blockly.Colours.control.tertiary})}}; \ No newline at end of file diff --git a/blocks_horizontal/control.js b/blocks_horizontal/control.js new file mode 100644 index 0000000000..5572d14db0 --- /dev/null +++ b/blocks_horizontal/control.js @@ -0,0 +1,202 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Massachusetts Institute of Technology + * All rights reserved. + * + * 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 Control blocks for Scratch (Horizontal) + * @author ascii@media.mit.edu + */ +'use strict'; + +goog.provide('Blockly.Blocks.control'); + +goog.require('Blockly.Blocks'); + +goog.require('Blockly.Colours'); + +Blockly.Blocks['control_repeat'] = { + /** + * Block for repeat n times (external number). + * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#so57n9 + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "control_repeat", + "message0": "%1 %2 %3", + "args0": [ + { + "type": "input_statement", + "name": "SUBSTACK" + }, + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_repeat.svg", + "width": 40, + "height": 40, + "alt": "*", + "flip_rtl": true + }, + { + "type": "input_value", + "name": "TIMES", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.control.primary, + "colourSecondary": Blockly.Colours.control.secondary, + "colourTertiary": Blockly.Colours.control.tertiary, + }); + } +}; + +Blockly.Blocks['control_forever'] = { + /** + * Block for repeat n times (external number). + * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#5eke39 + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "control_forever", + "message0": "%1 %2", + "args0": [ + { + "type": "input_statement", + "name": "SUBSTACK" + }, + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_forever.svg", + "width": 40, + "height": 40, + "alt": "*", + "flip_rtl": true + } + ], + "inputsInline": true, + "previousStatement": null, + "colour": Blockly.Colours.control.primary, + "colourSecondary": Blockly.Colours.control.secondary, + "colourTertiary": Blockly.Colours.control.tertiary + }); + } +}; + +Blockly.Blocks['control_repeat'] = { + /** + * Block for repeat n times (external number). + * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#so57n9 + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "control_repeat", + "message0": "%1 %2 %3", + "args0": [ + { + "type": "input_statement", + "name": "SUBSTACK" + }, + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_repeat.svg", + "width": 40, + "height": 40, + "alt": "*", + "flip_rtl": true + }, + { + "type": "input_value", + "name": "TIMES", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.control.primary, + "colourSecondary": Blockly.Colours.control.secondary, + "colourTertiary": Blockly.Colours.control.tertiary, + }); + } +}; + +Blockly.Blocks['control_stop'] = { + /** + * Block for stop all scripts. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "control_stop", + "message0": "%1", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_stop.svg", + "width": 40, + "height": 40, + "alt": "Stop" + } + ], + "inputsInline": true, + "previousStatement": null, + "colour": Blockly.Colours.control.primary, + "colourSecondary": Blockly.Colours.control.secondary, + "colourTertiary": Blockly.Colours.control.tertiary + }); + } +}; + +Blockly.Blocks['control_wait'] = { + /** + * Block to wait (pause) stack. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "control_wait", + "message0": "%1 %2", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_wait.svg", + "width": 40, + "height": 40, + "alt": "Wait" + }, + { + "type": "input_value", + "name": "DURATION", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.control.primary, + "colourSecondary": Blockly.Colours.control.secondary, + "colourTertiary": Blockly.Colours.control.tertiary + }); + } +}; diff --git a/blocks_horizontal/event.js b/blocks_horizontal/event.js new file mode 100644 index 0000000000..51768a572a --- /dev/null +++ b/blocks_horizontal/event.js @@ -0,0 +1,180 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Massachusetts Institute of Technology + * All rights reserved. + * + * 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 Control blocks for Scratch (Horizontal) + * @author ascii@media.mit.edu + */ +'use strict'; + +goog.provide('Blockly.Blocks.event'); + +goog.require('Blockly.Blocks'); + +goog.require('Blockly.Colours'); + +Blockly.Blocks['event_whenflagclicked'] = { + /** + * Block for when flag clicked. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "event_whenflagclicked", + "message0": "%1", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/event_whenflagclicked.svg", + "width": 40, + "height": 40, + "alt": "When green flag clicked", + "flip_rtl": true + } + ], + "inputsInline": true, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; + +Blockly.Blocks['dropdown_whenbroadcast'] = { + /** + * Block for when broadcast dropdown (used for shadow). + * @this Blockly.Block + */ + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldIconMenu([ + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_blue.svg', + value: 'blue', width: 48, height: 48, alt: 'Blue'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_green.svg', + value: 'green', width: 48, height: 48, alt: 'Green'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_coral.svg', + value: 'coral', width: 48, height: 48, alt: 'Coral'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_magenta.svg', + value: 'magenta', width: 48, height: 48, alt: 'Magenta'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_orange.svg', + value: 'orange', width: 48, height: 48, alt: 'Orange'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_purple.svg', + value: 'purple', width: 48, height: 48, alt: 'Purple'} + ]), 'CHOICE'); + this.setOutput(true); + this.setColour(Blockly.Colours.event.primary, + Blockly.Colours.event.secondary, + Blockly.Colours.event.tertiary + ); + } +}; + +Blockly.Blocks['event_whenbroadcastreceived'] = { + /** + * Block for when broadcast received. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "event_whenbroadcastreceived", + "message0": "%1 %2", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/event_when-broadcast-received_blue.svg", + "width": 40, + "height": 40, + "alt": "Broadcast received" + }, + { + "type": "input_value", + "name": "CHOICE" + } + ], + "inputsInline": true, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; + +Blockly.Blocks['dropdown_broadcast'] = { + /** + * Block for broadcast dropdown (used for shadow). + * @this Blockly.Block + */ + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldIconMenu([ + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_blue.svg', + value: 'blue', width: 48, height: 48, alt: 'Blue'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_green.svg', + value: 'green', width: 48, height: 48, alt: 'Green'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_coral.svg', + value: 'coral', width: 48, height: 48, alt: 'Coral'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_magenta.svg', + value: 'magenta', width: 48, height: 48, alt: 'Magenta'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_orange.svg', + value: 'orange', width: 48, height: 48, alt: 'Orange'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_purple.svg', + value: 'purple', width: 48, height: 48, alt: 'Purple'} + ]), 'CHOICE'); + this.setOutput(true); + this.setColour(Blockly.Colours.event.primary, + Blockly.Colours.event.secondary, + Blockly.Colours.event.tertiary + ); + } +}; + +Blockly.Blocks['event_broadcast'] = { + /** + * Block to send a broadcast. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "event_broadcast", + "message0": "%1 %2", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/event_broadcast_blue.svg", + "width": 40, + "height": 40, + "alt": "Broadcast" + }, + { + "type": "input_value", + "name": "CHOICE" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; diff --git a/blocks_horizontal/wedo.js b/blocks_horizontal/wedo.js new file mode 100644 index 0000000000..bf03b666ba --- /dev/null +++ b/blocks_horizontal/wedo.js @@ -0,0 +1,307 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Massachusetts Institute of Technology + * All rights reserved. + * + * 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 Wedo blocks for Scratch (Horizontal) + * @author ascii@media.mit.edu + */ +'use strict'; + +goog.provide('Blockly.Blocks.wedo'); + +goog.require('Blockly.Blocks'); + +goog.require('Blockly.Colours'); + +Blockly.Blocks['dropdown_wedo_setcolor'] = { + /** + * Block for set color drop-down (used for shadow). + * @this Blockly.Block + */ + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldIconMenu([ + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_mystery.svg', + value: 'mystery', width: 48, height: 48, alt: 'Mystery'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_yellow.svg', + value: 'yellow', width: 48, height: 48, alt: 'Yellow'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_orange.svg', + value: 'orange', width: 48, height: 48, alt: 'Orange'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_coral.svg', + value: 'coral', width: 48, height: 48, alt: 'Coral'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_magenta.svg', + value: 'magenta', width: 48, height: 48, alt: 'Magenta'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_purple.svg', + value: 'purple', width: 48, height: 48, alt: 'Purple'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_blue.svg', + value: 'blue', width: 48, height: 48, alt: 'Blue'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_green.svg', + value: 'green', width: 48, height: 48, alt: 'Green'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_white.svg', + value: 'white', width: 48, height: 48, alt: 'White'} + ]), 'CHOICE'); + this.setOutput(true); + this.setColour(Blockly.Colours.looks.primary, + Blockly.Colours.looks.secondary, + Blockly.Colours.looks.tertiary + ); + } +}; + +Blockly.Blocks['wedo_setcolor'] = { + /** + * Block to set color of LED + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_setcolor", + "message0": "%1 %2", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/set-led_blue.svg", + "width": 40, + "height": 40, + "alt": "Set LED Color" + }, + { + "type": "input_value", + "name": "CHOICE" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.looks.primary, + "colourSecondary": Blockly.Colours.looks.secondary, + "colourTertiary": Blockly.Colours.looks.tertiary + }); + } +}; + +Blockly.Blocks['wedo_motorclockwise'] = { + /** + * Block to spin motor clockwise. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_motorclockwise", + "message0": "%1 %2", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_motor-clockwise.svg", + "width": 40, + "height": 40, + "alt": "Turn motor clockwise" + }, + { + "type": "input_value", + "name": "DURATION", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.motion.primary, + "colourSecondary": Blockly.Colours.motion.secondary, + "colourTertiary": Blockly.Colours.motion.tertiary + }); + } +}; + +Blockly.Blocks['wedo_motorcounterclockwise'] = { + /** + * Block to spin motor counter-clockwise. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_motorcounterclockwise", + "message0": "%1 %2", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_motor-counterclockwise.svg", + "width": 40, + "height": 40, + "alt": "Turn motor counter-clockwise" + }, + { + "type": "input_value", + "name": "DURATION", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.motion.primary, + "colourSecondary": Blockly.Colours.motion.secondary, + "colourTertiary": Blockly.Colours.motion.tertiary + }); + } +}; + +Blockly.Blocks['dropdown_wedo_motorspeed'] = { + /** + * Block for motor speed drop-down (used for shadow). + * @this Blockly.Block + */ + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldIconMenu([ + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_motor-speed_slow.svg', + value: 'slow', width: 48, height: 48, alt: 'Slow'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_motor-speed_med.svg', + value: 'medium', width: 48, height: 48, alt: 'Medium'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_motor-speed_fast.svg', + value: 'fast', width: 48, height: 48, alt: 'Fast'} + ]), 'CHOICE'); + this.setOutput(true); + this.setColour(Blockly.Colours.motion.primary, + Blockly.Colours.motion.secondary, + Blockly.Colours.motion.tertiary + ); + } +}; + +Blockly.Blocks['wedo_motorspeed'] = { + /** + * Block to set motor speed. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_motorspeed", + "message0": "%1 %2", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_motor-speed_fast.svg", + "width": 40, + "height": 40, + "alt": "Motor Speed" + }, + { + "type": "input_value", + "name": "CHOICE" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.motion.primary, + "colourSecondary": Blockly.Colours.motion.secondary, + "colourTertiary": Blockly.Colours.motion.tertiary + }); + } +}; + +Blockly.Blocks['dropdown_wedo_whentilt'] = { + /** + * Block for when tilt drop-down (used for shadow). + * @this Blockly.Block + */ + init: function() { + this.appendDummyInput() + .appendField(new Blockly.FieldIconMenu([ + {type: 'placeholder', width: 48, height: 48}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt-forward.svg', + value: 'forward', width: 48, height: 48, alt: 'Tilt forward'}, + {type: 'placeholder', width: 48, height: 48}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt-left.svg', + value: 'left', width: 48, height: 48, alt: 'Tilt left'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt.svg', + value: 'any', width: 48, height: 48, alt: 'Tilt any'}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt-right.svg', + value: 'right', width: 48, height: 48, alt: 'Tilt right'}, + {type: 'placeholder', width: 48, height: 48}, + {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt-backward.svg', + value: 'backward', width: 48, height: 48, alt: 'Tilt backward'} + ]), 'CHOICE'); + this.setOutput(true); + this.setColour(Blockly.Colours.event.primary, + Blockly.Colours.event.secondary, + Blockly.Colours.event.tertiary + ); + } +}; + +Blockly.Blocks['wedo_whentilt'] = { + /** + * Block for when tilted. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_whentilt", + "message0": "%1 %2", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_when-tilt.svg", + "width": 40, + "height": 40, + "alt": "When tilted" + }, + { + "type": "input_value", + "name": "CHOICE" + } + ], + "inputsInline": true, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; + +Blockly.Blocks['wedo_whendistanceclose'] = { + /** + * Block for when distance sensor is close. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_whendistanceclose", + "message0": "%1", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_when-distance_close.svg", + "width": 40, + "height": 40, + "alt": "When distance close" + } + ], + "inputsInline": true, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; diff --git a/blocks_vertical/control.js b/blocks_vertical/control.js new file mode 100644 index 0000000000..a944e598a5 --- /dev/null +++ b/blocks_vertical/control.js @@ -0,0 +1,128 @@ +/** + * @fileoverview Control blocks for Scratch (Horizontal) + * @author ascii@media.mit.edu + */ +'use strict'; + +goog.provide('Blockly.Blocks.control'); + +goog.require('Blockly.Blocks'); + +goog.require('Blockly.Colours'); + +Blockly.Blocks['control_forever'] = { + /** + * Block for repeat n times (external number). + * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#5eke39 + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "control_forever", + "message0": "forever %1 %2 %3", + "lastDummyAlign0": "RIGHT", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "SUBSTACK" + }, + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_forever.svg", + "width": 10, + "height": 10, + "alt": "*", + "flip_rtl": true + } + ], + "inputsInline": true, + "previousStatement": null, + "colour": Blockly.Colours.control.primary, + "colourSecondary": Blockly.Colours.control.secondary, + "colourTertiary": Blockly.Colours.control.tertiary + }); + } +}; + +Blockly.Blocks['control_repeat'] = { + /** + * Block for repeat n times (external number). + * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#so57n9 + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "control_repeat", + "message0": "repeat %1 times %2 %3", + "args0": [ + { + "type": "input_value", + "name": "TIMES", + "check": "Number" + }, + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "SUBSTACK" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.control.primary, + "colourSecondary": Blockly.Colours.control.secondary, + "colourTertiary": Blockly.Colours.control.tertiary + }); + } +}; + +Blockly.Blocks['control_stop'] = { + /** + * Block for stop all scripts. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "control_stop", + "message0": "stop all scripts", + "args0": [ + ], + "inputsInline": true, + "previousStatement": null, + "colour": Blockly.Colours.control.primary, + "colourSecondary": Blockly.Colours.control.secondary, + "colourTertiary": Blockly.Colours.control.tertiary + }); + } +}; + +Blockly.Blocks['control_wait'] = { + /** + * Block to wait (pause) stack. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "control_wait", + "message0": "wait %1 secs", + "args0": [ + { + "type": "input_value", + "name": "DURATION", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.control.primary, + "colourSecondary": Blockly.Colours.control.secondary, + "colourTertiary": Blockly.Colours.control.tertiary + }); + } +}; diff --git a/blocks_vertical/event.js b/blocks_vertical/event.js new file mode 100644 index 0000000000..84b22f593f --- /dev/null +++ b/blocks_vertical/event.js @@ -0,0 +1,112 @@ +/** + * @fileoverview Control blocks for Scratch (Horizontal) + * @author ascii@media.mit.edu + */ +'use strict'; + +goog.provide('Blockly.Blocks.event'); + +goog.require('Blockly.Blocks'); + +goog.require('Blockly.Colours'); + +Blockly.Blocks['event_whenflagclicked'] = { + /** + * Block for when flag clicked. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "event_whenflagclicked", + "message0": "when %1 clicked", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/event_whenflagclicked.svg", + "width": 20, + "height": 20, + "alt": "flag", + "flip_rtl": true + } + ], + "inputsInline": true, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; + +Blockly.Blocks['event_whenbroadcastreceived'] = { + /** + * Block for when broadcast received. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "event_whenbroadcastreceived", + "message0": "when I receive ...", + "args0": [ + ], + "inputsInline": true, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; + +Blockly.Blocks['event_broadcast'] = { + /** + * Block to send a broadcast. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "event_broadcast", + "message0": "broadcast ...", + "args0": [ + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; + +Blockly.Blocks['event_broadcast_text'] = { + /** + * Block to send a broadcast, with a text-box for testing fields. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "event_broadcast", + "message0": "%1 %2", + "args0": [ + { + "type": "field_image", + "src": Blockly.mainWorkspace.options.pathToMedia + "icons/event_broadcast.svg", + "width": 40, + "height": 40, + "alt": "Broadcast" + }, + { + "type": "input_value", + "name": "STRING" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; diff --git a/blocks_vertical/wedo.js b/blocks_vertical/wedo.js new file mode 100644 index 0000000000..ba56184c06 --- /dev/null +++ b/blocks_vertical/wedo.js @@ -0,0 +1,145 @@ +/** + * @fileoverview Wedo blocks for Scratch (Horizontal) + * @author ascii@media.mit.edu + */ +'use strict'; + +goog.provide('Blockly.Blocks.wedo'); + +goog.require('Blockly.Blocks'); + +goog.require('Blockly.Colours'); + +Blockly.Blocks['wedo_setcolor'] = { + /** + * Block to set color of LED + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_setcolor", + "message0": "set color to ...", + "args0": [ + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.looks.primary, + "colourSecondary": Blockly.Colours.looks.secondary, + "colourTertiary": Blockly.Colours.looks.tertiary + }); + } +}; + +Blockly.Blocks['wedo_motorclockwise'] = { + /** + * Block to spin motor clockwise. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_motorclockwise", + "message0": "turn motor clockwise for %1 secs", + "args0": [ + { + "type": "input_value", + "name": "DURATION", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.motion.primary, + "colourSecondary": Blockly.Colours.motion.secondary, + "colourTertiary": Blockly.Colours.motion.tertiary + }); + } +}; + +Blockly.Blocks['wedo_motorcounterclockwise'] = { + /** + * Block to spin motor counter-clockwise. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_motorcounterclockwise", + "message0": "turn motor counterclockwise for %1 secs", + "args0": [ + { + "type": "input_value", + "name": "DURATION", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.motion.primary, + "colourSecondary": Blockly.Colours.motion.secondary, + "colourTertiary": Blockly.Colours.motion.tertiary + }); + } +}; + +Blockly.Blocks['wedo_motorspeed'] = { + /** + * Block to set motor speed. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_motorspeed", + "message0": "set motor speed to ...", + "args0": [ + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": Blockly.Colours.motion.primary, + "colourSecondary": Blockly.Colours.motion.secondary, + "colourTertiary": Blockly.Colours.motion.tertiary + }); + } +}; + +Blockly.Blocks['wedo_whentilt'] = { + /** + * Block for when tilted. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_whentilt", + "message0": "when tilted ...", + "args0": [ + ], + "inputsInline": true, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; + +Blockly.Blocks['wedo_whendistanceclose'] = { + /** + * Block for when distance sensor is close. + * @this Blockly.Block + */ + init: function() { + this.jsonInit({ + "id": "wedo_whendistanceclose", + "message0": "when distance is near", + "args0": [ + ], + "inputsInline": true, + "nextStatement": null, + "colour": Blockly.Colours.event.primary, + "colourSecondary": Blockly.Colours.event.secondary, + "colourTertiary": Blockly.Colours.event.tertiary + }); + } +}; diff --git a/build.py b/build.py index 2173d0c866..e3c7a666ba 100755 --- a/build.py +++ b/build.py @@ -30,9 +30,8 @@ # # This script also generates: # blocks_compressed.js: The compressed Blockly language blocks. -# javascript_compressed.js: The compressed Javascript generator. -# python_compressed.js: The compressed Python generator. -# dart_compressed.js: The compressed Dart generator. +# blocks_horizontal_compressed.js: The compressed Scratch horizontal blocks. +# blocks_vertical_compressed.js: The compressed Scratch vertical blocks. # msg/js/.js for every language defined in msg/js/.json. import sys @@ -70,16 +69,21 @@ class Gen_uncompressed(threading.Thread): """Generate a JavaScript file that loads Blockly's raw files. Runs in a separate thread. """ - def __init__(self, search_paths): + def __init__(self, search_paths, vertical): threading.Thread.__init__(self) self.search_paths = search_paths + self.vertical = vertical def run(self): - target_filename = 'blockly_uncompressed.js' + if self.vertical: + target_filename = 'blockly_uncompressed_vertical.js' + else: + target_filename = 'blockly_uncompressed_horizontal.js' f = open(target_filename, 'w') f.write(HEADER) f.write(""" -var isNodeJS = !!(typeof module !== 'undefined' && module.exports); +var isNodeJS = !!(typeof module !== 'undefined' && module.exports && + typeof window === 'undefined'); if (isNodeJS) { var window = {}; @@ -90,7 +94,7 @@ def run(self): if (!isNodeJS) { // Find name of current directory. var scripts = document.getElementsByTagName('script'); - var re = new RegExp('(.+)[\/]blockly_uncompressed\.js$'); + var re = new RegExp('(.+)[\/]blockly_uncompressed(_vertical|_horizontal|)\.js$'); for (var i = 0, script; script = scripts[i]; i++) { var match = re.exec(script.src); if (match) { @@ -166,20 +170,25 @@ class Gen_compressed(threading.Thread): Uses the Closure Compiler's online API. Runs in a separate thread. """ - def __init__(self, search_paths): + def __init__(self, search_paths_vertical, search_paths_horizontal): threading.Thread.__init__(self) - self.search_paths = search_paths + self.search_paths_vertical = search_paths_vertical + self.search_paths_horizontal = search_paths_horizontal def run(self): - self.gen_core() - self.gen_blocks() - self.gen_generator("javascript") - self.gen_generator("python") - self.gen_generator("php") - self.gen_generator("dart") - - def gen_core(self): - target_filename = "blockly_compressed.js" + self.gen_core(True) + self.gen_core(False) + self.gen_blocks("horizontal") + self.gen_blocks("vertical") + self.gen_blocks("common") + + def gen_core(self, vertical): + if vertical: + target_filename = 'blockly_compressed_vertical.js' + search_paths = self.search_paths_vertical + else: + target_filename = 'blockly_compressed_horizontal.js' + search_paths = self.search_paths_horizontal # Define the parameters for the POST request. params = [ ("compilation_level", "SIMPLE_OPTIMIZATIONS"), @@ -192,7 +201,7 @@ def gen_core(self): ] # Read in all the source files. - filenames = calcdeps.CalculateDependencies(self.search_paths, + filenames = calcdeps.CalculateDependencies(search_paths, [os.path.join("core", "blockly.js")]) for filename in filenames: # Filter out the Closure files (the compiler will add them). @@ -204,8 +213,16 @@ def gen_core(self): self.do_compile(params, target_filename, filenames, "") - def gen_blocks(self): - target_filename = "blocks_compressed.js" + def gen_blocks(self, block_type): + if block_type == "horizontal": + target_filename = "blocks_compressed_horizontal.js" + filenames = glob.glob(os.path.join("blocks_horizontal", "*.js")) + elif block_type == "vertical": + target_filename = "blocks_compressed_vertical.js" + filenames = glob.glob(os.path.join("blocks_vertical", "*.js")) + elif block_type == "common": + target_filename = "blocks_compressed.js" + filenames = glob.glob(os.path.join("blocks", "*.js")) # Define the parameters for the POST request. params = [ ("compilation_level", "SIMPLE_OPTIMIZATIONS"), @@ -219,7 +236,8 @@ def gen_blocks(self): # Read in all the source files. # Add Blockly.Blocks to be compatible with the compiler. params.append(("js_code", "goog.provide('Blockly.Blocks');")) - filenames = glob.glob(os.path.join("blocks", "*.js")) + # Add Blockly.Colours for use of centralized colour bank + filenames.append(os.path.join("core", "colours.js")) for filename in filenames: f = open(filename) params.append(("js_code", "".join(f.readlines()))) @@ -229,34 +247,6 @@ def gen_blocks(self): remove = "var Blockly={Blocks:{}};" self.do_compile(params, target_filename, filenames, remove) - def gen_generator(self, language): - target_filename = language + "_compressed.js" - # Define the parameters for the POST request. - params = [ - ("compilation_level", "SIMPLE_OPTIMIZATIONS"), - ("output_format", "json"), - ("output_info", "compiled_code"), - ("output_info", "warnings"), - ("output_info", "errors"), - ("output_info", "statistics"), - ] - - # Read in all the source files. - # Add Blockly.Generator to be compatible with the compiler. - params.append(("js_code", "goog.provide('Blockly.Generator');")) - filenames = glob.glob( - os.path.join("generators", language, "*.js")) - filenames.insert(0, os.path.join("generators", language + ".js")) - for filename in filenames: - f = open(filename) - params.append(("js_code", "".join(f.readlines()))) - f.close() - filenames.insert(0, "[goog.provide]") - - # Remove Blockly.Generator to be compatible with Blockly. - remove = "var Blockly={Generator:{}};" - self.do_compile(params, target_filename, filenames, remove) - def do_compile(self, params, target_filename, filenames, remove): # Send the request to Google. headers = {"Content-type": "application/x-www-form-urlencoded"} @@ -429,6 +419,11 @@ def run(self): else: print("FAILED to create " + f) +def exclude_vertical(item): + return not item.endswith("block_render_svg_vertical.js") + +def exclude_horizontal(item): + return not item.endswith("block_render_svg_horizontal.js") if __name__ == "__main__": try: @@ -455,11 +450,19 @@ def run(self): search_paths = calcdeps.ExpandDirectories( ["core", os.path.join(os.path.pardir, "closure-library")]) - # Run both tasks in parallel threads. + search_paths_horizontal = filter(exclude_vertical, search_paths) + search_paths_vertical = filter(exclude_horizontal, search_paths) + + # Run all tasks in parallel threads. # Uncompressed is limited by processor speed. # Compressed is limited by network and server speed. - Gen_uncompressed(search_paths).start() - Gen_compressed(search_paths).start() + # Vertical: + Gen_uncompressed(search_paths_vertical, True).start() + # Horizontal: + Gen_uncompressed(search_paths_horizontal, False).start() + + # Compressed forms of vertical and horizontal. + Gen_compressed(search_paths_vertical, search_paths_horizontal).start() # This is run locally in a separate thread. Gen_langfiles().start() diff --git a/core/block.js b/core/block.js index 8d3163b373..8487abb295 100644 --- a/core/block.js +++ b/core/block.js @@ -27,6 +27,7 @@ goog.provide('Blockly.Block'); goog.require('Blockly.Blocks'); +goog.require('Blockly.Colours'); goog.require('Blockly.Comment'); goog.require('Blockly.Connection'); goog.require('Blockly.Input'); @@ -52,10 +53,9 @@ goog.require('goog.string'); */ Blockly.Block = function(workspace, prototypeName, opt_id) { /** @type {string} */ - this.id = opt_id || Blockly.genUid(); - goog.asserts.assert(!Blockly.Block.getById(this.id), - 'Error: Block "%s" already exists.', this.id); - Blockly.Block.BlockDB_[this.id] = this; + this.id = (opt_id && !workspace.getBlockById(opt_id)) ? + opt_id : Blockly.genUid(); + workspace.blockDB_[this.id] = this; /** @type {Blockly.Connection} */ this.outputConnection = null; /** @type {Blockly.Connection} */ @@ -65,9 +65,7 @@ Blockly.Block = function(workspace, prototypeName, opt_id) { /** @type {!Array.} */ this.inputList = []; /** @type {boolean|undefined} */ - this.inputsInline = undefined; - /** @type {boolean} */ - this.rendered = false; + this.inputsInline = true; /** @type {boolean} */ this.disabled = false; /** @type {string|!Function} */ @@ -75,25 +73,55 @@ Blockly.Block = function(workspace, prototypeName, opt_id) { /** @type {boolean} */ this.contextMenu = true; - /** @type {Blockly.Block} */ + /** + * @type {Blockly.Block} + * @private + */ this.parentBlock_ = null; - /** @type {!Array.} */ + + /** + * @type {!Array.} + * @private + */ this.childBlocks_ = []; - /** @type {boolean} */ + + /** + * @type {boolean} + * @private + */ this.deletable_ = true; - /** @type {boolean} */ + + /** + * @type {boolean} + * @private + */ this.movable_ = true; - /** @type {boolean} */ + + /** + * @type {boolean} + * @private + */ this.editable_ = true; - /** @type {boolean} */ + + /** + * @type {boolean} + * @private + */ this.isShadow_ = false; - /** @type {boolean} */ + + /** + * @type {boolean} + * @private + */ this.collapsed_ = false; /** @type {string|Blockly.Comment} */ this.comment = null; - /** @type {!goog.math.Coordinate} */ + /** + * @type {!goog.math.Coordinate} + * @private + */ this.xy_ = new goog.math.Coordinate(0, 0); /** @type {!Blockly.Workspace} */ @@ -103,6 +131,9 @@ Blockly.Block = function(workspace, prototypeName, opt_id) { /** @type {boolean} */ this.RTL = workspace.RTL; + /** @type {boolean} */ + this.isInsertionMarker_ = false; + // Copy the type-specific functions and data from the prototype. if (prototypeName) { /** @type {string} */ @@ -122,20 +153,14 @@ Blockly.Block = function(workspace, prototypeName, opt_id) { // Record initial inline state. /** @type {boolean|undefined} */ this.inputsInlineDefault = this.inputsInline; -}; - -/** - * Obtain a newly created block. - * @param {!Blockly.Workspace} workspace The block's workspace. - * @param {?string} prototypeName Name of the language object containing - * type-specific functions for this block. - * @return {!Blockly.Block} The created block. - * @deprecated December 2015 - */ -Blockly.Block.obtain = function(workspace, prototypeName) { - console.warn('Deprecated call to Blockly.Block.obtain, ' + - 'use workspace.newBlock instead.'); - return workspace.newBlock(prototypeName); + if (Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Create(this)); + } + // Bind an onchange function, if it exists. + if (goog.isFunction(this.onchange)) { + this.onchangeWrapper_ = this.onchange.bind(this); + this.workspace.addChangeListener(this.onchangeWrapper_); + } }; /** @@ -152,23 +177,43 @@ Blockly.Block.prototype.data = null; */ Blockly.Block.prototype.colour_ = '#000000'; +/** + * Secondary colour of the block in '#RRGGBB' format. + * @type {string} + * @private + */ +Blockly.Block.prototype.colourSecondary_ = '#000000'; + +/** + * Tertiary colour of the block in '#RRGGBB' format. + * @type {string} + * @private + */ +Blockly.Block.prototype.colourTertiary_ = '#000000'; + /** * Dispose of this block. * @param {boolean} healStack If true, then try to heal any gap by connecting * the next statement with the previous statement. Otherwise, dispose of * all children of this block. - * @param {boolean} animate If true, show a disposal animation and sound. - * @param {boolean=} opt_dontRemoveFromWorkspace If true, don't remove this - * block from the workspace's list of top blocks. */ -Blockly.Block.prototype.dispose = function(healStack, animate, - opt_dontRemoveFromWorkspace) { - this.unplug(healStack, false); +Blockly.Block.prototype.dispose = function(healStack) { + // Terminate onchange event calls. + if (this.onchangeWrapper_) { + this.workspace.removeChangeListener(this.onchangeWrapper_); + } + this.unplug(healStack); + if (Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Delete(this)); + } + Blockly.Events.disable(); // This block is now at the top of the workspace. // Remove this block from the workspace's list of top-most blocks. - if (this.workspace && !opt_dontRemoveFromWorkspace) { + if (this.workspace) { this.workspace.removeTopBlock(this); + // Remove from block database. + delete this.workspace.blockDB_[this.id]; this.workspace = null; } @@ -194,85 +239,90 @@ Blockly.Block.prototype.dispose = function(healStack, animate, var connections = this.getConnections_(true); for (var i = 0; i < connections.length; i++) { var connection = connections[i]; - if (connection.targetConnection) { + if (connection.isConnected()) { connection.disconnect(); } connections[i].dispose(); } - // Remove from block database. - delete Blockly.Block.BlockDB_[this.id]; + Blockly.Events.enable(); }; /** * Unplug this block from its superior block. If this block is a statement, * optionally reconnect the block underneath with the block on top. - * @param {boolean} healStack Disconnect child statement and reconnect stack. - * @param {boolean} bump Move the unplugged block sideways a short distance. + * @param {boolean} opt_healStack Disconnect child statement and reconnect + * stack. Defaults to false. */ -Blockly.Block.prototype.unplug = function(healStack, bump) { - bump = bump && !!this.getParent(); +Blockly.Block.prototype.unplug = function(opt_healStack) { if (this.outputConnection) { - if (this.outputConnection.targetConnection) { + if (this.outputConnection.isConnected()) { // Disconnect from any superior block. - this.setParent(null); + this.outputConnection.disconnect(); } - } else { + } else if (this.previousConnection) { var previousTarget = null; - if (this.previousConnection && this.previousConnection.targetConnection) { + if (this.previousConnection.isConnected()) { // Remember the connection that any next statements need to connect to. previousTarget = this.previousConnection.targetConnection; // Detach this block from the parent's tree. - this.setParent(null); + this.previousConnection.disconnect(); } var nextBlock = this.getNextBlock(); - if (healStack && nextBlock) { + if (opt_healStack && nextBlock) { // Disconnect the next statement. var nextTarget = this.nextConnection.targetConnection; - nextBlock.setParent(null); + nextTarget.disconnect(); if (previousTarget && previousTarget.checkType_(nextTarget)) { // Attach the next statement to the previous statement. previousTarget.connect(nextTarget); } } } - if (bump) { - // Bump the block sideways. - var dx = Blockly.SNAP_RADIUS * (this.RTL ? -1 : 1); - var dy = Blockly.SNAP_RADIUS * 2; - this.moveBy(dx, dy); - } }; /** * Returns all connections originating from this block. - * @param {boolean} all If true, return all connections even hidden ones. - * Otherwise return those that are visible. * @return {!Array.} Array of connections. * @private */ -Blockly.Block.prototype.getConnections_ = function(all) { +Blockly.Block.prototype.getConnections_ = function() { var myConnections = []; - if (all || this.rendered) { - if (this.outputConnection) { - myConnections.push(this.outputConnection); - } - if (this.previousConnection) { - myConnections.push(this.previousConnection); - } - if (this.nextConnection) { - myConnections.push(this.nextConnection); - } - if (all || !this.collapsed_) { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.connection) { - myConnections.push(input.connection); - } - } + if (this.outputConnection) { + myConnections.push(this.outputConnection); + } + if (this.previousConnection) { + myConnections.push(this.previousConnection); + } + if (this.nextConnection) { + myConnections.push(this.nextConnection); + } + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.connection) { + myConnections.push(input.connection); } } return myConnections; }; +/** + * Walks down a stack of blocks and finds the last next connection on the stack. + * @return {Blockly.Connection} The last next connection on the stack, or null. + * @private + */ +Blockly.Block.prototype.lastConnectionInStack_ = function() { + var nextConnection = this.nextConnection; + while (nextConnection) { + var nextBlock = nextConnection.targetBlock(); + if (!nextBlock) { + // Found a next connection with nothing on the other side. + return nextConnection; + } + nextConnection = nextBlock.nextConnection; + } + // Ran out of next connections. + return null; +}; + /** * Bump unconnected blocks out of alignment. Two blocks which aren't actually * connected should not coincidentally line up on screen. @@ -282,7 +332,7 @@ Blockly.Block.prototype.bumpNeighbours_ = function() { if (!this.workspace) { return; // Deleted block. } - if (Blockly.dragMode_ != 0) { + if (Blockly.dragMode_ != Blockly.DRAG_NONE) { return; // Don't bump blocks during a drag. } var rootBlock = this.getRootBlock(); @@ -293,7 +343,7 @@ Blockly.Block.prototype.bumpNeighbours_ = function() { var myConnections = this.getConnections_(false); for (var i = 0, connection; connection = myConnections[i]; i++) { // Spider down from this block bumping all sub-blocks. - if (connection.targetConnection && connection.isSuperior()) { + if (connection.isConnected() && connection.isSuperior()) { connection.targetBlock().bumpNeighbours_(); } @@ -301,9 +351,9 @@ Blockly.Block.prototype.bumpNeighbours_ = function() { for (var j = 0, otherConnection; otherConnection = neighbours[j]; j++) { // If both connections are connected, that's probably fine. But if // either one of them is unconnected, then there could be confusion. - if (!connection.targetConnection || !otherConnection.targetConnection) { + if (!connection.isConnected() || !otherConnection.isConnected()) { // Only bump blocks if they are from different tree structures. - if (otherConnection.sourceBlock_.getRootBlock() != rootBlock) { + if (otherConnection.getSourceBlock().getRootBlock() != rootBlock) { // Always bump the inferior block. if (connection.isSuperior()) { otherConnection.bumpAwayFrom_(connection); @@ -325,6 +375,20 @@ Blockly.Block.prototype.getParent = function() { return this.parentBlock_; }; +/** + * Return the input that connects to the specified block. + * @param {!Blockly.Block} block A block connected to an input on this block. + * @return {Blockly.Input} The input that connects to the specified block. + */ +Blockly.Block.prototype.getInputWithBlock = function(block) { + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.connection && input.connection.targetBlock() == block) { + return input; + } + } + return null; +}; + /** * Return the parent block that surrounds the current block, or null if this * block has no surrounding block. A parent block might just be the previous @@ -333,18 +397,16 @@ Blockly.Block.prototype.getParent = function() { */ Blockly.Block.prototype.getSurroundParent = function() { var block = this; - while (true) { - do { - var prevBlock = block; - block = block.getParent(); - if (!block) { - // Ran off the top. - return null; - } - } while (block.getNextBlock() == prevBlock); - // This block is an enclosing parent, not just a statement in a stack. - return block; - } + do { + var prevBlock = block; + block = block.getParent(); + if (!block) { + // Ran off the top. + return null; + } + } while (block.getNextBlock() == prevBlock); + // This block is an enclosing parent, not just a statement in a stack. + return block; }; /** @@ -355,6 +417,20 @@ Blockly.Block.prototype.getNextBlock = function() { return this.nextConnection && this.nextConnection.targetBlock(); }; +/** + * Return the connection on the first statement input on this block, or null if + * there are none. + * @return {Blockly.Connection} The first statement connection or null. + */ +Blockly.Block.prototype.getFirstStatementConnection = function() { + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.connection && input.connection.type == Blockly.NEXT_STATEMENT) { + return input.connection; + } + } + return null; +}; + /** * Return the top-most block in this block's tree. * This will return itself if this block is at the top level. @@ -385,6 +461,9 @@ Blockly.Block.prototype.getChildren = function() { * @param {Blockly.Block} newParent New parent block. */ Blockly.Block.prototype.setParent = function(newParent) { + if (newParent == this.parentBlock_) { + return; + } if (this.parentBlock_) { // Remove this block from the old parent's child list. var children = this.parentBlock_.childBlocks_; @@ -396,22 +475,18 @@ Blockly.Block.prototype.setParent = function(newParent) { } // Disconnect from superior blocks. - this.parentBlock_ = null; - if (this.previousConnection && this.previousConnection.targetConnection) { - this.previousConnection.disconnect(); + if (this.previousConnection && this.previousConnection.isConnected()) { + throw 'Still connected to previous block.'; } - if (this.outputConnection && this.outputConnection.targetConnection) { - this.outputConnection.disconnect(); + if (this.outputConnection && this.outputConnection.isConnected()) { + throw 'Still connected to parent block.'; } + this.parentBlock_ = null; // This block hasn't actually moved on-screen, so there's no need to update // its connection locations. } else { // Remove this block from the workspace's list of top-most blocks. - // Note that during realtime sync we sometimes create child blocks that are - // not top level so we check first before removing. - if (goog.array.contains(this.workspace.getTopBlocks(false), this)) { - this.workspace.removeTopBlock(this); - } + this.workspace.removeTopBlock(this); } this.parentBlock_ = newParent; @@ -428,12 +503,15 @@ Blockly.Block.prototype.setParent = function(newParent) { * Includes this block in the list. * Includes value and block inputs, as well as any following statements. * Excludes any connection on an output tab or any preceding statements. + * @param {boolean=} opt_ignoreShadows If set, don't include shadow blocks. * @return {!Array.} Flattened array of blocks. */ -Blockly.Block.prototype.getDescendants = function() { +Blockly.Block.prototype.getDescendants = function(opt_ignoreShadows) { var blocks = [this]; for (var child, x = 0; child = this.childBlocks_[x]; x++) { - blocks.push.apply(blocks, child.getDescendants()); + if (!opt_ignoreShadows || !child.isShadow_) { + blocks.push.apply(blocks, child.getDescendants(opt_ignoreShadows)); + } } return blocks; }; @@ -488,6 +566,29 @@ Blockly.Block.prototype.setShadow = function(shadow) { this.isShadow_ = shadow; }; +/** + * Get whether this block is an insertion marker block or not. + * @return {boolean} True if an insertion marker. + */ +Blockly.Block.prototype.isInsertionMarker = function() { + return this.isInsertionMarker_; +}; + +/** + * Set whether this block is an insertion marker block or not. + * @param {boolean} insertionMarker True if an insertion marker. + */ +Blockly.Block.prototype.setInsertionMarker = function(insertionMarker) { + if (this.isInsertionMarker_ == insertionMarker) { + return; // No change. + } + this.isInsertionMarker_ = insertionMarker; + if (this.isInsertionMarker_) { + this.setColour(Blockly.Colours.insertionMarker); + this.setOpacity(Blockly.Colours.insertionMarkerOpacity); + } +}; + /** * Get whether this block is editable or not. * @return {boolean} True if editable. @@ -543,6 +644,28 @@ Blockly.Block.prototype.setConnectionsHidden = function(hidden) { } }; +/** + * Find the connection on this block that corresponds to the given connection + * on the other block. + * Used to match connections between a block and its insertion marker. + * @param {!Blockly.Block} otherBlock The other block to match against. + * @param {!Blockly.Connection} conn The other connection to match. + * @return {Blockly.Connection} the matching connection on this block, or null. + */ +Blockly.Block.prototype.getMatchingConnection = function(otherBlock, conn) { + var connections = this.getConnections_(true); + var otherConnections = otherBlock.getConnections_(true); + if (connections.length != otherConnections.length) { + throw "Connection lists did not match in length."; + } + for (var i = 0; i < otherConnections.length; i++) { + if (otherConnections[i] == conn) { + return connections[i]; + } + } + return null; +}; + /** * Set the URL of this block's help page. * @param {string|Function} url URL string for block help, or function that @@ -570,18 +693,59 @@ Blockly.Block.prototype.getColour = function() { }; /** - * Change the colour of a block. - * @param {number|string} colour HSV hue value, or #RRGGBB string. + * Get the secondary colour of a block. + * @return {string} #RRGGBB string. */ -Blockly.Block.prototype.setColour = function(colour) { +Blockly.Block.prototype.getColourSecondary = function() { + return this.colourSecondary_; +}; + +/** + * Get the tertiary colour of a block. + * @return {string} #RRGGBB string. + */ +Blockly.Block.prototype.getColourTertiary = function() { + return this.colourTertiary_; +}; + + +/** +* Create an #RRGGBB string colour from a colour HSV hue value or #RRGGBB string. +* @param {number|string} colour HSV hue value, or #RRGGBB string. +* @return {string} #RRGGBB string. +* @private +*/ +Blockly.Block.prototype.makeColour_ = function(colour) { var hue = parseFloat(colour); if (!isNaN(hue)) { - this.colour_ = Blockly.hueToRgb(hue); + return Blockly.hueToRgb(hue); } else if (goog.isString(colour) && colour.match(/^#[0-9a-fA-F]{6}$/)) { - this.colour_ = colour; + return colour; } else { throw 'Invalid colour: ' + colour; } +} + +/** + * Change the colour of a block, and optional secondary/teriarty colours. + * @param {number|string} colour HSV hue value, or #RRGGBB string. + * @param {number|string} colourSecondary HSV hue value, or #RRGGBB string. + * @param {number|string} colourTertiary HSV hue value, or #RRGGBB string. + */ +Blockly.Block.prototype.setColour = function(colour, colourSecondary, colourTertiary) { + this.colour_ = this.makeColour_(colour); + if (colourSecondary !== undefined) { + this.colourSecondary_ = this.makeColour_(colourSecondary); + } else { + this.colourSecondary_ = goog.color.darken(goog.color.hexToRgb(this.colour_), + 0.1); + } + if (colourTertiary !== undefined) { + this.colourTertiary_ = this.makeColour_(colourTertiary); + } else { + this.colourTertiary_ = goog.color.darken(goog.color.hexToRgb(this.colour_), + 0.2); + } if (this.rendered) { this.updateColour(); } @@ -603,6 +767,39 @@ Blockly.Block.prototype.getField = function(name) { return null; }; +/** + * Return all variables referenced by this block. + * @return {!Array.} List of variable names. + */ +Blockly.Block.prototype.getVars = function() { + var vars = []; + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field instanceof Blockly.FieldVariable) { + vars.push(field.getValue()); + } + } + } + return vars; +}; + +/** + * Notification that a variable is renaming. + * If the name matches one of this block's variables, rename it. + * @param {string} oldName Previous name of variable. + * @param {string} newName Renamed variable. + */ +Blockly.Block.prototype.renameVar = function(oldName, newName) { + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field instanceof Blockly.FieldVariable && + Blockly.Names.equals(oldName, field.getValue())) { + field.setValue(newName); + } + } + } +}; + /** * Returns the language-neutral value from the field of a block. * @param {string} name The name of the field. @@ -616,17 +813,6 @@ Blockly.Block.prototype.getFieldValue = function(name) { return null; }; -/** - * Returns the language-neutral value from the field of a block. - * @param {string} name The name of the field. - * @return {?string} Value from the field or null if field does not exist. - * @deprecated December 2013 - */ -Blockly.Block.prototype.getTitleValue = function(name) { - console.warn('Deprecated call to getTitleValue, use getFieldValue instead.'); - return this.getFieldValue(name); -}; - /** * Change the field value for a block (e.g. 'CHOOSE' or 'REMOVE'). * @param {string} newValue Value to be the new field. @@ -638,17 +824,6 @@ Blockly.Block.prototype.setFieldValue = function(newValue, name) { field.setValue(newValue); }; -/** - * Change the field value for a block (e.g. 'CHOOSE' or 'REMOVE'). - * @param {string} newValue Value to be the new field. - * @param {string} name The name of the field. - * @deprecated December 2013 - */ -Blockly.Block.prototype.setTitleValue = function(newValue, name) { - console.warn('Deprecated call to setTitleValue, use setFieldValue instead.'); - this.setFieldValue(newValue, name); -}; - /** * Set whether this block can chain onto the bottom of another block. * @param {boolean} newBoolean True if there can be a previous statement. @@ -656,25 +831,24 @@ Blockly.Block.prototype.setTitleValue = function(newValue, name) { * list of statement types. Null/undefined if any type could be connected. */ Blockly.Block.prototype.setPreviousStatement = function(newBoolean, opt_check) { - if (this.previousConnection) { - goog.asserts.assert(!this.previousConnection.targetConnection, - 'Must disconnect previous statement before removing connection.'); - this.previousConnection.dispose(); - this.previousConnection = null; - } if (newBoolean) { - goog.asserts.assert(!this.outputConnection, - 'Remove output connection prior to adding previous connection.'); if (opt_check === undefined) { opt_check = null; } - this.previousConnection = - new Blockly.Connection(this, Blockly.PREVIOUS_STATEMENT); + if (!this.previousConnection) { + goog.asserts.assert(!this.outputConnection, + 'Remove output connection prior to adding previous connection.'); + this.previousConnection = + this.makeConnection_(Blockly.PREVIOUS_STATEMENT); + } this.previousConnection.setCheck(opt_check); - } - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); + } else { + if (this.previousConnection) { + goog.asserts.assert(!this.previousConnection.isConnected(), + 'Must disconnect previous statement before removing connection.'); + this.previousConnection.dispose(); + this.previousConnection = null; + } } }; @@ -685,23 +859,21 @@ Blockly.Block.prototype.setPreviousStatement = function(newBoolean, opt_check) { * list of statement types. Null/undefined if any type could be connected. */ Blockly.Block.prototype.setNextStatement = function(newBoolean, opt_check) { - if (this.nextConnection) { - goog.asserts.assert(!this.nextConnection.targetConnection, - 'Must disconnect next statement before removing connection.'); - this.nextConnection.dispose(); - this.nextConnection = null; - } if (newBoolean) { if (opt_check === undefined) { opt_check = null; } - this.nextConnection = - new Blockly.Connection(this, Blockly.NEXT_STATEMENT); + if (!this.nextConnection) { + this.nextConnection = this.makeConnection_(Blockly.NEXT_STATEMENT); + } this.nextConnection.setCheck(opt_check); - } - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); + } else { + if (this.nextConnection) { + goog.asserts.assert(!this.nextConnection.isConnected(), + 'Must disconnect next statement before removing connection.'); + this.nextConnection.dispose(); + this.nextConnection = null; + } } }; @@ -713,25 +885,23 @@ Blockly.Block.prototype.setNextStatement = function(newBoolean, opt_check) { * (e.g. variable get). */ Blockly.Block.prototype.setOutput = function(newBoolean, opt_check) { - if (this.outputConnection) { - goog.asserts.assert(!this.outputConnection.targetConnection, - 'Must disconnect output value before removing connection.'); - this.outputConnection.dispose(); - this.outputConnection = null; - } if (newBoolean) { - goog.asserts.assert(!this.previousConnection, - 'Remove previous connection prior to adding output connection.'); if (opt_check === undefined) { opt_check = null; } - this.outputConnection = - new Blockly.Connection(this, Blockly.OUTPUT_VALUE); + if (!this.outputConnection) { + goog.asserts.assert(!this.previousConnection, + 'Remove previous connection prior to adding output connection.'); + this.outputConnection = this.makeConnection_(Blockly.OUTPUT_VALUE); + } this.outputConnection.setCheck(opt_check); - } - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); + } else { + if (this.outputConnection) { + goog.asserts.assert(!this.outputConnection.isConnected(), + 'Must disconnect output value before removing connection.'); + this.outputConnection.dispose(); + this.outputConnection = null; + } } }; @@ -740,11 +910,10 @@ Blockly.Block.prototype.setOutput = function(newBoolean, opt_check) { * @param {boolean} newBoolean True if inputs are horizontal. */ Blockly.Block.prototype.setInputsInline = function(newBoolean) { - this.inputsInline = newBoolean; - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); - this.workspace.fireChangeEvent(); + if (this.inputsInline != newBoolean) { + Blockly.Events.fire(new Blockly.Events.Change( + this, 'inline', null, this.inputsInline, newBoolean)); + this.inputsInline = newBoolean; } }; @@ -780,7 +949,11 @@ Blockly.Block.prototype.getInputsInline = function() { * @param {boolean} disabled True if disabled. */ Blockly.Block.prototype.setDisabled = function(disabled) { - this.disabled = disabled; + if (this.disabled != disabled) { + Blockly.Events.fire(new Blockly.Events.Change( + this, 'disabled', null, this.disabled, disabled)); + this.disabled = disabled; + } }; /** @@ -814,7 +987,11 @@ Blockly.Block.prototype.isCollapsed = function() { * @param {boolean} collapsed True if collapsed. */ Blockly.Block.prototype.setCollapsed = function(collapsed) { - this.collapsed_ = collapsed; + if (this.collapsed_ != collapsed) { + Blockly.Events.fire(new Blockly.Events.Change( + this, 'collapsed', null, this.collapsed_, collapsed)); + this.collapsed_ = collapsed; + } }; /** @@ -844,7 +1021,8 @@ Blockly.Block.prototype.toString = function(opt_maxLength) { text = goog.string.trim(text.join(' ')) || '???'; if (opt_maxLength) { // TODO: Improve truncation so that text from this block is given priority. - // TODO: Handle FieldImage better. + // E.g. "1+2+3+4+5+6+7+8+9=0" should be "...6+7+8+9=0", not "1+2+3+4+5...". + // E.g. "1+2+3+4+5=6+7+8+9+0" should be "...4+5=6+7...". text = goog.string.truncate(text, opt_maxLength); } return text; @@ -892,7 +1070,9 @@ Blockly.Block.prototype.jsonInit = function(json) { 'Must not have both an output and a previousStatement.'); // Set basic properties of block. - this.setColour(json['colour']); + if (json['colour'] !== undefined) { + this.setColour(json['colour'], json['colourSecondary'], json['colourTertiary']); + } // Interpolate the message blocks. var i = 0; @@ -960,11 +1140,11 @@ Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign) { // Add last dummy input if needed. if (elements.length && (typeof elements[elements.length - 1] == 'string' || elements[elements.length - 1]['type'].indexOf('field_') == 0)) { - var input = {type: 'input_dummy'}; + var dummyInput = {type: 'input_dummy'}; if (lastDummyAlign) { - input['align'] = lastDummyAlign; + dummyInput['align'] = lastDummyAlign; } - elements.push(input); + elements.push(dummyInput); } // Lookup of alignment constants. var alignmentLookup = { @@ -1005,6 +1185,10 @@ Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign) { case 'field_angle': field = new Blockly.FieldAngle(element['angle']); break; + case 'field_number': + field = new Blockly.FieldNumber(element['number'], null, + element['precision'], element['min'], element['max']); + break; case 'field_checkbox': field = new Blockly.FieldCheckbox( element['checked'] ? 'TRUE' : 'FALSE'); @@ -1018,9 +1202,13 @@ Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign) { case 'field_dropdown': field = new Blockly.FieldDropdown(element['options']); break; + case 'field_iconmenu': + field = new Blockly.FieldIconMenu(element['options']); + break; case 'field_image': field = new Blockly.FieldImage(element['src'], - element['width'], element['height'], element['alt']); + element['width'], element['height'], element['alt'], + element['flip_rtl']); break; case 'field_date': if (Blockly.FieldDate) { @@ -1066,16 +1254,11 @@ Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign) { Blockly.Block.prototype.appendInput_ = function(type, name) { var connection = null; if (type == Blockly.INPUT_VALUE || type == Blockly.NEXT_STATEMENT) { - connection = new Blockly.Connection(this, type); + connection = this.makeConnection_(type); } var input = new Blockly.Input(type, name, this, connection); // Append input to list. this.inputList.push(input); - if (this.rendered) { - this.render(); - // Adding an input will cause the block to change shape. - this.bumpNeighbours_(); - } return input; }; @@ -1132,11 +1315,6 @@ Blockly.Block.prototype.moveNumberedInputBefore = function( } // Reinsert input. this.inputList.splice(refIndex, 0, input); - if (this.rendered) { - this.render(); - // Moving an input will cause the block to change shape. - this.bumpNeighbours_(); - } }; /** @@ -1149,17 +1327,19 @@ Blockly.Block.prototype.moveNumberedInputBefore = function( Blockly.Block.prototype.removeInput = function(name, opt_quiet) { for (var i = 0, input; input = this.inputList[i]; i++) { if (input.name == name) { - if (input.connection && input.connection.targetConnection) { - // Disconnect any attached block. - input.connection.targetBlock().setParent(null); + if (input.connection && input.connection.isConnected()) { + input.connection.setShadowDom(null); + var block = input.connection.targetBlock(); + if (block.isShadow()) { + // Destroy any attached shadow block. + block.dispose(); + } else { + // Disconnect any attached normal block. + block.unplug(); + } } input.dispose(); this.inputList.splice(i, 1); - if (this.rendered) { - this.render(); - // Removing an input will cause the block to change shape. - this.bumpNeighbours_(); - } return; } } @@ -1171,7 +1351,7 @@ Blockly.Block.prototype.removeInput = function(name, opt_quiet) { /** * Fetches the named input object. * @param {string} name The name of the input. - * @return {Blockly.Input} The input object, or null of the input does not exist. + * @return {Blockly.Input} The input object, or null if input does not exist. */ Blockly.Block.prototype.getInput = function(name) { for (var i = 0, input; input = this.inputList[i]; i++) { @@ -1207,7 +1387,11 @@ Blockly.Block.prototype.getCommentText = function() { * @param {?string} text The text, or null to delete. */ Blockly.Block.prototype.setCommentText = function(text) { - this.comment = text; + if (this.comment != text) { + Blockly.Events.fire(new Blockly.Events.Change( + this, 'comment', null, this.comment, text || '')); + this.comment = text; + } }; /** @@ -1241,20 +1425,19 @@ Blockly.Block.prototype.getRelativeToSurfaceXY = function() { * @param {number} dy Vertical offset. */ Blockly.Block.prototype.moveBy = function(dx, dy) { + goog.asserts.assert(!this.parentBlock_, 'Block has parent.'); + var event = new Blockly.Events.Move(this); this.xy_.translate(dx, dy); + event.recordNew(); + Blockly.Events.fire(event); }; /** - * Database of all blocks. + * Create a connection of the specified type. + * @param {number} type The type of the connection to create. + * @return {!Blockly.Connection} A new connection of the specified type. * @private */ -Blockly.Block.BlockDB_ = Object.create(null); - -/** - * Find the block with the specified ID. - * @param {string} id ID of block to find. - * @return {Blockly.Block} The sought after block or null if not found. - */ -Blockly.Block.getById = function(id) { - return Blockly.Block.BlockDB_[id] || null; +Blockly.Block.prototype.makeConnection_ = function(type) { + return new Blockly.Connection(this, type); }; diff --git a/core/block_render_svg_horizontal.js b/core/block_render_svg_horizontal.js new file mode 100644 index 0000000000..459179dc90 --- /dev/null +++ b/core/block_render_svg_horizontal.js @@ -0,0 +1,765 @@ +/** + * @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 Methods for graphically rendering a block as SVG. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.BlockSvg.render'); + +goog.require('Blockly.BlockSvg'); + + +// UI constants for rendering blocks. +/** +* Grid unit to pixels conversion +* @const +*/ +Blockly.BlockSvg.GRID_UNIT = 4; + +/** + * Horizontal space between elements. + * @const + */ +Blockly.BlockSvg.SEP_SPACE_X = 3 * Blockly.BlockSvg.GRID_UNIT; +/** + * Vertical space between elements. + * @const + */ +Blockly.BlockSvg.SEP_SPACE_Y = 3 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Vertical space above blocks with statements. + * @const + */ +Blockly.BlockSvg.STATEMENT_BLOCK_SPACE = 3 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Height of user inputs + * @const + */ +Blockly.BlockSvg.FIELD_HEIGHT = 8 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Width of user inputs + * @const + */ +Blockly.BlockSvg.FIELD_WIDTH = 12 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Minimum width of user inputs during editing + * @const + */ +Blockly.BlockSvg.FIELD_WIDTH_MIN_EDIT = 13 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Maximum width of user inputs during editing + * @const + */ +Blockly.BlockSvg.FIELD_WIDTH_MAX_EDIT = 24 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Maximum height of user inputs during editing + * @const + */ +Blockly.BlockSvg.FIELD_HEIGHT_MAX_EDIT = 10 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Top padding of user inputs + * @const + */ +Blockly.BlockSvg.FIELD_TOP_PADDING = 1.5 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Corner radius of number inputs + * @const + */ +Blockly.BlockSvg.NUMBER_FIELD_CORNER_RADIUS = 4 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Corner radius of text inputs + * @const + */ +Blockly.BlockSvg.TEXT_FIELD_CORNER_RADIUS = 1 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Default radius for a field, in px. + * @const + */ +Blockly.BlockSvg.FIELD_DEFAULT_CORNER_RADIUS = 4 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Minimum width of a block. + * @const + */ +Blockly.BlockSvg.MIN_BLOCK_X = 1/2 * 16 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Minimum height of a block. + * @const + */ +Blockly.BlockSvg.MIN_BLOCK_Y = 16 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Width of horizontal puzzle tab. + * @const + */ +Blockly.BlockSvg.TAB_WIDTH = 2 * Blockly.BlockSvg.GRID_UNIT; +/** + * Rounded corner radius. + * @const + */ +Blockly.BlockSvg.CORNER_RADIUS = 1 * Blockly.BlockSvg.GRID_UNIT; +/** + * Rounded corner radius. + * @const + */ +Blockly.BlockSvg.HAT_CORNER_RADIUS = 8 * Blockly.BlockSvg.GRID_UNIT; +/** + * Full height of connector notch including rounded corner. + * @const + */ +Blockly.BlockSvg.NOTCH_HEIGHT = 8 * Blockly.BlockSvg.GRID_UNIT + 2; +/** + * Width of connector notch + * @const + */ +Blockly.BlockSvg.NOTCH_WIDTH = 2 * Blockly.BlockSvg.GRID_UNIT; +/** + * SVG path for drawing next/previous notch from top to bottom. + * Drawn in pixel units since Bezier control points are off the grid. + * @const + */ + +Blockly.BlockSvg.NOTCH_PATH_DOWN = + 'c 0,2 1,3 2,4 ' + + 'l 4,4 ' + + 'c 1,1 2,2 2,4 ' + + 'v 12 ' + + 'c 0,2 -1,3 -2,4 ' + + 'l -4,4 ' + + 'c -1,1 -2,2 -2,4'; +/** + * SVG path for drawing next/previous notch from bottom to top. + * Drawn in pixel units since Bezier control points are off the grid. + * @const + */ +Blockly.BlockSvg.NOTCH_PATH_UP = + 'c 0,-2 1,-3 2,-4 '+ + 'l 4,-4 ' + + 'c 1,-1 2,-2 2,-4 ' + + 'v -12 ' + + 'c 0,-2 -1,-3 -2,-4 ' + + 'l -4,-4 ' + + 'c -1,-1 -2,-2 -2,-4'; + +/** +* Width of rendered image field in px +* @const +*/ +Blockly.BlockSvg.IMAGE_FIELD_WIDTH = 10 * Blockly.BlockSvg.GRID_UNIT; + +/** +* Height of rendered image field in px +* @const +*/ +Blockly.BlockSvg.IMAGE_FIELD_HEIGHT = 10 * Blockly.BlockSvg.GRID_UNIT; + +/** +* y-offset of the top of the field shadow block from the bottom of the block. +* @const +*/ +Blockly.BlockSvg.FIELD_Y_OFFSET = -2 * Blockly.BlockSvg.GRID_UNIT; + +/** + * SVG start point for drawing the top-left corner. + * @const + */ +Blockly.BlockSvg.TOP_LEFT_CORNER_START = + 'm ' + Blockly.BlockSvg.CORNER_RADIUS + ',0'; +/** + * SVG path for drawing the rounded top-left corner. + * @const + */ +Blockly.BlockSvg.TOP_LEFT_CORNER = + 'A ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + + '0,' + Blockly.BlockSvg.CORNER_RADIUS; +/** + * SVG start point for drawing the top-left corner. + * @const + */ +Blockly.BlockSvg.HAT_TOP_LEFT_CORNER_START = + 'm ' + Blockly.BlockSvg.HAT_CORNER_RADIUS + ',0'; +/** + * SVG path for drawing the rounded top-left corner. + * @const + */ +Blockly.BlockSvg.HAT_TOP_LEFT_CORNER = + 'A ' + Blockly.BlockSvg.HAT_CORNER_RADIUS + ',' + + Blockly.BlockSvg.HAT_CORNER_RADIUS + ' 0 0,0 ' + + '0,' + Blockly.BlockSvg.HAT_CORNER_RADIUS; + +/** + * @type {Object} An object containing computed measurements of this block. + * @private + */ +Blockly.BlockSvg.renderingMetrics_ = null; + +/** + * Max text display length for a field (per-horizontal/vertical) + * @const + */ +Blockly.BlockSvg.MAX_DISPLAY_LENGTH = 4; + +/** + * @param {!Object} first An object containing computed measurements of a + * block. + * @param {!Object} second Another object containing computed measurements of a + * block. + * @return {boolean} Whether the two sets of metrics are equivalent. + * @private + */ +Blockly.BlockSvg.metricsAreEquivalent_ = function(first, second) { + if (first.statement != second.statement) { + return false; + } + if (first.imageField != second.imageField) { + return false; + } + + if ((first.height != second.height) || + (first.width != second.width) || + (first.bayHeight != second.bayHeight) || + (first.bayWidth != second.bayWidth) || + (first.fieldRadius != second.fieldRadius) || + (first.startHat != second.startHat)) { + return false; + } + return true; +}; + +/** + * Play some UI effects (sound) after a connection has been established. + */ +Blockly.BlockSvg.prototype.connectionUiEffect = function() { + this.workspace.playAudio('click'); +}; + +/** + * Change the colour of a block. + */ +Blockly.BlockSvg.prototype.updateColour = function() { + var fillColour = (this.isGlowing_) ? this.getColourSecondary() : this.getColour(); + var strokeColour = this.getColourTertiary(); + + // Render block stroke + this.svgPath_.setAttribute('stroke', strokeColour); + + // Render block fill + var fillColour = (this.isGlowingBlock_) ? this.getColourSecondary() : this.getColour(); + this.svgPath_.setAttribute('fill', fillColour); + + // Render opacity + this.svgPath_.setAttribute('fill-opacity', this.getOpacity()); + + // Bump every dropdown to change its colour. + for (var x = 0, input; input = this.inputList[x]; x++) { + for (var y = 0, field; field = input.fieldRow[y]; y++) { + field.setText(null); + } + } +}; + +/** + * Returns a bounding box describing the dimensions of this block + * and any blocks stacked below it. + * @param {boolean=} opt_ignoreFields True if we should ignore fields in the + * size calculation, and just give the size of the base block(s). + * @return {!{height: number, width: number}} Object with height and width properties. + */ +Blockly.BlockSvg.prototype.getHeightWidth = function(opt_ignoreFields) { + var height = this.height; + var width = this.width; + // Add the size of the field shadow block. + if (!opt_ignoreFields && this.getFieldShadowBlock_()) { + height += Blockly.BlockSvg.FIELD_Y_OFFSET; + height += Blockly.BlockSvg.FIELD_HEIGHT; + } + // Recursively add size of subsequent blocks. + var nextBlock = this.getNextBlock(); + if (nextBlock) { + var nextHeightWidth = nextBlock.getHeightWidth(opt_ignoreFields); + width += nextHeightWidth.width; + height = Math.max(height, nextHeightWidth.height); + } + return {height: height, width: width}; +}; + +/** + * Render the block. + * Lays out and reflows a block based on its contents and settings. + * @param {boolean=} opt_bubble If false, just render this block. + * If true, also render block's parent, grandparent, etc. Defaults to true. + */ +Blockly.BlockSvg.prototype.render = function(opt_bubble) { + Blockly.Field.startCache(); + this.rendered = true; + + var oldMetrics = this.renderingMetrics_; + var metrics = this.renderCompute_(); + + // Don't redraw if we don't need to. + if (oldMetrics && + Blockly.BlockSvg.metricsAreEquivalent_(oldMetrics, metrics)) { + // Skipping the redraw is fine, but we may still have to tighten up our + // connections with child blocks. + if (metrics.statement && metrics.statement.connection && + metrics.statement.targetConnection) { + metrics.statement.connection.tighten_(); + } + if (this.nextConnection && this.nextConnection.targetConnection) { + this.nextConnection.tighten_(); + } + } else { + this.height = metrics.height; + this.width = metrics.width; + this.renderDraw_(metrics); + this.renderingMetrics_ = metrics; + } + + if (opt_bubble !== false) { + // Render all blocks above this one (propagate a reflow). + var parentBlock = this.getParent(); + if (parentBlock) { + parentBlock.render(true); + } else { + // Top-most block. Fire an event to allow scrollbars to resize. + Blockly.asyncSvgResize(this.workspace); + } + } + Blockly.Field.stopCache(); +}; + +/** + * Computes the height and widths for each row and field. + * @return {!Array.>} 2D array of objects, each containing + * position information. + * @private + */ +Blockly.BlockSvg.prototype.renderCompute_ = function() { + var metrics = { + statement: null, + imageField: null, + iconMenu: null, + width: 0, + height: 0, + bayHeight: 0, + bayWidth: 0, + fieldRadius: 0, + startHat: false + }; + + if (this.nextConnection && !this.previousConnection) { + metrics.startHat = true; + } + + // Does block have a statement? + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.type == Blockly.NEXT_STATEMENT) { + metrics.statement = input; + // Compute minimum input size. + metrics.bayHeight = Blockly.BlockSvg.MIN_BLOCK_Y; + metrics.bayWidth = Blockly.BlockSvg.MIN_BLOCK_X; + // Expand input size if there is a connection. + if (input.connection && input.connection.targetConnection) { + var linkedBlock = input.connection.targetBlock(); + var bBox = linkedBlock.getHeightWidth(true); + metrics.bayHeight = Math.max(metrics.bayHeight, bBox.height); + metrics.bayWidth = Math.max(metrics.bayWidth, bBox.width); + } + } + + // Find image field, input fields + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field instanceof Blockly.FieldImage) { + metrics.imageField = field; + } + if (field instanceof Blockly.FieldIconMenu) { + metrics.iconMenu = field; + } + if (field instanceof Blockly.FieldTextInput) { + metrics.fieldRadius = field.getBorderRadius(); + } else { + metrics.fieldRadius = Blockly.BlockSvg.FIELD_DEFAULT_CORNER_RADIUS; + } + } + } + // If this block is an icon menu shadow, attempt to set the parent's + // ImageField src to the one that represents the current value of the field. + if (metrics.iconMenu) { + var currentSrc = metrics.iconMenu.getSrcForValue(metrics.iconMenu.getValue()); + if (currentSrc) { + metrics.iconMenu.setParentFieldImage(currentSrc); + } + } + + // Always render image field at 40x40 px + // Normal block sizing + metrics.width = Blockly.BlockSvg.SEP_SPACE_X * 2 + Blockly.BlockSvg.IMAGE_FIELD_WIDTH; + metrics.height = Blockly.BlockSvg.SEP_SPACE_Y * 2 + Blockly.BlockSvg.IMAGE_FIELD_HEIGHT; + + if (this.outputConnection) { + // Field shadow block + metrics.height = Blockly.BlockSvg.FIELD_HEIGHT; + metrics.width = Blockly.BlockSvg.FIELD_WIDTH; + } + if (metrics.statement) { + // Block with statement (e.g., repeat, forever) + metrics.width += metrics.bayWidth + 4 * Blockly.BlockSvg.CORNER_RADIUS + 2 * Blockly.BlockSvg.GRID_UNIT; + metrics.height = metrics.bayHeight + Blockly.BlockSvg.STATEMENT_BLOCK_SPACE; + } + if (metrics.startHat) { + // Start hats are 1 unit wider to account for optical effect of curve + metrics.width += 1 * Blockly.BlockSvg.GRID_UNIT; + } + return metrics; +}; + + +/** + * Draw the path of the block. + * Move the fields to the correct locations. + * @param {!Object} metrics An object containing computed measurements of the + * block. + * @private + */ +Blockly.BlockSvg.prototype.renderDraw_ = function(metrics) { + // Fetch the block's coordinates on the surface for use in anchoring + // the connections. + var connectionsXY = this.getRelativeToSurfaceXY(); + // Assemble the block's path. + var steps = []; + + this.renderDrawLeft_(steps, connectionsXY, metrics); + this.renderDrawBottom_(steps, connectionsXY, metrics); + this.renderDrawRight_(steps, connectionsXY, metrics); + this.renderDrawTop_(steps, connectionsXY, metrics); + + var pathString = steps.join(' '); + this.svgPath_.setAttribute('d', pathString); + + if (this.RTL) { + // Mirror the block's path. + // This is awesome. + this.svgPath_.setAttribute('transform', 'scale(-1 1)'); + } + + // Horizontal blocks have a single Image Field that is specially positioned + if (metrics.imageField) { + var imageField = metrics.imageField.getSvgRoot(); + var imageFieldSize = metrics.imageField.getSize(); + // Image field's position is calculated relative to the "end" edge of the + // block. + var imageFieldX = metrics.width - imageFieldSize.width - + Blockly.BlockSvg.SEP_SPACE_X / 1.5; + var imageFieldY = metrics.height - imageFieldSize.height - + Blockly.BlockSvg.SEP_SPACE_Y; + var imageFieldScale = "scale(1 1)"; + if (this.RTL) { + // Do we want to mirror the Image Field left-to-right? + if (metrics.imageField.getFlipRTL()) { + imageFieldScale = "scale(-1 1)"; + imageFieldX = -metrics.width + imageFieldSize.width + + Blockly.BlockSvg.SEP_SPACE_X / 1.5; + } else { + // If not, don't offset by imageFieldSize.width + imageFieldX = -metrics.width + Blockly.BlockSvg.SEP_SPACE_X / 1.5; + } + } + if (imageField) { + imageField.setAttribute('transform', + 'translate(' + imageFieldX + ',' + imageFieldY + ') ' + + imageFieldScale); + } + } + + // Position value input + if (this.getFieldShadowBlock_()) { + var input = this.getFieldShadowBlock_().getSvgRoot(); + var valueX = (Blockly.BlockSvg.NOTCH_WIDTH + + (metrics.bayWidth ? 2 * Blockly.BlockSvg.GRID_UNIT + + Blockly.BlockSvg.NOTCH_WIDTH * 2 : 0) + metrics.bayWidth); + if (metrics.startHat) { + // Start hats add some left margin to field for visual balance + valueX += Blockly.BlockSvg.GRID_UNIT * 2; + } + if (this.RTL) { + valueX = -valueX; + } + var valueY = (metrics.height + Blockly.BlockSvg.FIELD_Y_OFFSET); + var transformation = 'translate(' + valueX + ',' + valueY + ')'; + input.setAttribute('transform', transformation); + } +}; + +/** + * Render the left edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Object} connectionsXY Location of block. + * @param {!Object} metrics An object containing computed measurements of the + * block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawLeft_ = function(steps, connectionsXY, metrics) { + // Top edge. + if (metrics.startHat) { + // Hat block + // Position the cursor at the top-left starting point. + steps.push(Blockly.BlockSvg.HAT_TOP_LEFT_CORNER_START); + // Top-left rounded corner. + steps.push(Blockly.BlockSvg.HAT_TOP_LEFT_CORNER); + } else if (this.previousConnection) { + // Regular block + // Position the cursor at the top-left starting point. + steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_START); + // Top-left rounded corner. + steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER); + var cursorY = metrics.height - Blockly.BlockSvg.CORNER_RADIUS - + Blockly.BlockSvg.SEP_SPACE_Y - Blockly.BlockSvg.NOTCH_HEIGHT; + steps.push('V', cursorY); + steps.push(Blockly.BlockSvg.NOTCH_PATH_DOWN); + // Create previous block connection. + var connectionX = connectionsXY.x; + var connectionY = connectionsXY.y + metrics.height - + Blockly.BlockSvg.CORNER_RADIUS * 2; + this.previousConnection.moveTo(connectionX, connectionY); + // This connection will be tightened when the parent renders. + steps.push('V', metrics.height - Blockly.BlockSvg.CORNER_RADIUS); + } else { + // Input + // Position the cursor at the top-left starting point. + steps.push('m', metrics.fieldRadius + ',0'); + // Top-left rounded corner. + steps.push( + 'A', metrics.fieldRadius + ',' + metrics.fieldRadius, + '0', '0,0', '0,' + metrics.fieldRadius); + steps.push( + 'V', metrics.height - metrics.fieldRadius); + } +}; + +/** + * Render the bottom edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Object} connectionsXY Location of block. + * @param {!Object} metrics An object containing computed measurements of the + * block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawBottom_ = function(steps, + connectionsXY, metrics) { + + if (metrics.startHat) { + steps.push('a', Blockly.BlockSvg.HAT_CORNER_RADIUS + ',' + + Blockly.BlockSvg.HAT_CORNER_RADIUS + ' 0 0,0 ' + + Blockly.BlockSvg.HAT_CORNER_RADIUS + ',' + + Blockly.BlockSvg.HAT_CORNER_RADIUS); + } else if (this.previousConnection) { + steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS); + } else { + // Input + steps.push( + 'a', metrics.fieldRadius + ',' + metrics.fieldRadius, + '0', '0,0', metrics.fieldRadius + ',' + metrics.fieldRadius); + } + + // Has statement + if (metrics.statement) { + steps.push('h', 4 * Blockly.BlockSvg.GRID_UNIT); + steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',-' + + Blockly.BlockSvg.CORNER_RADIUS); + steps.push('v', -2.5 * Blockly.BlockSvg.GRID_UNIT); + steps.push(Blockly.BlockSvg.NOTCH_PATH_UP); + // @todo Why 3? + steps.push('v', -metrics.bayHeight + (Blockly.BlockSvg.CORNER_RADIUS * 3) + + Blockly.BlockSvg.NOTCH_HEIGHT + 2 * Blockly.BlockSvg.GRID_UNIT); + steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',-' + + Blockly.BlockSvg.CORNER_RADIUS); + steps.push('h', metrics.bayWidth - (Blockly.BlockSvg.CORNER_RADIUS * 2)); + steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS); + steps.push('v', metrics.bayHeight - (Blockly.BlockSvg.CORNER_RADIUS * 3) - + Blockly.BlockSvg.NOTCH_HEIGHT - 2 * Blockly.BlockSvg.GRID_UNIT); + steps.push(Blockly.BlockSvg.NOTCH_PATH_DOWN); + steps.push('v', 2.5 * Blockly.BlockSvg.GRID_UNIT); + steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS); + + // Create statement connection. + var connectionX = connectionsXY.x + Blockly.BlockSvg.CORNER_RADIUS * 2 + + 4 * Blockly.BlockSvg.GRID_UNIT; + if (this.RTL) { + connectionX = connectionsXY.x - Blockly.BlockSvg.CORNER_RADIUS * 2 - + 4 * Blockly.BlockSvg.GRID_UNIT; + } + var connectionY = connectionsXY.y + metrics.height - + Blockly.BlockSvg.CORNER_RADIUS * 2; + metrics.statement.connection.moveTo(connectionX, connectionY); + if (metrics.statement.connection.targetConnection) { + metrics.statement.connection.tighten_(); + } + } + + if (!this.isShadow()) { + steps.push('H', metrics.width - Blockly.BlockSvg.CORNER_RADIUS); + } else { + // input + steps.push('H', metrics.width - metrics.fieldRadius); + } +}; + +/** + * Render the right edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Object} connectionsXY Location of block. + * @param {!Object} metrics An object containing computed measurements of the + * block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawRight_ = function(steps, connectionsXY, metrics) { + if (!this.isShadow()) { + steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',-' + + Blockly.BlockSvg.CORNER_RADIUS); + steps.push('v', -2.5 * Blockly.BlockSvg.GRID_UNIT); + } else { + // Input + steps.push( + 'a', metrics.fieldRadius + ',' + metrics.fieldRadius, + '0', '0,0', metrics.fieldRadius + ',' + -1 * metrics.fieldRadius); + steps.push('v', -1 * (metrics.height - metrics.fieldRadius * 2)); + } + + if (this.nextConnection) { + steps.push(Blockly.BlockSvg.NOTCH_PATH_UP); + + // Create next block connection. + var connectionX; + if (this.RTL) { + connectionX = connectionsXY.x - metrics.width; + } else { + connectionX = connectionsXY.x + metrics.width; + } + var connectionY = connectionsXY.y + metrics.height - + Blockly.BlockSvg.CORNER_RADIUS * 2; + this.nextConnection.moveTo(connectionX, connectionY); + if (this.nextConnection.targetConnection) { + this.nextConnection.tighten_(); + } + steps.push('V', Blockly.BlockSvg.CORNER_RADIUS); + } else if (!this.isShadow()) { + steps.push('V', Blockly.BlockSvg.CORNER_RADIUS); + } +}; + +/** + * Render the top edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Object} connectionsXY Location of block. + * @param {!Object} metrics An object containing computed measurements of the + * block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawTop_ = function(steps, connectionsXY, metrics) { + if (!this.isShadow()) { + steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 -' + + Blockly.BlockSvg.CORNER_RADIUS + ',-' + + Blockly.BlockSvg.CORNER_RADIUS); + } else { + steps.push( + 'a', metrics.fieldRadius + ',' + metrics.fieldRadius, + '0', '0,0', '-' + metrics.fieldRadius + ',-' + metrics.fieldRadius); + } + steps.push('z'); +}; + +/** + * Get the field shadow block, if this block has one. + *

This is horizontal Scratch-specific, as "fields" are implemented as inputs + * with shadow blocks, and there is only one per block. + * @return {Blockly.BlockSvg} The field shadow block, or null if not found. + * @private + */ +Blockly.BlockSvg.prototype.getFieldShadowBlock_ = function() { + for (var i = 0, child; child = this.childBlocks_[i]; i++) { + if (child.isShadow()) { + return child; + } + } + + return null; +}; + +/** + * Position an new block correctly, so that it doesn't move the existing block + * when connected to it. + * @param {!Blockly.Block} newBlock The block to position - either the first + * block in a dragged stack or an insertion marker. + * @param {!Blockly.Connection} newConnection The connection on the new block's + * stack - either a connection on newBlock, or the last NEXT_STATEMENT + * connection on the stack if the stack's being dropped before another + * block. + * @param {!Blockly.Connection} existingConnection The connection on the + * existing block, which newBlock should line up with. + */ +Blockly.BlockSvg.prototype.positionNewBlock = function(newBlock, newConnection, existingConnection) { + // We only need to position the new block if it's before the existing one, + // otherwise its position is set by the previous block. + if (newConnection.type == Blockly.NEXT_STATEMENT) { + var dx = existingConnection.x_ - newConnection.x_; + var dy = existingConnection.y_ - newConnection.y_; + + // When putting a c-block around another c-block, the outer block must + // positioned above the inner block, as its connection point will stretch + // downwards when connected. + if (newConnection == newBlock.getFirstStatementConnection()) { + dy -= existingConnection.sourceBlock_.getHeightWidth(true).height - + Blockly.BlockSvg.MIN_BLOCK_Y; + } + + newBlock.moveBy(dx, dy); + } +}; diff --git a/core/block_render_svg_vertical.js b/core/block_render_svg_vertical.js new file mode 100644 index 0000000000..0800d1c8d5 --- /dev/null +++ b/core/block_render_svg_vertical.js @@ -0,0 +1,774 @@ +/** + * @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 Methods for graphically rendering a block as SVG. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.BlockSvg.render'); + +goog.require('Blockly.BlockSvg'); + + +// UI constants for rendering blocks. +/** +* Grid unit to pixels conversion +* @const +*/ +Blockly.BlockSvg.GRID_UNIT = 4; +/** + * Horizontal space between elements. + * @const + */ +Blockly.BlockSvg.SEP_SPACE_X = 10; +/** + * Vertical space between elements. + * @const + */ +Blockly.BlockSvg.SEP_SPACE_Y = 10; +/** + * Vertical padding around inline elements. + * @const + */ +Blockly.BlockSvg.INLINE_PADDING_Y = 5; +/** + * Minimum height of a block. + * @const + */ +Blockly.BlockSvg.MIN_BLOCK_Y = 25; +/** + * Height of horizontal puzzle tab. + * @const + */ +Blockly.BlockSvg.TAB_HEIGHT = 20; +/** + * Width of horizontal puzzle tab. + * @const + */ +Blockly.BlockSvg.TAB_WIDTH = 8; +/** + * Width of vertical tab (inc left margin). + * @const + */ +Blockly.BlockSvg.NOTCH_WIDTH = 30; +/** + * Rounded corner radius. + * @const + */ +Blockly.BlockSvg.CORNER_RADIUS = 4; +/** + * Do blocks with no previous or output connections have a 'hat' on top? + * @const + */ +Blockly.BlockSvg.START_HAT = true; +/** + * Height of the top hat. + * @const + */ +Blockly.BlockSvg.START_HAT_HEIGHT = 15; +/** + * Path of the top hat's curve. + * @const + */ +Blockly.BlockSvg.START_HAT_PATH = 'c 30,-' + + Blockly.BlockSvg.START_HAT_HEIGHT + ' 70,-' + + Blockly.BlockSvg.START_HAT_HEIGHT + ' 100,0'; +/** + * SVG path for drawing next/previous notch from left to right. + * @const + */ +Blockly.BlockSvg.NOTCH_PATH_LEFT = 'l 6,4 3,0 6,-4'; +/** + * SVG path for drawing next/previous notch from right to left. + * @const + */ +Blockly.BlockSvg.NOTCH_PATH_RIGHT = 'l -6,4 -3,0 -6,-4'; +/** + * SVG path for drawing a horizontal puzzle tab from top to bottom. + * @const + */ +Blockly.BlockSvg.TAB_PATH_DOWN = 'v 5 c 0,10 -' + Blockly.BlockSvg.TAB_WIDTH + + ',-8 -' + Blockly.BlockSvg.TAB_WIDTH + ',7.5 s ' + + Blockly.BlockSvg.TAB_WIDTH + ',-2.5 ' + Blockly.BlockSvg.TAB_WIDTH + ',7.5'; +/** + * SVG start point for drawing the top-left corner. + * @const + */ +Blockly.BlockSvg.TOP_LEFT_CORNER_START = + 'm 0,' + Blockly.BlockSvg.CORNER_RADIUS; +/** + * SVG path for drawing the rounded top-left corner. + * @const + */ +Blockly.BlockSvg.TOP_LEFT_CORNER = + 'A ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',0'; + +/** + * SVG path for drawing the rounded top-right corner. + * @const + */ +Blockly.BlockSvg.TOP_RIGHT_CORNER = + 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS; + +/** + * SVG path for drawing the rounded bottom-right corner. + * @const + */ +Blockly.BlockSvg.BOTTOM_RIGHT_CORNER = + ' a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 -' + + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS; + +/** + * SVG path for drawing the rounded bottom-left corner. + * @const + */ +Blockly.BlockSvg.BOTTOM_LEFT_CORNER = + 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 -' + + Blockly.BlockSvg.CORNER_RADIUS + ',-' + + Blockly.BlockSvg.CORNER_RADIUS; +/** + * SVG path for drawing the top-left corner of a statement input. + * Includes the top notch, a horizontal space, and the rounded inside corner. + * @const + */ +Blockly.BlockSvg.INNER_TOP_LEFT_CORNER = + Blockly.BlockSvg.NOTCH_PATH_RIGHT + ' h -' + + (Blockly.BlockSvg.NOTCH_WIDTH - 15 - Blockly.BlockSvg.CORNER_RADIUS) + + ' a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 -' + + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS; +/** + * SVG path for drawing the bottom-left corner of a statement input. + * Includes the rounded inside corner. + * @const + */ +Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER = + 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + + Blockly.BlockSvg.CORNER_RADIUS + ',' + + Blockly.BlockSvg.CORNER_RADIUS; + +/** + * Height of user inputs + * @const + */ +Blockly.BlockSvg.FIELD_HEIGHT = 8 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Width of user inputs + * @const + */ +Blockly.BlockSvg.FIELD_WIDTH = 12 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Minimum width of user inputs during editing + * @const + */ +Blockly.BlockSvg.FIELD_WIDTH_MIN_EDIT = 13 * Blockly.BlockSvg.GRID_UNIT; + +/** + * Maximum width of user inputs during editing + * @const + */ +Blockly.BlockSvg.FIELD_WIDTH_MAX_EDIT = Infinity; + +/** + * Maximum height of user inputs during editing + * @const + */ +Blockly.BlockSvg.FIELD_HEIGHT_MAX_EDIT = Blockly.BlockSvg.FIELD_WIDTH; + +/** + * Top padding of user inputs + * @const + */ +Blockly.BlockSvg.FIELD_TOP_PADDING = 0; + +/** + * Max text display length for a field (per-horizontal/vertical) + * @const + */ +Blockly.BlockSvg.MAX_DISPLAY_LENGTH = Infinity; + +/** + * Change the colour of a block. + */ +Blockly.BlockSvg.prototype.updateColour = function() { + var strokeColour = this.getColourTertiary(); + if (this.isShadow() && this.parentBlock_) { + // Pull shadow block stroke colour from parent block's tertiary if possible. + strokeColour = this.parentBlock_.getColourTertiary(); + } + + // Render block stroke + this.svgPath_.setAttribute('stroke', strokeColour); + + // Render block fill + var fillColour = (this.isGlowingBlock_) ? this.getColourSecondary() : this.getColour(); + this.svgPath_.setAttribute('fill', fillColour); + + // Render opacity + this.svgPath_.setAttribute('fill-opacity', this.getOpacity()); + + // Render icon(s) if applicable + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].updateColour(); + } + + // Bump every dropdown to change its colour. + for (var x = 0, input; input = this.inputList[x]; x++) { + for (var y = 0, field; field = input.fieldRow[y]; y++) { + field.setText(null); + } + } +}; + +/** + * Returns a bounding box describing the dimensions of this block + * and any blocks stacked below it. + * @return {!{height: number, width: number}} Object with height and width properties. + */ +Blockly.BlockSvg.prototype.getHeightWidth = function() { + var height = this.height; + var width = this.width; + // Recursively add size of subsequent blocks. + var nextBlock = this.getNextBlock(); + if (nextBlock) { + var nextHeightWidth = nextBlock.getHeightWidth(); + height += nextHeightWidth.height - 4; // Height of tab. + width = Math.max(width, nextHeightWidth.width); + } else if (!this.nextConnection && !this.outputConnection) { + // Add a bit of margin under blocks with no bottom tab. + height += 2; + } + return {height: height, width: width}; +}; + +/** + * Render the block. + * Lays out and reflows a block based on its contents and settings. + * @param {boolean=} opt_bubble If false, just render this block. + * If true, also render block's parent, grandparent, etc. Defaults to true. + */ +Blockly.BlockSvg.prototype.render = function(opt_bubble) { + Blockly.Field.startCache(); + this.rendered = true; + + var cursorX = Blockly.BlockSvg.SEP_SPACE_X; + if (this.RTL) { + cursorX = -cursorX; + } + // Move the icons into position. + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + cursorX = icons[i].renderIcon(cursorX); + } + cursorX += this.RTL ? + Blockly.BlockSvg.SEP_SPACE_X : -Blockly.BlockSvg.SEP_SPACE_X; + // If there are no icons, cursorX will be 0, otherwise it will be the + // width that the first label needs to move over by. + + var inputRows = this.renderCompute_(cursorX); + this.renderDraw_(cursorX, inputRows); + + if (opt_bubble !== false) { + // Render all blocks above this one (propagate a reflow). + var parentBlock = this.getParent(); + if (parentBlock) { + parentBlock.render(true); + } else { + // Top-most block. Fire an event to allow scrollbars to resize. + Blockly.asyncSvgResize(this.workspace); + } + } + Blockly.Field.stopCache(); +}; + +/** + * Render a list of fields starting at the specified location. + * @param {!Array.} fieldList List of fields. + * @param {number} cursorX X-coordinate to start the fields. + * @param {number} cursorY Y-coordinate to start the fields. + * @return {number} X-coordinate of the end of the field row (plus a gap). + * @private + */ +Blockly.BlockSvg.prototype.renderFields_ = + function(fieldList, cursorX, cursorY) { + cursorY += Blockly.BlockSvg.INLINE_PADDING_Y; + if (this.RTL) { + cursorX = -cursorX; + } + for (var t = 0, field; field = fieldList[t]; t++) { + var root = field.getSvgRoot(); + if (!root) { + continue; + } + if (this.RTL) { + cursorX -= field.renderSep + field.renderWidth; + root.setAttribute('transform', + 'translate(' + cursorX + ',' + cursorY + ')'); + if (field.renderWidth) { + cursorX -= Blockly.BlockSvg.SEP_SPACE_X; + } + } else { + root.setAttribute('transform', + 'translate(' + (cursorX + field.renderSep) + ',' + cursorY + ')'); + if (field.renderWidth) { + cursorX += field.renderSep + field.renderWidth + + Blockly.BlockSvg.SEP_SPACE_X; + } + } + } + return this.RTL ? -cursorX : cursorX; +}; + +/** + * Computes the height and widths for each row and field. + * @param {number} iconWidth Offset of first row due to icons. + * @return {!Array.>} 2D array of objects, each containing + * position information. + * @private + */ +Blockly.BlockSvg.prototype.renderCompute_ = function(iconWidth) { + var inputList = this.inputList; + var inputRows = []; + inputRows.rightEdge = iconWidth + Blockly.BlockSvg.SEP_SPACE_X * 2; + if (this.previousConnection || this.nextConnection) { + inputRows.rightEdge = Math.max(inputRows.rightEdge, + Blockly.BlockSvg.NOTCH_WIDTH + Blockly.BlockSvg.SEP_SPACE_X); + } + var fieldValueWidth = 0; // Width of longest external value field. + var fieldStatementWidth = 0; // Width of longest statement field. + var hasValue = false; + var hasStatement = false; + var hasDummy = false; + var lastType = undefined; + + for (var i = 0, input; input = inputList[i]; i++) { + if (!input.isVisible()) { + continue; + } + var row; + if (!lastType || + lastType == Blockly.NEXT_STATEMENT || + input.type == Blockly.NEXT_STATEMENT) { + // Create new row. + lastType = input.type; + row = []; + if (input.type != Blockly.NEXT_STATEMENT) { + row.type = Blockly.BlockSvg.INLINE; + } else { + row.type = input.type; + } + row.height = 0; + inputRows.push(row); + } else { + row = inputRows[inputRows.length - 1]; + } + row.push(input); + + // Compute minimum input size. + input.renderHeight = Blockly.BlockSvg.MIN_BLOCK_Y; + // The width is currently only needed for inline value inputs. + if (input.type == Blockly.INPUT_VALUE) { + input.renderWidth = Blockly.BlockSvg.TAB_WIDTH + + Blockly.BlockSvg.SEP_SPACE_X * 1.25; + } else { + input.renderWidth = 0; + } + // Expand input size if there is a connection. + if (input.connection && input.connection.isConnected()) { + var linkedBlock = input.connection.targetBlock(); + var bBox = linkedBlock.getHeightWidth(); + input.renderHeight = Math.max(input.renderHeight, bBox.height); + input.renderWidth = Math.max(input.renderWidth, bBox.width); + } + + row.height = Math.max(row.height, input.renderHeight); + input.fieldWidth = 0; + if (inputRows.length == 1) { + // The first row gets shifted to accommodate any icons. + input.fieldWidth += this.RTL ? -iconWidth : iconWidth; + } + var previousFieldEditable = false; + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (j != 0) { + input.fieldWidth += Blockly.BlockSvg.SEP_SPACE_X; + } + // Get the dimensions of the field. + var fieldSize = field.getSize(); + field.renderWidth = fieldSize.width; + field.renderSep = (previousFieldEditable && field.EDITABLE) ? + Blockly.BlockSvg.SEP_SPACE_X : 0; + input.fieldWidth += field.renderWidth + field.renderSep; + row.height = Math.max(row.height, fieldSize.height); + previousFieldEditable = field.EDITABLE; + } + + if (row.type != Blockly.BlockSvg.INLINE) { + if (row.type == Blockly.NEXT_STATEMENT) { + hasStatement = true; + fieldStatementWidth = Math.max(fieldStatementWidth, input.fieldWidth); + } else { + if (row.type == Blockly.INPUT_VALUE) { + hasValue = true; + } else if (row.type == Blockly.DUMMY_INPUT) { + hasDummy = true; + } + fieldValueWidth = Math.max(fieldValueWidth, input.fieldWidth); + } + } + } + + // Make inline rows a bit thicker in order to enclose the values. + for (var y = 0, row; row = inputRows[y]; y++) { + row.thicker = false; + if (row.type == Blockly.BlockSvg.INLINE) { + for (var z = 0, input; input = row[z]; z++) { + if (input.type == Blockly.INPUT_VALUE) { + row.height += 2 * Blockly.BlockSvg.INLINE_PADDING_Y; + row.thicker = true; + break; + } + } + } + } + + // Compute the statement edge. + // This is the width of a block where statements are nested. + inputRows.statementEdge = 2 * Blockly.BlockSvg.SEP_SPACE_X + + fieldStatementWidth; + // Compute the preferred right edge. Inline blocks may extend beyond. + // This is the width of the block where external inputs connect. + if (hasStatement) { + inputRows.rightEdge = Math.max(inputRows.rightEdge, + inputRows.statementEdge + Blockly.BlockSvg.NOTCH_WIDTH); + } + if (hasValue) { + inputRows.rightEdge = Math.max(inputRows.rightEdge, fieldValueWidth + + Blockly.BlockSvg.SEP_SPACE_X * 2 + Blockly.BlockSvg.TAB_WIDTH); + } else if (hasDummy) { + inputRows.rightEdge = Math.max(inputRows.rightEdge, fieldValueWidth + + Blockly.BlockSvg.SEP_SPACE_X * 2); + } + + inputRows.hasValue = hasValue; + inputRows.hasStatement = hasStatement; + inputRows.hasDummy = hasDummy; + return inputRows; +}; + + +/** + * Draw the path of the block. + * Move the fields to the correct locations. + * @param {number} iconWidth Offset of first row due to icons. + * @param {!Array.>} inputRows 2D array of objects, each + * containing position information. + * @private + */ +Blockly.BlockSvg.prototype.renderDraw_ = function(iconWidth, inputRows) { + this.startHat_ = false; + // Should the top left corners be rounded or square? + // Currently, it is squared only if it's a hat. + this.squareTopLeftCorner_ = false; + if (Blockly.BlockSvg.START_HAT && !this.outputConnection && !this.previousConnection) { + // No output or previous connection. + this.squareTopLeftCorner_ = true; + this.startHat_ = true; + inputRows.rightEdge = Math.max(inputRows.rightEdge, 100); + } + + // Fetch the block's coordinates on the surface for use in anchoring + // the connections. + var connectionsXY = this.getRelativeToSurfaceXY(); + + // Assemble the block's path. + var steps = []; + + this.renderDrawTop_(steps, connectionsXY, + inputRows.rightEdge); + var cursorY = this.renderDrawRight_(steps, + connectionsXY, inputRows, iconWidth); + this.renderDrawBottom_(steps, connectionsXY, cursorY); + this.renderDrawLeft_(steps, connectionsXY, cursorY); + + var pathString = steps.join(' '); + this.svgPath_.setAttribute('d', pathString); + + if (this.RTL) { + // Mirror the block's path. + // This is awesome. + this.svgPath_.setAttribute('transform', 'scale(-1 1)'); + } +}; + +/** + * Render the top edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Object} connectionsXY Location of block. + * @param {number} rightEdge Minimum width of block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawTop_ = + function(steps, connectionsXY, rightEdge) { + // Position the cursor at the top-left starting point. + if (this.squareTopLeftCorner_) { + steps.push('m 0,0'); + if (this.startHat_) { + steps.push(Blockly.BlockSvg.START_HAT_PATH); + } + } else { + steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_START); + // Top-left rounded corner. + steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER); + } + + // Top edge. + if (this.previousConnection) { + steps.push('H', Blockly.BlockSvg.NOTCH_WIDTH - 15); + steps.push(Blockly.BlockSvg.NOTCH_PATH_LEFT); + // Create previous block connection. + var connectionX = connectionsXY.x + (this.RTL ? + -Blockly.BlockSvg.NOTCH_WIDTH : Blockly.BlockSvg.NOTCH_WIDTH); + var connectionY = connectionsXY.y; + this.previousConnection.moveTo(connectionX, connectionY); + // This connection will be tightened when the parent renders. + } + steps.push('H', rightEdge); + this.width = rightEdge; +}; + +/** + * Render the right edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Object} connectionsXY Location of block. + * @param {!Array.>} inputRows 2D array of objects, each + * containing position information. + * @param {number} iconWidth Offset of first row due to icons. + * @return {number} Height of block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawRight_ = function(steps, + connectionsXY, inputRows, iconWidth) { + var cursorX; + var cursorY = -1; // Blocks overhang their parent by 1px. + var connectionX, connectionY; + for (var y = 0, row; row = inputRows[y]; y++) { + cursorX = Blockly.BlockSvg.SEP_SPACE_X; + if (y == 0) { + cursorX += this.RTL ? -iconWidth : iconWidth; + } + + if (row.type == Blockly.BlockSvg.INLINE) { + // Inline inputs. + for (var x = 0, input; input = row[x]; x++) { + var fieldX = cursorX; + var fieldY = cursorY; + if (row.thicker) { + // Lower the field slightly. + fieldY += Blockly.BlockSvg.INLINE_PADDING_Y; + } + // TODO: Align inline field rows (left/right/centre). + cursorX = this.renderFields_(input.fieldRow, fieldX, fieldY); + if (input.type != Blockly.DUMMY_INPUT) { + cursorX += input.renderWidth + Blockly.BlockSvg.SEP_SPACE_X; + } + if (input.type == Blockly.INPUT_VALUE) { + // Create inline input connection. + if (this.RTL) { + connectionX = connectionsXY.x - cursorX - + Blockly.BlockSvg.TAB_WIDTH + Blockly.BlockSvg.SEP_SPACE_X + + input.renderWidth + 1; + } else { + connectionX = connectionsXY.x + cursorX + + Blockly.BlockSvg.TAB_WIDTH - Blockly.BlockSvg.SEP_SPACE_X - + input.renderWidth - 1; + } + connectionY = connectionsXY.y + cursorY + + Blockly.BlockSvg.INLINE_PADDING_Y + 1; + input.connection.moveTo(connectionX, connectionY); + if (input.connection.isConnected()) { + input.connection.tighten_(); + } + } + } + + cursorX = Math.max(cursorX, inputRows.rightEdge); + this.width = Math.max(this.width, cursorX); + steps.push('H', cursorX); + steps.push(Blockly.BlockSvg.TOP_RIGHT_CORNER); + // Subtract CORNER_RADIUS * 2 to account for the top right corner + // and also the bottom right corner. Only move vertically the non-corner length. + steps.push('v', row.height - Blockly.BlockSvg.CORNER_RADIUS * 2); + } else if (row.type == Blockly.DUMMY_INPUT) { + // External naked field. + var input = row[0]; + var fieldX = cursorX; + var fieldY = cursorY; + if (input.align != Blockly.ALIGN_LEFT) { + var fieldRightX = inputRows.rightEdge - input.fieldWidth - + 2 * Blockly.BlockSvg.SEP_SPACE_X; + if (inputRows.hasValue) { + fieldRightX -= Blockly.BlockSvg.TAB_WIDTH; + } + if (input.align == Blockly.ALIGN_RIGHT) { + fieldX += fieldRightX; + } else if (input.align == Blockly.ALIGN_CENTRE) { + fieldX += fieldRightX / 2; + } + } + this.renderFields_(input.fieldRow, fieldX, fieldY); + steps.push('v', row.height); + } else if (row.type == Blockly.NEXT_STATEMENT) { + // Nested statement. + var input = row[0]; + var fieldX = cursorX; + var fieldY = cursorY; + if (input.align != Blockly.ALIGN_LEFT) { + var fieldRightX = inputRows.statementEdge - input.fieldWidth - + 2 * Blockly.BlockSvg.SEP_SPACE_X; + if (input.align == Blockly.ALIGN_RIGHT) { + fieldX += fieldRightX; + } else if (input.align == Blockly.ALIGN_CENTRE) { + fieldX += fieldRightX / 2; + } + } + this.renderFields_(input.fieldRow, fieldX, fieldY); + cursorX = inputRows.statementEdge + Blockly.BlockSvg.NOTCH_WIDTH; + steps.push(Blockly.BlockSvg.BOTTOM_RIGHT_CORNER); + steps.push('H', cursorX); + steps.push(Blockly.BlockSvg.INNER_TOP_LEFT_CORNER); + steps.push('v', row.height - 2 * Blockly.BlockSvg.CORNER_RADIUS); + steps.push(Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER); + steps.push('H', inputRows.rightEdge); + + // Create statement connection. + connectionX = connectionsXY.x + (this.RTL ? -cursorX : cursorX + 1); + connectionY = connectionsXY.y + cursorY + 1; + input.connection.moveTo(connectionX, connectionY); + if (input.connection.isConnected()) { + input.connection.tighten_(); + this.width = Math.max(this.width, inputRows.statementEdge + + input.connection.targetBlock().getHeightWidth().width); + } + if (y == inputRows.length - 1 || + inputRows[y + 1].type == Blockly.NEXT_STATEMENT) { + // If the final input is a statement stack, add a small row underneath. + // Consecutive statement stacks are also separated by a small divider. + steps.push('v', Blockly.BlockSvg.SEP_SPACE_Y); + cursorY += Blockly.BlockSvg.SEP_SPACE_Y; + } + } + cursorY += row.height; + } + if (!inputRows.length) { + cursorY = Blockly.BlockSvg.MIN_BLOCK_Y; + steps.push('V', cursorY); + } + return cursorY; +}; + +/** + * Render the bottom edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Object} connectionsXY Location of block. + * @param {number} cursorY Height of block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawBottom_ = function(steps, connectionsXY, + cursorY) { + this.height = cursorY; + steps.push(Blockly.BlockSvg.BOTTOM_RIGHT_CORNER); + if (this.nextConnection) { + steps.push('H', (Blockly.BlockSvg.NOTCH_WIDTH + (this.RTL ? 0.5 : - 0.5)) + + ' ' + Blockly.BlockSvg.NOTCH_PATH_RIGHT); + // Create next block connection. + var connectionX; + if (this.RTL) { + connectionX = connectionsXY.x - Blockly.BlockSvg.NOTCH_WIDTH; + } else { + connectionX = connectionsXY.x + Blockly.BlockSvg.NOTCH_WIDTH; + } + var connectionY = connectionsXY.y + cursorY + 1; + this.nextConnection.moveTo(connectionX, connectionY); + if (this.nextConnection.isConnected()) { + this.nextConnection.tighten_(); + } + this.height += 4; // Height of tab. + } + // Bottom horizontal line + steps.push('H', Blockly.BlockSvg.CORNER_RADIUS); + // Bottom left corner + steps.push(Blockly.BlockSvg.BOTTOM_LEFT_CORNER); +}; + +/** + * Render the left edge of the block. + * @param {!Array.} steps Path of block outline. + * @param {!Object} connectionsXY Location of block. + * @param {number} cursorY Height of block. + * @private + */ +Blockly.BlockSvg.prototype.renderDrawLeft_ = + function(steps, connectionsXY, cursorY) { + if (this.outputConnection) { + // Create output connection. + this.outputConnection.moveTo(connectionsXY.x, connectionsXY.y); + // This connection will be tightened when the parent renders. + } + steps.push('z'); +}; + +/** + * Position an new block correctly, so that it doesn't move the existing block + * when connected to it. + * @param {!Blockly.Block} newBlock The block to position - either the first + * block in a dragged stack or an insertion marker. + * @param {!Blockly.Connection} newConnection The connection on the new block's + * stack - either a connection on newBlock, or the last NEXT_STATEMENT + * connection on the stack if the stack's being dropped before another + * block. + * @param {!Blockly.Connection} existingConnection The connection on the + * existing block, which newBlock should line up with. + */ +Blockly.BlockSvg.prototype.positionNewBlock = + function(newBlock, newConnection, existingConnection) { + // We only need to position the new block if it's before the existing one, + // otherwise its position is set by the previous block. + if (newConnection.type == Blockly.NEXT_STATEMENT) { + var dx = existingConnection.x_ - newConnection.x_; + var dy = existingConnection.y_ - newConnection.y_; + + newBlock.moveBy(dx, dy); + } +}; diff --git a/core/block_svg.js b/core/block_svg.js index 8bf9625330..c62162199d 100644 --- a/core/block_svg.js +++ b/core/block_svg.js @@ -28,6 +28,7 @@ goog.provide('Blockly.BlockSvg'); goog.require('Blockly.Block'); goog.require('Blockly.ContextMenu'); +goog.require('Blockly.RenderedConnection'); goog.require('goog.Timer'); goog.require('goog.asserts'); goog.require('goog.dom'); @@ -48,19 +49,19 @@ goog.require('goog.userAgent'); */ Blockly.BlockSvg = function(workspace, prototypeName, opt_id) { // Create core elements for the block. - /** @type {SVGElement} */ + /** + * @type {SVGElement} + * @private + */ this.svgGroup_ = Blockly.createSvgElement('g', {}, null); /** @type {SVGElement} */ - this.svgPathDark_ = Blockly.createSvgElement('path', - {'class': 'blocklyPathDark', 'transform': 'translate(1,1)'}, - this.svgGroup_); - /** @type {SVGElement} */ this.svgPath_ = Blockly.createSvgElement('path', {'class': 'blocklyPath'}, this.svgGroup_); - /** @type {SVGElement} */ - this.svgPathLight_ = Blockly.createSvgElement('path', - {'class': 'blocklyPathLight'}, this.svgGroup_); this.svgPath_.tooltip = this; + + /** @type {boolean} */ + this.rendered = false; + Blockly.Tooltip.bindMouseEvents(this.svgPath_); Blockly.BlockSvg.superClass_.constructor.call(this, workspace, prototypeName, opt_id); @@ -69,13 +70,23 @@ goog.inherits(Blockly.BlockSvg, Blockly.Block); /** * Height of this block, not including any statement blocks above or below. + * @type {number} */ Blockly.BlockSvg.prototype.height = 0; + /** * Width of this block, including any connected value blocks. + * @type {number} */ Blockly.BlockSvg.prototype.width = 0; +/** + * Opacity of this block between 0 and 1. + * @type {number} + * @private + */ +Blockly.BlockSvg.prototype.opacity_ = 1; + /** * Original location of block being dragged. * @type {goog.math.Coordinate} @@ -83,6 +94,20 @@ Blockly.BlockSvg.prototype.width = 0; */ Blockly.BlockSvg.prototype.dragStartXY_ = null; +/** + * Whether the block glows as if running. + * @type {boolean} + * @private + */ +Blockly.BlockSvg.prototype.isGlowingBlock_ = false; + +/** + * Whether the block's whole stack glows as if running. + * @type {boolean} + * @private + */ +Blockly.BlockSvg.prototype.isGlowingStack_ = false; + /** * Constant for identifying rows that are to be rendered inline. * Don't collide with Blockly.INPUT_VALUE and friends. @@ -96,12 +121,14 @@ Blockly.BlockSvg.INLINE = -1; */ Blockly.BlockSvg.prototype.initSvg = function() { goog.asserts.assert(this.workspace.rendered, 'Workspace is headless.'); - for (var i = 0, input; input = this.inputList[i]; i++) { - input.init(); - } - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].createIcon(); + if (!this.isInsertionMarker()) { // Insertion markers not allowed to have inputs or icons + for (var i = 0, input; input = this.inputList[i]; i++) { + input.init(); + } + var icons = this.getIcons(); + for (i = 0; i < icons.length; i++) { + icons[i].createIcon(); + } } this.updateColour(); this.updateMovable(); @@ -112,11 +139,6 @@ Blockly.BlockSvg.prototype.initSvg = function() { Blockly.bindEvent_(this.getSvgRoot(), 'touchstart', null, function(e) {Blockly.longStart_(e, thisBlock);}); } - // Bind an onchange function, if it exists. - if (goog.isFunction(this.onchange) && !this.eventsInit_) { - this.onchangeWrapper_ = Blockly.bindEvent_(this.workspace.getCanvas(), - 'blocklyWorkspaceChange', this, this.onchange); - } this.eventsInit_ = true; if (!this.getSvgRoot().parentNode) { @@ -128,22 +150,65 @@ Blockly.BlockSvg.prototype.initSvg = function() { * Select this block. Highlight it visually. */ Blockly.BlockSvg.prototype.select = function() { + if (this.isShadow() && this.getParent()) { + // Shadow blocks should not be selected. + this.getParent().select(); + return; + } + if (Blockly.selected == this) { + return; + } + var oldId = null; if (Blockly.selected) { + oldId = Blockly.selected.id; // Unselect any previously selected block. + Blockly.Events.disable(); Blockly.selected.unselect(); + Blockly.Events.enable(); } + var event = new Blockly.Events.Ui(null, 'selected', oldId, this.id); + event.workspaceId = this.workspace.id; + Blockly.Events.fire(event); Blockly.selected = this; this.addSelect(); - Blockly.fireUiEvent(this.workspace.getCanvas(), 'blocklySelectChange'); }; /** * Unselect this block. Remove its highlighting. */ Blockly.BlockSvg.prototype.unselect = function() { + if (Blockly.selected != this) { + return; + } + var event = new Blockly.Events.Ui(null, 'selected', this.id, null); + event.workspaceId = this.workspace.id; + Blockly.Events.fire(event); Blockly.selected = null; this.removeSelect(); - Blockly.fireUiEvent(this.workspace.getCanvas(), 'blocklySelectChange'); +}; + +/** + * Glow only this particular block, to highlight it visually as if it's running. + * @param {boolean} isGlowingBlock Whether the block should glow. + */ +Blockly.BlockSvg.prototype.setGlowBlock = function(isGlowingBlock) { + this.isGlowingBlock_ = isGlowingBlock; + this.updateColour(); +}; + +/** + * Glow the stack starting with this block, to highlight it visually as if it's running. + * @param {boolean} isGlowingStack Whether the stack starting with this block should glow. + */ +Blockly.BlockSvg.prototype.setGlowStack = function(isGlowingStack) { + this.isGlowingStack_ = isGlowingStack; + // Update the applied SVG filter if the property has changed + var svg = this.getSvgRoot(); + if (this.isGlowingStack_ && !svg.hasAttribute('filter')) { + svg.setAttribute('filter', 'url(#blocklyStackGlowFilter)'); + } else if (!this.isGlowingStack_ && svg.hasAttribute('filter')) { + svg.removeAttribute('filter'); + } }; /** @@ -201,7 +266,6 @@ Blockly.BlockSvg.onMouseMoveWrapper_ = null; * @private */ Blockly.BlockSvg.terminateDrag_ = function() { - Blockly.BlockSvg.disconnectUiStop_(); if (Blockly.BlockSvg.onMouseUpWrapper_) { Blockly.unbindEvent_(Blockly.BlockSvg.onMouseUpWrapper_); Blockly.BlockSvg.onMouseUpWrapper_ = null; @@ -211,26 +275,47 @@ Blockly.BlockSvg.terminateDrag_ = function() { Blockly.BlockSvg.onMouseMoveWrapper_ = null; } var selected = Blockly.selected; - if (Blockly.dragMode_ == 2) { + if (Blockly.dragMode_ == Blockly.DRAG_FREE) { // Terminate a drag operation. if (selected) { + if (Blockly.insertionMarker_) { + Blockly.Events.disable(); + if (Blockly.insertionMarkerConnection_) { + Blockly.BlockSvg.disconnectInsertionMarker(); + } + Blockly.insertionMarker_.dispose(); + Blockly.insertionMarker_ = null; + Blockly.Events.enable(); + } // Update the connection locations. var xy = selected.getRelativeToSurfaceXY(); var dxy = goog.math.Coordinate.difference(xy, selected.dragStartXY_); + var event = new Blockly.Events.Move(selected); + event.oldCoordinate = selected.dragStartXY_; + event.recordNew(); + Blockly.Events.fire(event); selected.moveConnections_(dxy.x, dxy.y); delete selected.draggedBubbles_; selected.setDragging_(false); + selected.moveOffDragSurface_(); selected.render(); - goog.Timer.callOnce( - selected.snapToGrid, Blockly.BUMP_DELAY / 2, selected); - goog.Timer.callOnce( - selected.bumpNeighbours_, Blockly.BUMP_DELAY, selected); + // Ensure that any stap and bump are part of this move's event group. + var group = Blockly.Events.getGroup(); + setTimeout(function() { + Blockly.Events.setGroup(group); + selected.snapToGrid(); + Blockly.Events.setGroup(false); + }, Blockly.BUMP_DELAY / 2); + setTimeout(function() { + Blockly.Events.setGroup(group); + selected.bumpNeighbours_(); + Blockly.Events.setGroup(false); + }, Blockly.BUMP_DELAY); // Fire an event to allow scrollbars to resize. - Blockly.fireUiEvent(window, 'resize'); - selected.workspace.fireChangeEvent(); + Blockly.asyncSvgResize(this.workspace); } } - Blockly.dragMode_ = 0; + Blockly.dragMode_ = Blockly.DRAG_NONE; Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); }; @@ -239,12 +324,19 @@ Blockly.BlockSvg.terminateDrag_ = function() { * @param {Blockly.BlockSvg} newParent New parent block. */ Blockly.BlockSvg.prototype.setParent = function(newParent) { + if (newParent == this.parentBlock_) { + return; + } var svgRoot = this.getSvgRoot(); if (this.parentBlock_ && svgRoot) { // Move this block up the DOM. Keep track of x/y translations. var xy = this.getRelativeToSurfaceXY(); - this.workspace.getCanvas().appendChild(svgRoot); - svgRoot.setAttribute('transform', 'translate(' + xy.x + ',' + xy.y + ')'); + // Avoid moving a block up the DOM if it's currently selected/dragging, + // so as to avoid taking things off the drag surface. + if (Blockly.selected != this) { + this.workspace.getCanvas().appendChild(svgRoot); + this.translate(xy.x, xy.y); + } } Blockly.Field.startCache(); @@ -257,6 +349,11 @@ Blockly.BlockSvg.prototype.setParent = function(newParent) { var newXY = this.getRelativeToSurfaceXY(); // Move the connections to match the child's new position. this.moveConnections_(newXY.x - oldXY.x, newXY.y - oldXY.y); + // If we are a shadow block, inherit tertiary colour. + if (this.isShadow()) { + this.setColour(this.getColour(), this.getColourSecondary(), + newParent.getColourTertiary()); + } } }; @@ -266,8 +363,12 @@ Blockly.BlockSvg.prototype.setParent = function(newParent) { * @return {!goog.math.Coordinate} Object with .x and .y properties. */ Blockly.BlockSvg.prototype.getRelativeToSurfaceXY = function() { + // The drawing surface is relative to either the workspace canvas + // or to the drag surface group. var x = 0; var y = 0; + var dragSurfaceGroup = (this.workspace.dragSurface) ? + this.workspace.dragSurface.getGroup() : null; var element = this.getSvgRoot(); if (element) { do { @@ -275,8 +376,17 @@ Blockly.BlockSvg.prototype.getRelativeToSurfaceXY = function() { var xy = Blockly.getRelativeXY_(element); x += xy.x; y += xy.y; + // If this element is the current element on the drag surface, include + // the translation of the drag surface itself. + if (this.workspace.dragSurface && + this.workspace.dragSurface.getCurrentBlock() == element) { + var surfaceTranslation = this.workspace.dragSurface.getSurfaceTranslation(); + x += surfaceTranslation.x; + y += surfaceTranslation.y; + } element = element.parentNode; - } while (element && element != this.workspace.getCanvas()); + } while (element && element != this.workspace.getCanvas() && + element != dragSurfaceGroup); } return new goog.math.Coordinate(x, y); }; @@ -287,10 +397,32 @@ Blockly.BlockSvg.prototype.getRelativeToSurfaceXY = function() { * @param {number} dy Vertical offset. */ Blockly.BlockSvg.prototype.moveBy = function(dx, dy) { + goog.asserts.assert(!this.parentBlock_, 'Block has parent.'); + var eventsEnabled = Blockly.Events.isEnabled(); + if (eventsEnabled) { + var event = new Blockly.Events.Move(this); + } var xy = this.getRelativeToSurfaceXY(); - this.getSvgRoot().setAttribute('transform', - 'translate(' + (xy.x + dx) + ',' + (xy.y + dy) + ')'); + this.translate(xy.x + dx, xy.y + dy); this.moveConnections_(dx, dy); + if (eventsEnabled) { + event.recordNew(); + Blockly.Events.fire(event); + } +}; + +/** + * Set this block to an absolute translation. + * @param {number} x Horizontal translation. + * @param {number} y Vertical translation. + * @param {boolean=} opt_use3d If set, use 3d translation. +*/ +Blockly.BlockSvg.prototype.translate = function(x, y, opt_use3d) { + if (opt_use3d) { + this.getSvgRoot().setAttribute('style', 'transform: translate3d(' + x + 'px,' + y + 'px, 0px)'); + } else { + this.getSvgRoot().setAttribute('transform', 'translate(' + x + ',' + y + ')'); + } }; /** @@ -300,7 +432,7 @@ Blockly.BlockSvg.prototype.snapToGrid = function() { if (!this.workspace) { return; // Deleted block. } - if (Blockly.dragMode_ != 0) { + if (Blockly.dragMode_ != Blockly.DRAG_NONE) { return; // Don't bump blocks during a drag. } if (this.getParent()) { @@ -328,7 +460,8 @@ Blockly.BlockSvg.prototype.snapToGrid = function() { /** * Returns a bounding box describing the dimensions of this block * and any blocks stacked below it. - * @return {!{height: number, width: number}} Object with height and width properties. + * @return {!{height: number, width: number}} Object with height and width + * properties. */ Blockly.BlockSvg.prototype.getHeightWidth = function() { var height = this.height; @@ -346,6 +479,56 @@ Blockly.BlockSvg.prototype.getHeightWidth = function() { return {height: height, width: width}; }; +/** + * Returns the coordinates of a bounding box describing the dimensions of this + * block and any blocks stacked below it. + * @return {!{topLeft: goog.math.Coordinate, bottomRight: goog.math.Coordinate}} + * Object with top left and bottom right coordinates of the bounding box. + */ +Blockly.BlockSvg.prototype.getBoundingRectangle = function() { + var blockXY = this.getRelativeToSurfaceXY(this); + var tab = this.outputConnection ? Blockly.BlockSvg.TAB_WIDTH : 0; + var blockBounds = this.getHeightWidth(); + var topLeft; + var bottomRight; + if (this.RTL) { + // Width has the tab built into it already so subtract it here. + topLeft = new goog.math.Coordinate(blockXY.x - (blockBounds.width - tab), + blockXY.y); + // Add the width of the tab/puzzle piece knob to the x coordinate + // since X is the corner of the rectangle, not the whole puzzle piece. + bottomRight = new goog.math.Coordinate(blockXY.x + tab, + blockXY.y + blockBounds.height); + } else { + // Subtract the width of the tab/puzzle piece knob to the x coordinate + // since X is the corner of the rectangle, not the whole puzzle piece. + topLeft = new goog.math.Coordinate(blockXY.x - tab, blockXY.y); + // Width has the tab built into it already so subtract it here. + bottomRight = new goog.math.Coordinate(blockXY.x + blockBounds.width - tab, + blockXY.y + blockBounds.height); + } + return {topLeft: topLeft, bottomRight: bottomRight}; +}; + +/** + * Set block opacity for SVG rendering. + * @param {number} opacity Intended opacity, betweeen 0 and 1 + */ +Blockly.BlockSvg.prototype.setOpacity = function(opacity) { + this.opacity_ = opacity; + if (this.rendered) { + this.updateColour(); + } +}; + +/** + * Get block opacity for SVG rendering. + * @return {number} Intended opacity, betweeen 0 and 1 + */ +Blockly.BlockSvg.prototype.getOpacity = function() { + return this.opacity_; +}; + /** * Set whether the block is collapsed or not. * @param {boolean} collapsed True if collapsed. @@ -363,7 +546,7 @@ Blockly.BlockSvg.prototype.setCollapsed = function(collapsed) { var COLLAPSED_INPUT_NAME = '_TEMP_COLLAPSED_INPUT'; if (collapsed) { var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { + for (i = 0; i < icons.length; i++) { icons[i].setVisible(false); } var text = this.toString(Blockly.COLLAPSE_CHARS); @@ -388,7 +571,6 @@ Blockly.BlockSvg.prototype.setCollapsed = function(collapsed) { // all their functions and store them next to each other. Expanding and // bumping causes all their definitions to go out of alignment. } - this.workspace.fireChangeEvent(); }; /** @@ -414,7 +596,7 @@ Blockly.BlockSvg.prototype.tab = function(start, forward) { } } } - var i = list.indexOf(start); + i = list.indexOf(start); if (i == -1) { // No start location, start at the beginning or end. i = forward ? -1 : list.length; @@ -439,6 +621,9 @@ Blockly.BlockSvg.prototype.tab = function(start, forward) { * @private */ Blockly.BlockSvg.prototype.onMouseDown_ = function(e) { + if (this.workspace.options.readOnly) { + return; + } if (this.isInFlyout) { e.stopPropagation(); return; @@ -449,23 +634,26 @@ Blockly.BlockSvg.prototype.onMouseDown_ = function(e) { Blockly.terminateDrag_(); this.select(); Blockly.hideChaff(); + this.workspace.recordDeleteAreas(); if (Blockly.isRightButton(e)) { // Right-click. this.showContextMenu_(e); } else if (!this.isMovable()) { - // Allow unmovable blocks to be selected and context menued, but not + // Allow immovable blocks to be selected and context menued, but not // dragged. Let this event bubble up to document, so the workspace may be // dragged instead. return; } else { + if (!Blockly.Events.getGroup()) { + Blockly.Events.setGroup(true); + } // Left-click (or middle click) - Blockly.removeAllRanges(); Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); this.dragStartXY_ = this.getRelativeToSurfaceXY(); - this.workspace.startDrag(e, this.dragStartXY_.x, this.dragStartXY_.y); + this.workspace.startDrag(e, this.dragStartXY_); - Blockly.dragMode_ = 1; + Blockly.dragMode_ = Blockly.DRAG_STICKY; Blockly.BlockSvg.onMouseUpWrapper_ = Blockly.bindEvent_(document, 'mouseup', this, this.onMouseUp_); Blockly.BlockSvg.onMouseMoveWrapper_ = Blockly.bindEvent_(document, @@ -484,6 +672,7 @@ Blockly.BlockSvg.prototype.onMouseDown_ = function(e) { } // This event has been handled. No need to bubble up to the document. e.stopPropagation(); + e.preventDefault(); }; /** @@ -494,20 +683,23 @@ Blockly.BlockSvg.prototype.onMouseDown_ = function(e) { * @private */ Blockly.BlockSvg.prototype.onMouseUp_ = function(e) { + var isNotShadowBlock = this.ioClickHackIsNotShadow_(e); + if (Blockly.dragMode_ != Blockly.DRAG_FREE && !Blockly.WidgetDiv.isVisible() && isNotShadowBlock) { + Blockly.Events.fire( + new Blockly.Events.Ui(this, 'click', undefined, undefined)); + } Blockly.terminateDrag_(); if (Blockly.selected && Blockly.highlightedConnection_) { + this.positionNewBlock(Blockly.selected, + Blockly.localConnection_, Blockly.highlightedConnection_); // Connect two blocks together. Blockly.localConnection_.connect(Blockly.highlightedConnection_); if (this.rendered) { // Trigger a connection animation. // Determine which connection is inferior (lower in the source stack). - var inferiorConnection; - if (Blockly.localConnection_.isSuperior()) { - inferiorConnection = Blockly.highlightedConnection_; - } else { - inferiorConnection = Blockly.localConnection_; - } - inferiorConnection.sourceBlock_.connectionUiEffect(); + var inferiorConnection = Blockly.localConnection_.isSuperior() ? + Blockly.highlightedConnection_ : Blockly.localConnection_; + inferiorConnection.getSourceBlock().connectionUiEffect(); } if (this.workspace.trashcan) { // Don't throw an object in the trash can if it just got connected. @@ -523,13 +715,38 @@ Blockly.BlockSvg.prototype.onMouseUp_ = function(e) { // Dropping a block on the trash can will usually cause the workspace to // resize to contain the newly positioned block. Force a second resize // now that the block has been deleted. - Blockly.fireUiEvent(window, 'resize'); + Blockly.asyncSvgResize(this.workspace); } if (Blockly.highlightedConnection_) { - Blockly.highlightedConnection_.unhighlight(); Blockly.highlightedConnection_ = null; } Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); + if (!Blockly.WidgetDiv.isVisible()) { + Blockly.Events.setGroup(false); + } +}; + +/** + * XXX: Hack to fix drop-down clicking issue for Google I/O. + * We cannot just check isShadow, since `this` is the parent block. + * See: https://github.com/google/blockly/issues/336 + * @param {!Event} e Mouse up event. + * @return {boolean} True if the block is not the drop-down shadow. + */ +Blockly.BlockSvg.prototype.ioClickHackIsNotShadow_ = function(e) { + // True if click target is a non-shadow block path. + if (e.target === this.svgPath_ && + e.target.parentNode === this.getSvgRoot()) { + return true; + } + for (var i = 0, input; input = this.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field.imageElement_ && field.imageElement_ === e.target) { + return true; + } + } + } + return false; }; /** @@ -539,7 +756,8 @@ Blockly.BlockSvg.prototype.onMouseUp_ = function(e) { Blockly.BlockSvg.prototype.showHelp_ = function() { var url = goog.isFunction(this.helpUrl) ? this.helpUrl() : this.helpUrl; if (url) { - window.open(url); + // @todo rewrite + alert(url); } }; @@ -570,8 +788,7 @@ Blockly.BlockSvg.prototype.showContextMenu_ = function(e) { } menuOptions.push(duplicateOption); - if (this.isEditable() && !this.collapsed_ && - this.workspace.options.comments) { + if (this.isEditable() && this.workspace.options.comments) { // Option to add/remove a comment. var commentOption = {enabled: !goog.userAgent.IE}; if (this.comment) { @@ -588,72 +805,22 @@ Blockly.BlockSvg.prototype.showContextMenu_ = function(e) { menuOptions.push(commentOption); } - // Option to make block inline. - if (!this.collapsed_) { - for (var i = 1; i < this.inputList.length; i++) { - if (this.inputList[i - 1].type != Blockly.NEXT_STATEMENT && - this.inputList[i].type != Blockly.NEXT_STATEMENT) { - // Only display this option if there are two value or dummy inputs - // next to each other. - var inlineOption = {enabled: true}; - var isInline = this.getInputsInline(); - inlineOption.text = isInline ? - Blockly.Msg.EXTERNAL_INPUTS : Blockly.Msg.INLINE_INPUTS; - inlineOption.callback = function() { - block.setInputsInline(!isInline); - }; - menuOptions.push(inlineOption); - break; - } - } - } - - if (this.workspace.options.collapse) { - // Option to collapse/expand block. - if (this.collapsed_) { - var expandOption = {enabled: true}; - expandOption.text = Blockly.Msg.EXPAND_BLOCK; - expandOption.callback = function() { - block.setCollapsed(false); - }; - menuOptions.push(expandOption); - } else { - var collapseOption = {enabled: true}; - collapseOption.text = Blockly.Msg.COLLAPSE_BLOCK; - collapseOption.callback = function() { - block.setCollapsed(true); - }; - menuOptions.push(collapseOption); - } - } - - if (this.workspace.options.disable) { - // Option to disable/enable block. - var disableOption = { - text: this.disabled ? - Blockly.Msg.ENABLE_BLOCK : Blockly.Msg.DISABLE_BLOCK, - enabled: !this.getInheritedDisabled(), - callback: function() { - block.setDisabled(!block.disabled); - } - }; - menuOptions.push(disableOption); - } - // Option to delete this block. // Count the number of blocks that are nested in this block. - var descendantCount = this.getDescendants().length; + var descendantCount = this.getDescendants(true).length; var nextBlock = this.getNextBlock(); if (nextBlock) { // Blocks in the current stack would survive this block's deletion. - descendantCount -= nextBlock.getDescendants().length; + descendantCount -= nextBlock.getDescendants(true).length; } var deleteOption = { text: descendantCount == 1 ? Blockly.Msg.DELETE_BLOCK : Blockly.Msg.DELETE_X_BLOCKS.replace('%1', String(descendantCount)), enabled: true, callback: function() { + Blockly.Events.setGroup(true); block.dispose(true, true); + Blockly.Events.setGroup(false); } }; menuOptions.push(deleteOption); @@ -695,12 +862,12 @@ Blockly.BlockSvg.prototype.moveConnections_ = function(dx, dy) { myConnections[i].moveBy(dx, dy); } var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { + for (i = 0; i < icons.length; i++) { icons[i].computeIconLocation(); } // Recurse through all blocks attached under this one. - for (var i = 0; i < this.childBlocks_.length; i++) { + for (i = 0; i < this.childBlocks_.length; i++) { this.childBlocks_[i].moveConnections_(dx, dy); } }; @@ -713,8 +880,11 @@ Blockly.BlockSvg.prototype.moveConnections_ = function(dx, dy) { Blockly.BlockSvg.prototype.setDragging_ = function(adding) { if (adding) { this.addDragging(); + Blockly.draggingConnections_ = + Blockly.draggingConnections_.concat(this.getConnections_(true)); } else { this.removeDragging(); + Blockly.draggingConnections_ = []; } // Recurse through all blocks attached under this one. for (var i = 0; i < this.childBlocks_.length; i++) { @@ -722,6 +892,49 @@ Blockly.BlockSvg.prototype.setDragging_ = function(adding) { } }; +/** + * Move this block to its workspace's drag surface, accounting for positioning. + * Generally should be called at the same time as setDragging_(true). + * @private + */ +Blockly.BlockSvg.prototype.moveToDragSurface_ = function() { + // The translation for drag surface blocks, + // is equal to the current relative-to-surface position, + // to keep the position in sync as it move on/off the surface. + var xy = this.getRelativeToSurfaceXY(); + this.clearTransformAttributes_(); + this.workspace.dragSurface.translateSurface(xy.x, xy.y); + // Execute the move on the top-level SVG component + this.workspace.dragSurface.setBlocksAndShow(this.getSvgRoot()); +}; + +/** + * Move this block back to the workspace block canvas. + * Generally should be called at the same time as setDragging_(false). + * @private + */ +Blockly.BlockSvg.prototype.moveOffDragSurface_ = function() { + // Translate to current position, turning off 3d. + var xy = this.getRelativeToSurfaceXY(); + this.clearTransformAttributes_(); + this.translate(xy.x, xy.y, false); + this.workspace.dragSurface.clearAndHide(this.workspace.getCanvas()); +}; + +/** + * Clear the block of style="..." and transform="..." attributes. + * Used when the block is switching from 3d to 2d transform or vice versa. + * @private + */ +Blockly.BlockSvg.prototype.clearTransformAttributes_ = function() { + if (this.getSvgRoot().hasAttribute('transform')) { + this.getSvgRoot().removeAttribute('transform'); + } + if (this.getSvgRoot().hasAttribute('style')) { + this.getSvgRoot().removeAttribute('style'); + } +}; + /** * Drag this block to follow the mouse. * @param {!Event} e Mouse move event. @@ -738,81 +951,227 @@ Blockly.BlockSvg.prototype.onMouseMove_ = function(e) { e.stopPropagation(); return; } - Blockly.removeAllRanges(); var oldXY = this.getRelativeToSurfaceXY(); var newXY = this.workspace.moveDrag(e); - var group = this.getSvgRoot(); - if (Blockly.dragMode_ == 1) { + if (Blockly.dragMode_ == Blockly.DRAG_STICKY) { // Still dragging within the sticky DRAG_RADIUS. var dr = goog.math.Coordinate.distance(oldXY, newXY) * this.workspace.scale; if (dr > Blockly.DRAG_RADIUS) { // Switch to unrestricted dragging. - Blockly.dragMode_ = 2; + Blockly.dragMode_ = Blockly.DRAG_FREE; Blockly.longStop_(); - group.translate_ = ''; - group.skew_ = ''; + // Must move to drag surface before unplug(), + // or else connections will calculate the wrong relative to surface XY + // in tighten_(). Then blocks connected to this block move around on the + // drag surface. By moving to the drag surface before unplug, connection + // positions will be calculated correctly. + this.moveToDragSurface_(); + // Clear WidgetDiv/DropDownDiv without animating, in case blocks are moved + // around + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); if (this.parentBlock_) { // Push this block to the very top of the stack. - this.setParent(null); - this.disconnectUiEffect(); + this.unplug(); } this.setDragging_(true); - this.workspace.recordDeleteAreas(); } } - if (Blockly.dragMode_ == 2) { - // Unrestricted dragging. - var dx = oldXY.x - this.dragStartXY_.x; - var dy = oldXY.y - this.dragStartXY_.y; - group.translate_ = 'translate(' + newXY.x + ',' + newXY.y + ')'; - group.setAttribute('transform', group.translate_ + group.skew_); - // Drag all the nested bubbles. - for (var i = 0; i < this.draggedBubbles_.length; i++) { - var commentData = this.draggedBubbles_[i]; - commentData.bubble.setIconLocation(commentData.x + dx, - commentData.y + dy); + if (Blockly.dragMode_ == Blockly.DRAG_FREE) { + this.handleDragFree_(oldXY, newXY, e); + } + // This event has been handled. No need to bubble up to the document. + e.stopPropagation(); + e.preventDefault(); +}; + +/** + * Handle a mouse movement when a block is already freely dragging. + * @param {!goog.math.Coordinate} oldXY The position of the block on screen + * before the most recent mouse movement. + * @param {!goog.math.Coordinate} newXY The new location after applying the + * mouse movement. + * @param {!Event} e Mouse move event. + * @private + */ +Blockly.BlockSvg.prototype.handleDragFree_ = function(oldXY, newXY, e) { + var dxy = goog.math.Coordinate.difference(oldXY, this.dragStartXY_); + this.workspace.dragSurface.translateSurface(newXY.x, newXY.y); + // Drag all the nested bubbles. + for (var i = 0; i < this.draggedBubbles_.length; i++) { + var commentData = this.draggedBubbles_[i]; + commentData.bubble.setIconLocation( + goog.math.Coordinate.sum(commentData, dxy)); + } + + // Check to see if any of this block's connections are within range of + // another block's connection. + var myConnections = this.getConnections_(false); + // Also check the last connection on this stack + var lastOnStack = this.lastConnectionInStack_(); + if (lastOnStack && lastOnStack != this.nextConnection) { + myConnections.push(lastOnStack); + } + var closestConnection = null; + var localConnection = null; + var radiusConnection = Blockly.SNAP_RADIUS; + for (i = 0; i < myConnections.length; i++) { + var myConnection = myConnections[i]; + var neighbour = myConnection.closest(radiusConnection, dxy); + if (neighbour.connection) { + closestConnection = neighbour.connection; + localConnection = myConnection; + radiusConnection = neighbour.radius; } + } - // Check to see if any of this block's connections are within range of - // another block's connection. - var myConnections = this.getConnections_(false); - var closestConnection = null; - var localConnection = null; - var radiusConnection = Blockly.SNAP_RADIUS; - for (var i = 0; i < myConnections.length; i++) { - var myConnection = myConnections[i]; - var neighbour = myConnection.closest(radiusConnection, dx, dy); - if (neighbour.connection) { - closestConnection = neighbour.connection; - localConnection = myConnection; - radiusConnection = neighbour.radius; - } + var updatePreviews = true; + if (Blockly.localConnection_ && Blockly.highlightedConnection_) { + var xDiff = Blockly.localConnection_.x_ + dxy.x - + Blockly.highlightedConnection_.x_; + var yDiff = Blockly.localConnection_.y_ + dxy.y - + Blockly.highlightedConnection_.y_; + var curDistance = Math.sqrt(xDiff * xDiff + yDiff * yDiff); + + // Slightly prefer the existing preview over a new preview. + if (closestConnection && radiusConnection > curDistance - + Blockly.CURRENT_CONNECTION_PREFERENCE) { + updatePreviews = false; } + } - // Remove connection highlighting if needed. - if (Blockly.highlightedConnection_ && - Blockly.highlightedConnection_ != closestConnection) { - Blockly.highlightedConnection_.unhighlight(); - Blockly.highlightedConnection_ = null; - Blockly.localConnection_ = null; + if (updatePreviews) { + var candidateIsLast = (localConnection == lastOnStack); + this.updatePreviews(closestConnection, localConnection, radiusConnection, + e, newXY.x - this.dragStartXY_.x, newXY.y - this.dragStartXY_.y, + candidateIsLast); + } +}; + +/** + * Preview the results of the drag if the mouse is released immediately. + * @param {Blockly.Connection} closestConnection The closest connection found + * during the search + * @param {Blockly.Connection} localConnection The connection on the moving + * block. + * @param {number} radiusConnection The distance between closestConnection and + * localConnection. + * @param {!Event} e Mouse move event. + * @param {number} dx The x distance the block has moved onscreen up to this + * point in the drag. + * @param {number} dy The y distance the block has moved onscreen up to this + * point in the drag. + * @param {boolean} candidateIsLast True if the dragging stack is more than one + * block long and localConnection is the last connection on the stack. + */ +Blockly.BlockSvg.prototype.updatePreviews = function(closestConnection, + localConnection, radiusConnection, e, dx, dy, candidateIsLast) { + // Don't fire events for insertion marker creation or movement. + Blockly.Events.disable(); + // Remove an insertion marker if needed. For Scratch-Blockly we are using + // grayed-out blocks instead of highlighting the connection; for compatibility + // with Web Blockly the name "highlightedConnection" will still be used. + if (Blockly.highlightedConnection_ && + Blockly.highlightedConnection_ != closestConnection) { + if (Blockly.insertionMarker_ && Blockly.insertionMarkerConnection_) { + Blockly.BlockSvg.disconnectInsertionMarker(); + } + // If there's already an insertion marker but it's representing the wrong + // block, delete it so we can create the correct one. + if (Blockly.insertionMarker_ && + ((candidateIsLast && Blockly.localConnection_.sourceBlock_ == this) || + (!candidateIsLast && Blockly.localConnection_.sourceBlock_ != this))) { + Blockly.insertionMarker_.dispose(); + Blockly.insertionMarker_ = null; + } + Blockly.highlightedConnection_ = null; + Blockly.localConnection_ = null; + } + + // Add an insertion marker if needed. + if (closestConnection && + closestConnection != Blockly.highlightedConnection_ && + !closestConnection.sourceBlock_.isInsertionMarker()) { + Blockly.highlightedConnection_ = closestConnection; + Blockly.localConnection_ = localConnection; + if (!Blockly.insertionMarker_) { + Blockly.insertionMarker_ = + this.workspace.newBlock(Blockly.localConnection_.sourceBlock_.type); + Blockly.insertionMarker_.setInsertionMarker(true); + Blockly.insertionMarker_.initSvg(); } - // Add connection highlighting if needed. - if (closestConnection && - closestConnection != Blockly.highlightedConnection_) { - closestConnection.highlight(); - Blockly.highlightedConnection_ = closestConnection; - Blockly.localConnection_ = localConnection; + + var insertionMarker = Blockly.insertionMarker_; + var insertionMarkerConnection = insertionMarker.getMatchingConnection( + localConnection.sourceBlock_, localConnection); + if (insertionMarkerConnection != Blockly.insertionMarkerConnection_) { + insertionMarker.rendered = true; + // Render disconnected from everything else so that we have a valid + // connection location. + insertionMarker.render(); + insertionMarker.getSvgRoot().setAttribute('visibility', 'visible'); + + this.positionNewBlock(insertionMarker, + insertionMarkerConnection, closestConnection); + + if (insertionMarkerConnection.type == Blockly.PREVIOUS_STATEMENT && + !insertionMarker.nextConnection) { + Blockly.bumpedConnection_ = closestConnection.targetConnection; + } + // Renders insertion marker. + insertionMarkerConnection.connect(closestConnection); + Blockly.insertionMarkerConnection_ = insertionMarkerConnection; } - // Provide visual indication of whether the block will be deleted if - // dropped here. - if (this.isDeletable()) { - this.workspace.isDeleteArea(e); + } + // Reenable events. + Blockly.Events.enable(); + + // Provide visual indication of whether the block will be deleted if + // dropped here. + if (this.isDeletable()) { + this.workspace.isDeleteArea(e); + } +}; + +/** + * Disconnect the current insertion marker from the stack, and heal the stack to + * its previous state. + */ +Blockly.BlockSvg.disconnectInsertionMarker = function() { + // The insertion marker is the first block in a stack, either because it + // doesn't have a previous connection or because the previous connection is + // not connected. Unplug won't do anything in that case. Instead, unplug the + // following block. + if (Blockly.insertionMarkerConnection_ == + Blockly.insertionMarker_.nextConnection && + (!Blockly.insertionMarker_.previousConnection || + !Blockly.insertionMarker_.previousConnection.targetConnection)) { + Blockly.insertionMarkerConnection_.targetBlock().unplug(false); + } + // Inside of a C-block, first statement connection. + else if (Blockly.insertionMarkerConnection_.type == Blockly.NEXT_STATEMENT && + Blockly.insertionMarkerConnection_ != + Blockly.insertionMarker_.nextConnection) { + var innerConnection = Blockly.insertionMarkerConnection_.targetConnection; + innerConnection.sourceBlock_.unplug(false); + var previousBlockNextConnection = + Blockly.insertionMarker_.previousConnection.targetConnection; + Blockly.insertionMarker_.unplug(true); + if (previousBlockNextConnection) { + previousBlockNextConnection.connect(innerConnection); } } - // This event has been handled. No need to bubble up to the document. - e.stopPropagation(); + else { + Blockly.insertionMarker_.unplug(true /* healStack */); + } + + if (Blockly.insertionMarkerConnection_.targetConnection) { + throw 'insertionMarkerConnection still connected at the end of disconnectInsertionMarker'; + } + Blockly.insertionMarkerConnection_ = null; + Blockly.insertionMarker_.getSvgRoot().setAttribute('visibility', 'hidden'); }; /** @@ -839,13 +1198,14 @@ Blockly.BlockSvg.prototype.setMovable = function(movable) { /** * Set whether this block is editable or not. - * @param {boolean} movable True if editable. + * @param {boolean} editable True if editable. */ Blockly.BlockSvg.prototype.setEditable = function(editable) { Blockly.BlockSvg.superClass_.setEditable.call(this, editable); if (this.rendered) { - for (var i = 0; i < this.icons_.length; i++) { - this.icons_[i].updateEditable(); + var icons = this.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].updateEditable(); } } }; @@ -859,6 +1219,15 @@ Blockly.BlockSvg.prototype.setShadow = function(shadow) { this.updateColour(); }; +/** + * Set whether this block is an insertion marker block or not. + * @param {boolean} insertionMarker True if an insertion marker. + */ +Blockly.BlockSvg.prototype.setInsertionMarker = function(insertionMarker) { + Blockly.BlockSvg.superClass_.setInsertionMarker.call(this, insertionMarker); + this.updateColour(); +}; + /** * Return the root node of the SVG or null if none exists. * @return {Element} The root SVG node (probably a group). @@ -867,241 +1236,18 @@ Blockly.BlockSvg.prototype.getSvgRoot = function() { return this.svgGroup_; }; -// UI constants for rendering blocks. -/** - * Horizontal space between elements. - * @const - */ -Blockly.BlockSvg.SEP_SPACE_X = 10; -/** - * Vertical space between elements. - * @const - */ -Blockly.BlockSvg.SEP_SPACE_Y = 10; -/** - * Vertical padding around inline elements. - * @const - */ -Blockly.BlockSvg.INLINE_PADDING_Y = 5; -/** - * Minimum height of a block. - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_Y = 25; -/** - * Height of horizontal puzzle tab. - * @const - */ -Blockly.BlockSvg.TAB_HEIGHT = 20; -/** - * Width of horizontal puzzle tab. - * @const - */ -Blockly.BlockSvg.TAB_WIDTH = 8; -/** - * Width of vertical tab (inc left margin). - * @const - */ -Blockly.BlockSvg.NOTCH_WIDTH = 30; -/** - * Rounded corner radius. - * @const - */ -Blockly.BlockSvg.CORNER_RADIUS = 8; -/** - * Do blocks with no previous or output connections have a 'hat' on top? - * @const - */ -Blockly.BlockSvg.START_HAT = false; -/** - * Path of the top hat's curve. - * @const - */ -Blockly.BlockSvg.START_HAT_PATH = 'c 30,-15 70,-15 100,0'; -/** - * Path of the top hat's curve's highlight in LTR. - * @const - */ -Blockly.BlockSvg.START_HAT_HIGHLIGHT_LTR = - 'c 17.8,-9.2 45.3,-14.9 75,-8.7 M 100.5,0.5'; -/** - * Path of the top hat's curve's highlight in RTL. - * @const - */ -Blockly.BlockSvg.START_HAT_HIGHLIGHT_RTL = - 'm 25,-8.7 c 29.7,-6.2 57.2,-0.5 75,8.7'; -/** - * Distance from shape edge to intersect with a curved corner at 45 degrees. - * Applies to highlighting on around the inside of a curve. - * @const - */ -Blockly.BlockSvg.DISTANCE_45_INSIDE = (1 - Math.SQRT1_2) * - (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + 0.5; -/** - * Distance from shape edge to intersect with a curved corner at 45 degrees. - * Applies to highlighting on around the outside of a curve. - * @const - */ -Blockly.BlockSvg.DISTANCE_45_OUTSIDE = (1 - Math.SQRT1_2) * - (Blockly.BlockSvg.CORNER_RADIUS + 0.5) - 0.5; -/** - * SVG path for drawing next/previous notch from left to right. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_LEFT = 'l 6,4 3,0 6,-4'; -/** - * SVG path for drawing next/previous notch from left to right with - * highlighting. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_LEFT_HIGHLIGHT = 'l 6,4 3,0 6,-4'; -/** - * SVG path for drawing next/previous notch from right to left. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_RIGHT = 'l -6,4 -3,0 -6,-4'; -/** - * SVG path for drawing jagged teeth at the end of collapsed blocks. - * @const - */ -Blockly.BlockSvg.JAGGED_TEETH = 'l 8,0 0,4 8,4 -16,8 8,4'; -/** - * Height of SVG path for jagged teeth at the end of collapsed blocks. - * @const - */ -Blockly.BlockSvg.JAGGED_TEETH_HEIGHT = 20; -/** - * Width of SVG path for jagged teeth at the end of collapsed blocks. - * @const - */ -Blockly.BlockSvg.JAGGED_TEETH_WIDTH = 15; -/** - * SVG path for drawing a horizontal puzzle tab from top to bottom. - * @const - */ -Blockly.BlockSvg.TAB_PATH_DOWN = 'v 5 c 0,10 -' + Blockly.BlockSvg.TAB_WIDTH + - ',-8 -' + Blockly.BlockSvg.TAB_WIDTH + ',7.5 s ' + - Blockly.BlockSvg.TAB_WIDTH + ',-2.5 ' + Blockly.BlockSvg.TAB_WIDTH + ',7.5'; -/** - * SVG path for drawing a horizontal puzzle tab from top to bottom with - * highlighting from the upper-right. - * @const - */ -Blockly.BlockSvg.TAB_PATH_DOWN_HIGHLIGHT_RTL = 'v 6.5 m -' + - (Blockly.BlockSvg.TAB_WIDTH * 0.97) + ',3 q -' + - (Blockly.BlockSvg.TAB_WIDTH * 0.05) + ',10 ' + - (Blockly.BlockSvg.TAB_WIDTH * 0.3) + ',9.5 m ' + - (Blockly.BlockSvg.TAB_WIDTH * 0.67) + ',-1.9 v 1.4'; - -/** - * SVG start point for drawing the top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_START = - 'm 0,' + Blockly.BlockSvg.CORNER_RADIUS; -/** - * SVG start point for drawing the top-left corner's highlight in RTL. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_RTL = - 'm ' + Blockly.BlockSvg.DISTANCE_45_INSIDE + ',' + - Blockly.BlockSvg.DISTANCE_45_INSIDE; -/** - * SVG start point for drawing the top-left corner's highlight in LTR. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_LTR = - 'm 0.5,' + (Blockly.BlockSvg.CORNER_RADIUS - 0.5); -/** - * SVG path for drawing the rounded top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER = - 'A ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',0'; -/** - * SVG path for drawing the highlight on the rounded top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_HIGHLIGHT = - 'A ' + (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ' 0 0,1 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',0.5'; -/** - * SVG path for drawing the top-left corner of a statement input. - * Includes the top notch, a horizontal space, and the rounded inside corner. - * @const - */ -Blockly.BlockSvg.INNER_TOP_LEFT_CORNER = - Blockly.BlockSvg.NOTCH_PATH_RIGHT + ' h -' + - (Blockly.BlockSvg.NOTCH_WIDTH - 15 - Blockly.BlockSvg.CORNER_RADIUS) + - ' h -0.5 a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 -' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS; -/** - * SVG path for drawing the bottom-left corner of a statement input. - * Includes the rounded inside corner. - * @const - */ -Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER = - 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS; -/** - * SVG path for drawing highlight on the top-left corner of a statement - * input in RTL. - * @const - */ -Blockly.BlockSvg.INNER_TOP_LEFT_CORNER_HIGHLIGHT_RTL = - 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - (-Blockly.BlockSvg.DISTANCE_45_OUTSIDE - 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS - - Blockly.BlockSvg.DISTANCE_45_OUTSIDE); -/** - * SVG path for drawing highlight on the bottom-left corner of a statement - * input in RTL. - * @const - */ -Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_RTL = - 'a ' + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ' 0 0,0 ' + - (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS + 0.5); -/** - * SVG path for drawing highlight on the bottom-left corner of a statement - * input in LTR. - * @const - */ -Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_LTR = - 'a ' + (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS + 0.5) + ' 0 0,0 ' + - (Blockly.BlockSvg.CORNER_RADIUS - - Blockly.BlockSvg.DISTANCE_45_OUTSIDE) + ',' + - (Blockly.BlockSvg.DISTANCE_45_OUTSIDE + 0.5); - /** * Dispose of this block. * @param {boolean} healStack If true, then try to heal any gap by connecting * the next statement with the previous statement. Otherwise, dispose of * all children of this block. * @param {boolean} animate If true, show a disposal animation and sound. - * @param {boolean=} opt_dontRemoveFromWorkspace If true, don't remove this - * block from the workspace's list of top blocks. */ -Blockly.BlockSvg.prototype.dispose = function(healStack, animate, - opt_dontRemoveFromWorkspace) { +Blockly.BlockSvg.prototype.dispose = function(healStack, animate) { Blockly.Field.startCache(); - // Terminate onchange event calls. - if (this.onchangeWrapper_) { - Blockly.unbindEvent_(this.onchangeWrapper_); - this.onchangeWrapper_ = null; - } // If this block is being dragged, unlink the mouse events. if (Blockly.selected == this) { + this.unselect(); Blockly.terminateDrag_(); } // If this block has a context menu open, close it. @@ -1110,25 +1256,24 @@ Blockly.BlockSvg.prototype.dispose = function(healStack, animate, } if (animate && this.rendered) { - this.unplug(healStack, false); + this.unplug(healStack); this.disposeUiEffect(); } // Stop rerendering. this.rendered = false; + Blockly.Events.disable(); var icons = this.getIcons(); for (var i = 0; i < icons.length; i++) { icons[i].dispose(); } - + Blockly.Events.enable(); Blockly.BlockSvg.superClass_.dispose.call(this, healStack); goog.dom.removeNode(this.svgGroup_); // Sever JavaScript to DOM connections. this.svgGroup_ = null; this.svgPath_ = null; - this.svgPathLight_ = null; - this.svgPathDark_ = null; Blockly.Field.stopCache(); }; @@ -1153,6 +1298,13 @@ Blockly.BlockSvg.prototype.disposeUiEffect = function() { this.workspace.scale); }; +/** + * Play some UI effects (sound) after a connection has been established. + */ +Blockly.BlockSvg.prototype.connectionUiEffect = function() { + this.workspace.playAudio('click'); +}; + /** * Animate a cloned block and eventually dispose of it. * This is a class method, not an instace method since the original block has @@ -1182,191 +1334,11 @@ Blockly.BlockSvg.disposeUiStep_ = function(clone, rtl, start, workspaceScale) { } }; -/** - * Play some UI effects (sound, ripple) after a connection has been established. - */ -Blockly.BlockSvg.prototype.connectionUiEffect = function() { - this.workspace.playAudio('click'); - if (this.workspace.scale < 1) { - return; // Too small to care about visual effects. - } - // Determine the absolute coordinates of the inferior block. - var xy = Blockly.getSvgXY_(/** @type {!Element} */ (this.svgGroup_), - this.workspace); - // Offset the coordinates based on the two connection types, fix scale. - if (this.outputConnection) { - xy.x += (this.RTL ? 3 : -3) * this.workspace.scale; - xy.y += 13 * this.workspace.scale; - } else if (this.previousConnection) { - xy.x += (this.RTL ? -23 : 23) * this.workspace.scale; - xy.y += 3 * this.workspace.scale; - } - var ripple = Blockly.createSvgElement('circle', - {'cx': xy.x, 'cy': xy.y, 'r': 0, 'fill': 'none', - 'stroke': '#888', 'stroke-width': 10}, - this.workspace.getParentSvg()); - // Start the animation. - Blockly.BlockSvg.connectionUiStep_(ripple, new Date(), this.workspace.scale); -}; - -/** - * Expand a ripple around a connection. - * @param {!Element} ripple Element to animate. - * @param {!Date} start Date of animation's start. - * @param {number} workspaceScale Scale of workspace. - * @private - */ -Blockly.BlockSvg.connectionUiStep_ = function(ripple, start, workspaceScale) { - var ms = (new Date()) - start; - var percent = ms / 150; - if (percent > 1) { - goog.dom.removeNode(ripple); - } else { - ripple.setAttribute('r', percent * 25 * workspaceScale); - ripple.style.opacity = 1 - percent; - var closure = function() { - Blockly.BlockSvg.connectionUiStep_(ripple, start, workspaceScale); - }; - Blockly.BlockSvg.disconnectUiStop_.pid_ = setTimeout(closure, 10); - } -}; - -/** - * Play some UI effects (sound, animation) when disconnecting a block. - */ -Blockly.BlockSvg.prototype.disconnectUiEffect = function() { - this.workspace.playAudio('disconnect'); - if (this.workspace.scale < 1) { - return; // Too small to care about visual effects. - } - // Horizontal distance for bottom of block to wiggle. - var DISPLACEMENT = 10; - // Scale magnitude of skew to height of block. - var height = this.getHeightWidth().height; - var magnitude = Math.atan(DISPLACEMENT / height) / Math.PI * 180; - if (!this.RTL) { - magnitude *= -1; - } - // Start the animation. - Blockly.BlockSvg.disconnectUiStep_(this.svgGroup_, magnitude, new Date()); -}; - -/** - * Animate a brief wiggle of a disconnected block. - * @param {!Element} group SVG element to animate. - * @param {number} magnitude Maximum degrees skew (reversed for RTL). - * @param {!Date} start Date of animation's start. - * @private - */ -Blockly.BlockSvg.disconnectUiStep_ = function(group, magnitude, start) { - var DURATION = 200; // Milliseconds. - var WIGGLES = 3; // Half oscillations. - - var ms = (new Date()) - start; - var percent = ms / DURATION; - - if (percent > 1) { - group.skew_ = ''; - } else { - var skew = Math.round(Math.sin(percent * Math.PI * WIGGLES) * - (1 - percent) * magnitude); - group.skew_ = 'skewX(' + skew + ')'; - var closure = function() { - Blockly.BlockSvg.disconnectUiStep_(group, magnitude, start); - }; - Blockly.BlockSvg.disconnectUiStop_.group = group; - Blockly.BlockSvg.disconnectUiStop_.pid = setTimeout(closure, 10); - } - group.setAttribute('transform', group.translate_ + group.skew_); -}; - -/** - * Stop the disconnect UI animation immediately. - * @private - */ -Blockly.BlockSvg.disconnectUiStop_ = function() { - if (Blockly.BlockSvg.disconnectUiStop_.group) { - clearTimeout(Blockly.BlockSvg.disconnectUiStop_.pid); - var group = Blockly.BlockSvg.disconnectUiStop_.group - group.skew_ = ''; - group.setAttribute('transform', group.translate_); - Blockly.BlockSvg.disconnectUiStop_.group = null; - } -}; - -/** - * PID of disconnect UI animation. There can only be one at a time. - * @type {number} - */ -Blockly.BlockSvg.disconnectUiStop_.pid = 0; - -/** - * SVG group of wobbling block. There can only be one at a time. - * @type {Element} - */ -Blockly.BlockSvg.disconnectUiStop_.group = null; - -/** - * Change the colour of a block. - */ -Blockly.BlockSvg.prototype.updateColour = function() { - if (this.disabled) { - // Disabled blocks don't have colour. - return; - } - var hexColour = this.getColour(); - var rgb = goog.color.hexToRgb(hexColour); - if (this.isShadow()) { - rgb = goog.color.lighten(rgb, 0.6); - hexColour = goog.color.rgbArrayToHex(rgb); - this.svgPathLight_.style.display = 'none'; - this.svgPathDark_.setAttribute('fill', hexColour); - } else { - this.svgPathLight_.style.display = ''; - var hexLight = goog.color.rgbArrayToHex(goog.color.lighten(rgb, 0.3)); - var hexDark = goog.color.rgbArrayToHex(goog.color.darken(rgb, 0.2)); - this.svgPathLight_.setAttribute('stroke', hexLight); - this.svgPathDark_.setAttribute('fill', hexDark); - } - this.svgPath_.setAttribute('fill', hexColour); - - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].updateColour(); - } - - // Bump every dropdown to change its colour. - for (var x = 0, input; input = this.inputList[x]; x++) { - for (var y = 0, field; field = input.fieldRow[y]; y++) { - field.setText(null); - } - } -}; - /** * Enable or disable a block. */ Blockly.BlockSvg.prototype.updateDisabled = function() { - var hasClass = Blockly.hasClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDisabled'); - if (this.disabled || this.getInheritedDisabled()) { - if (!hasClass) { - Blockly.addClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDisabled'); - this.svgPath_.setAttribute('fill', - 'url(#' + this.workspace.options.disabledPatternId + ')'); - } - } else { - if (hasClass) { - Blockly.removeClass_(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDisabled'); - this.updateColour(); - } - } - var children = this.getChildren(); - for (var i = 0, child; child = children[i]; i++) { - child.updateDisabled(); - } + // not supported }; /** @@ -1431,7 +1403,7 @@ Blockly.BlockSvg.prototype.setWarningText = function(text, opt_id) { clearTimeout(this.setWarningText.pid_[id]); delete this.setWarningText.pid_[id]; } - if (Blockly.dragMode_ == 2) { + if (Blockly.dragMode_ == Blockly.DRAG_FREE) { // Don't change the warning text during a drag. // Wait until the drag finishes. var thisBlock = this; @@ -1447,19 +1419,6 @@ Blockly.BlockSvg.prototype.setWarningText = function(text, opt_id) { text = null; } - // Bubble up to add a warning on top-most collapsed block. - var parent = this.getSurroundParent(); - var collapsedParent = null; - while (parent) { - if (parent.isCollapsed()) { - collapsedParent = parent; - } - parent = parent.getSurroundParent(); - } - if (collapsedParent) { - collapsedParent.setWarningText(text, 'collapsed ' + this.id + ' ' + id); - } - var changedState = false; if (goog.isString(text)) { if (!this.warning) { @@ -1504,21 +1463,6 @@ Blockly.BlockSvg.prototype.setMutator = function(mutator) { } }; -/** - * Set whether the block is disabled or not. - * @param {boolean} disabled True if disabled. - */ -Blockly.BlockSvg.prototype.setDisabled = function(disabled) { - if (this.disabled == disabled) { - return; - } - Blockly.BlockSvg.superClass_.setDisabled.call(this, disabled); - if (this.rendered) { - this.updateDisabled(); - } - this.workspace.fireChangeEvent(); -}; - /** * Select this block. Highlight it visually. */ @@ -1539,7 +1483,6 @@ Blockly.BlockSvg.prototype.removeSelect = function() { /** * Adds the dragging class to this block. - * Also disables the highlights/shadows to improve performance. */ Blockly.BlockSvg.prototype.addDragging = function() { Blockly.addClass_(/** @type {!Element} */ (this.svgGroup_), @@ -1554,698 +1497,180 @@ Blockly.BlockSvg.prototype.removeDragging = function() { 'blocklyDragging'); }; +// Overrides of functions on Blockly.Block that take into account whether the +// block has been rendered. + /** - * Render the block. - * Lays out and reflows a block based on its contents and settings. - * @param {boolean=} opt_bubble If false, just render this block. - * If true, also render block's parent, grandparent, etc. Defaults to true. + * Change the colour of a block. + * @param {number|string} colour HSV hue value, or #RRGGBB string. + * @param {number|string} colourSecondary Secondary HSV hue value, or #RRGGBB + * string. + * @param {number|string} colourTertiary Tertiary HSV hue value, or #RRGGBB + * string. */ -Blockly.BlockSvg.prototype.render = function(opt_bubble) { - Blockly.Field.startCache(); - this.rendered = true; +Blockly.BlockSvg.prototype.setColour = function(colour, colourSecondary, + colourTertiary) { + Blockly.BlockSvg.superClass_.setColour.call(this, colour, colourSecondary, + colourTertiary); - var cursorX = Blockly.BlockSvg.SEP_SPACE_X; - if (this.RTL) { - cursorX = -cursorX; - } - // Move the icons into position. - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - cursorX = icons[i].renderIcon(cursorX); - } - cursorX += this.RTL ? - Blockly.BlockSvg.SEP_SPACE_X : -Blockly.BlockSvg.SEP_SPACE_X; - // If there are no icons, cursorX will be 0, otherwise it will be the - // width that the first label needs to move over by. - - var inputRows = this.renderCompute_(cursorX); - this.renderDraw_(cursorX, inputRows); - - if (opt_bubble !== false) { - // Render all blocks above this one (propagate a reflow). - var parentBlock = this.getParent(); - if (parentBlock) { - parentBlock.render(true); - } else { - // Top-most block. Fire an event to allow scrollbars to resize. - Blockly.fireUiEvent(window, 'resize'); - } + if (this.rendered) { + this.updateColour(); } - Blockly.Field.stopCache(); }; /** - * Render a list of fields starting at the specified location. - * @param {!Array.} fieldList List of fields. - * @param {number} cursorX X-coordinate to start the fields. - * @param {number} cursorY Y-coordinate to start the fields. - * @return {number} X-coordinate of the end of the field row (plus a gap). - * @private + * Set whether this block can chain onto the bottom of another block. + * @param {boolean} newBoolean True if there can be a previous statement. + * @param {string|Array.|null|undefined} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. */ -Blockly.BlockSvg.prototype.renderFields_ = - function(fieldList, cursorX, cursorY) { - cursorY += Blockly.BlockSvg.INLINE_PADDING_Y; - if (this.RTL) { - cursorX = -cursorX; - } - for (var t = 0, field; field = fieldList[t]; t++) { - var root = field.getSvgRoot(); - if (!root) { - continue; - } - if (this.RTL) { - cursorX -= field.renderSep + field.renderWidth; - root.setAttribute('transform', - 'translate(' + cursorX + ',' + cursorY + ')'); - if (field.renderWidth) { - cursorX -= Blockly.BlockSvg.SEP_SPACE_X; - } - } else { - root.setAttribute('transform', - 'translate(' + (cursorX + field.renderSep) + ',' + cursorY + ')'); - if (field.renderWidth) { - cursorX += field.renderSep + field.renderWidth + - Blockly.BlockSvg.SEP_SPACE_X; - } - } +Blockly.BlockSvg.prototype.setPreviousStatement = + function(newBoolean, opt_check) { + Blockly.BlockSvg.superClass_.setPreviousStatement.call(this, newBoolean, + opt_check); + + if (this.rendered) { + this.render(); + this.bumpNeighbours_(); } - return this.RTL ? -cursorX : cursorX; }; /** - * Computes the height and widths for each row and field. - * @param {number} iconWidth Offset of first row due to icons. - * @return {!Array.>} 2D array of objects, each containing - * position information. - * @private + * Set whether another block can chain onto the bottom of this block. + * @param {boolean} newBoolean True if there can be a next statement. + * @param {string|Array.|null|undefined} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. */ -Blockly.BlockSvg.prototype.renderCompute_ = function(iconWidth) { - var inputList = this.inputList; - var inputRows = []; - inputRows.rightEdge = iconWidth + Blockly.BlockSvg.SEP_SPACE_X * 2; - if (this.previousConnection || this.nextConnection) { - inputRows.rightEdge = Math.max(inputRows.rightEdge, - Blockly.BlockSvg.NOTCH_WIDTH + Blockly.BlockSvg.SEP_SPACE_X); - } - var fieldValueWidth = 0; // Width of longest external value field. - var fieldStatementWidth = 0; // Width of longest statement field. - var hasValue = false; - var hasStatement = false; - var hasDummy = false; - var lastType = undefined; - var isInline = this.getInputsInline() && !this.isCollapsed(); - for (var i = 0, input; input = inputList[i]; i++) { - if (!input.isVisible()) { - continue; - } - var row; - if (!isInline || !lastType || - lastType == Blockly.NEXT_STATEMENT || - input.type == Blockly.NEXT_STATEMENT) { - // Create new row. - lastType = input.type; - row = []; - if (isInline && input.type != Blockly.NEXT_STATEMENT) { - row.type = Blockly.BlockSvg.INLINE; - } else { - row.type = input.type; - } - row.height = 0; - inputRows.push(row); - } else { - row = inputRows[inputRows.length - 1]; - } - row.push(input); - - // Compute minimum input size. - input.renderHeight = Blockly.BlockSvg.MIN_BLOCK_Y; - // The width is currently only needed for inline value inputs. - if (isInline && input.type == Blockly.INPUT_VALUE) { - input.renderWidth = Blockly.BlockSvg.TAB_WIDTH + - Blockly.BlockSvg.SEP_SPACE_X * 1.25; - } else { - input.renderWidth = 0; - } - // Expand input size if there is a connection. - if (input.connection && input.connection.targetConnection) { - var linkedBlock = input.connection.targetBlock(); - var bBox = linkedBlock.getHeightWidth(); - input.renderHeight = Math.max(input.renderHeight, bBox.height); - input.renderWidth = Math.max(input.renderWidth, bBox.width); - } - // Blocks have a one pixel shadow that should sometimes overhang. - if (!isInline && i == inputList.length - 1) { - // Last value input should overhang. - input.renderHeight--; - } else if (!isInline && input.type == Blockly.INPUT_VALUE && - inputList[i + 1] && inputList[i + 1].type == Blockly.NEXT_STATEMENT) { - // Value input above statement input should overhang. - input.renderHeight--; - } - - row.height = Math.max(row.height, input.renderHeight); - input.fieldWidth = 0; - if (inputRows.length == 1) { - // The first row gets shifted to accommodate any icons. - input.fieldWidth += this.RTL ? -iconWidth : iconWidth; - } - var previousFieldEditable = false; - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (j != 0) { - input.fieldWidth += Blockly.BlockSvg.SEP_SPACE_X; - } - // Get the dimensions of the field. - var fieldSize = field.getSize(); - field.renderWidth = fieldSize.width; - field.renderSep = (previousFieldEditable && field.EDITABLE) ? - Blockly.BlockSvg.SEP_SPACE_X : 0; - input.fieldWidth += field.renderWidth + field.renderSep; - row.height = Math.max(row.height, fieldSize.height); - previousFieldEditable = field.EDITABLE; - } +Blockly.BlockSvg.prototype.setNextStatement = function(newBoolean, opt_check) { + Blockly.BlockSvg.superClass_.setNextStatement.call(this, newBoolean, + opt_check); - if (row.type != Blockly.BlockSvg.INLINE) { - if (row.type == Blockly.NEXT_STATEMENT) { - hasStatement = true; - fieldStatementWidth = Math.max(fieldStatementWidth, input.fieldWidth); - } else { - if (row.type == Blockly.INPUT_VALUE) { - hasValue = true; - } else if (row.type == Blockly.DUMMY_INPUT) { - hasDummy = true; - } - fieldValueWidth = Math.max(fieldValueWidth, input.fieldWidth); - } - } + if (this.rendered) { + this.render(); + this.bumpNeighbours_(); } +}; - // Make inline rows a bit thicker in order to enclose the values. - for (var y = 0, row; row = inputRows[y]; y++) { - row.thicker = false; - if (row.type == Blockly.BlockSvg.INLINE) { - for (var z = 0, input; input = row[z]; z++) { - if (input.type == Blockly.INPUT_VALUE) { - row.height += 2 * Blockly.BlockSvg.INLINE_PADDING_Y; - row.thicker = true; - break; - } - } - } - } +/** + * Set whether this block returns a value. + * @param {boolean} newBoolean True if there is an output. + * @param {string|Array.|null|undefined} opt_check Returned type or list + * of returned types. Null or undefined if any type could be returned + * (e.g. variable get). + */ +Blockly.BlockSvg.prototype.setOutput = function(newBoolean, opt_check) { + Blockly.BlockSvg.superClass_.setOutput.call(this, newBoolean, opt_check); - // Compute the statement edge. - // This is the width of a block where statements are nested. - inputRows.statementEdge = 2 * Blockly.BlockSvg.SEP_SPACE_X + - fieldStatementWidth; - // Compute the preferred right edge. Inline blocks may extend beyond. - // This is the width of the block where external inputs connect. - if (hasStatement) { - inputRows.rightEdge = Math.max(inputRows.rightEdge, - inputRows.statementEdge + Blockly.BlockSvg.NOTCH_WIDTH); - } - if (hasValue) { - inputRows.rightEdge = Math.max(inputRows.rightEdge, fieldValueWidth + - Blockly.BlockSvg.SEP_SPACE_X * 2 + Blockly.BlockSvg.TAB_WIDTH); - } else if (hasDummy) { - inputRows.rightEdge = Math.max(inputRows.rightEdge, fieldValueWidth + - Blockly.BlockSvg.SEP_SPACE_X * 2); - } - - inputRows.hasValue = hasValue; - inputRows.hasStatement = hasStatement; - inputRows.hasDummy = hasDummy; - return inputRows; + if (this.rendered) { + this.render(); + this.bumpNeighbours_(); + } }; - /** - * Draw the path of the block. - * Move the fields to the correct locations. - * @param {number} iconWidth Offset of first row due to icons. - * @param {!Array.>} inputRows 2D array of objects, each - * containing position information. - * @private + * Set whether value inputs are arranged horizontally or vertically. + * @param {boolean} newBoolean True if inputs are horizontal. */ -Blockly.BlockSvg.prototype.renderDraw_ = function(iconWidth, inputRows) { - this.startHat_ = false; - // Should the top and bottom left corners be rounded or square? - if (this.outputConnection) { - this.squareTopLeftCorner_ = true; - this.squareBottomLeftCorner_ = true; - } else { - this.squareTopLeftCorner_ = false; - this.squareBottomLeftCorner_ = false; - // If this block is in the middle of a stack, square the corners. - if (this.previousConnection) { - var prevBlock = this.previousConnection.targetBlock(); - if (prevBlock && prevBlock.getNextBlock() == this) { - this.squareTopLeftCorner_ = true; - } - } else if (Blockly.BlockSvg.START_HAT) { - // No output or previous connection. - this.squareTopLeftCorner_ = true; - this.startHat_ = true; - inputRows.rightEdge = Math.max(inputRows.rightEdge, 100); - } - var nextBlock = this.getNextBlock(); - if (nextBlock) { - this.squareBottomLeftCorner_ = true; - } +Blockly.BlockSvg.prototype.setInputsInline = function(newBoolean) { + Blockly.BlockSvg.superClass_.setInputsInline.call(this, newBoolean); + + if (this.rendered) { + this.render(); + this.bumpNeighbours_(); } +}; - // Fetch the block's coordinates on the surface for use in anchoring - // the connections. - var connectionsXY = this.getRelativeToSurfaceXY(); - - // Assemble the block's path. - var steps = []; - var inlineSteps = []; - // The highlighting applies to edges facing the upper-left corner. - // Since highlighting is a two-pixel wide border, it would normally overhang - // the edge of the block by a pixel. So undersize all measurements by a pixel. - var highlightSteps = []; - var highlightInlineSteps = []; - - this.renderDrawTop_(steps, highlightSteps, connectionsXY, - inputRows.rightEdge); - var cursorY = this.renderDrawRight_(steps, highlightSteps, inlineSteps, - highlightInlineSteps, connectionsXY, inputRows, iconWidth); - this.renderDrawBottom_(steps, highlightSteps, connectionsXY, cursorY); - this.renderDrawLeft_(steps, highlightSteps, connectionsXY, cursorY); - - var pathString = steps.join(' ') + '\n' + inlineSteps.join(' '); - this.svgPath_.setAttribute('d', pathString); - this.svgPathDark_.setAttribute('d', pathString); - pathString = highlightSteps.join(' ') + '\n' + highlightInlineSteps.join(' '); - this.svgPathLight_.setAttribute('d', pathString); - if (this.RTL) { - // Mirror the block's path. - this.svgPath_.setAttribute('transform', 'scale(-1 1)'); - this.svgPathLight_.setAttribute('transform', 'scale(-1 1)'); - this.svgPathDark_.setAttribute('transform', 'translate(1,1) scale(-1 1)'); +/** + * Remove an input from this block. + * @param {string} name The name of the input. + * @param {boolean=} opt_quiet True to prevent error if input is not present. + * @throws {goog.asserts.AssertionError} if the input is not present and + * opt_quiet is not true. + */ +Blockly.BlockSvg.prototype.removeInput = function(name, opt_quiet) { + Blockly.BlockSvg.superClass_.removeInput.call(this, name, opt_quiet); + + if (this.rendered) { + this.render(); + // Removing an input will cause the block to change shape. + this.bumpNeighbours_(); } }; /** - * Render the top edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Array.} highlightSteps Path of block highlights. - * @param {!Object} connectionsXY Location of block. - * @param {number} rightEdge Minimum width of block. - * @private + * Move a numbered input to a different location on this block. + * @param {number} inputIndex Index of the input to move. + * @param {number} refIndex Index of input that should be after the moved input. */ -Blockly.BlockSvg.prototype.renderDrawTop_ = - function(steps, highlightSteps, connectionsXY, rightEdge) { - // Position the cursor at the top-left starting point. - if (this.squareTopLeftCorner_) { - steps.push('m 0,0'); - highlightSteps.push('m 0.5,0.5'); - if (this.startHat_) { - steps.push(Blockly.BlockSvg.START_HAT_PATH); - highlightSteps.push(this.RTL ? - Blockly.BlockSvg.START_HAT_HIGHLIGHT_RTL : - Blockly.BlockSvg.START_HAT_HIGHLIGHT_LTR); - } - } else { - steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_START); - highlightSteps.push(this.RTL ? - Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_RTL : - Blockly.BlockSvg.TOP_LEFT_CORNER_START_HIGHLIGHT_LTR); - // Top-left rounded corner. - steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER); - highlightSteps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_HIGHLIGHT); - } - - // Top edge. - if (this.previousConnection) { - steps.push('H', Blockly.BlockSvg.NOTCH_WIDTH - 15); - highlightSteps.push('H', Blockly.BlockSvg.NOTCH_WIDTH - 15); - steps.push(Blockly.BlockSvg.NOTCH_PATH_LEFT); - highlightSteps.push(Blockly.BlockSvg.NOTCH_PATH_LEFT_HIGHLIGHT); - // Create previous block connection. - var connectionX = connectionsXY.x + (this.RTL ? - -Blockly.BlockSvg.NOTCH_WIDTH : Blockly.BlockSvg.NOTCH_WIDTH); - var connectionY = connectionsXY.y; - this.previousConnection.moveTo(connectionX, connectionY); - // This connection will be tightened when the parent renders. - } - steps.push('H', rightEdge); - highlightSteps.push('H', rightEdge - 0.5); - this.width = rightEdge; +Blockly.BlockSvg.prototype.moveNumberedInputBefore = function( + inputIndex, refIndex) { + Blockly.BlockSvg.superClass_.moveNumberedInputBefore.call(this, inputIndex, + refIndex); + + if (this.rendered) { + this.render(); + // Moving an input will cause the block to change shape. + this.bumpNeighbours_(); + } }; /** - * Render the right edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Array.} highlightSteps Path of block highlights. - * @param {!Array.} inlineSteps Inline block outlines. - * @param {!Array.} highlightInlineSteps Inline block highlights. - * @param {!Object} connectionsXY Location of block. - * @param {!Array.>} inputRows 2D array of objects, each - * containing position information. - * @param {number} iconWidth Offset of first row due to icons. - * @return {number} Height of block. + * Add a value input, statement input or local variable to this block. + * @param {number} type Either Blockly.INPUT_VALUE or Blockly.NEXT_STATEMENT or + * Blockly.DUMMY_INPUT. + * @param {string} name Language-neutral identifier which may used to find this + * input again. Should be unique to this block. + * @return {!Blockly.Input} The input object created. * @private */ -Blockly.BlockSvg.prototype.renderDrawRight_ = function(steps, highlightSteps, - inlineSteps, highlightInlineSteps, connectionsXY, inputRows, iconWidth) { - var cursorX; - var cursorY = 0; - var connectionX, connectionY; - for (var y = 0, row; row = inputRows[y]; y++) { - cursorX = Blockly.BlockSvg.SEP_SPACE_X; - if (y == 0) { - cursorX += this.RTL ? -iconWidth : iconWidth; - } - highlightSteps.push('M', (inputRows.rightEdge - 0.5) + ',' + - (cursorY + 0.5)); - if (this.isCollapsed()) { - // Jagged right edge. - var input = row[0]; - var fieldX = cursorX; - var fieldY = cursorY; - this.renderFields_(input.fieldRow, fieldX, fieldY); - steps.push(Blockly.BlockSvg.JAGGED_TEETH); - highlightSteps.push('h 8'); - var remainder = row.height - Blockly.BlockSvg.JAGGED_TEETH_HEIGHT; - steps.push('v', remainder); - if (this.RTL) { - highlightSteps.push('v 3.9 l 7.2,3.4 m -14.5,8.9 l 7.3,3.5'); - highlightSteps.push('v', remainder - 0.7); - } - this.width += Blockly.BlockSvg.JAGGED_TEETH_WIDTH; - } else if (row.type == Blockly.BlockSvg.INLINE) { - // Inline inputs. - for (var x = 0, input; input = row[x]; x++) { - var fieldX = cursorX; - var fieldY = cursorY; - if (row.thicker) { - // Lower the field slightly. - fieldY += Blockly.BlockSvg.INLINE_PADDING_Y; - } - // TODO: Align inline field rows (left/right/centre). - cursorX = this.renderFields_(input.fieldRow, fieldX, fieldY); - if (input.type != Blockly.DUMMY_INPUT) { - cursorX += input.renderWidth + Blockly.BlockSvg.SEP_SPACE_X; - } - if (input.type == Blockly.INPUT_VALUE) { - inlineSteps.push('M', (cursorX - Blockly.BlockSvg.SEP_SPACE_X) + - ',' + (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y)); - inlineSteps.push('h', Blockly.BlockSvg.TAB_WIDTH - 2 - - input.renderWidth); - inlineSteps.push(Blockly.BlockSvg.TAB_PATH_DOWN); - inlineSteps.push('v', input.renderHeight + 1 - - Blockly.BlockSvg.TAB_HEIGHT); - inlineSteps.push('h', input.renderWidth + 2 - - Blockly.BlockSvg.TAB_WIDTH); - inlineSteps.push('z'); - if (this.RTL) { - // Highlight right edge, around back of tab, and bottom. - highlightInlineSteps.push('M', - (cursorX - Blockly.BlockSvg.SEP_SPACE_X - 2.5 + - Blockly.BlockSvg.TAB_WIDTH - input.renderWidth) + ',' + - (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + 0.5)); - highlightInlineSteps.push( - Blockly.BlockSvg.TAB_PATH_DOWN_HIGHLIGHT_RTL); - highlightInlineSteps.push('v', - input.renderHeight - Blockly.BlockSvg.TAB_HEIGHT + 2.5); - highlightInlineSteps.push('h', - input.renderWidth - Blockly.BlockSvg.TAB_WIDTH + 2); - } else { - // Highlight right edge, bottom. - highlightInlineSteps.push('M', - (cursorX - Blockly.BlockSvg.SEP_SPACE_X + 0.5) + ',' + - (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + 0.5)); - highlightInlineSteps.push('v', input.renderHeight + 1); - highlightInlineSteps.push('h', Blockly.BlockSvg.TAB_WIDTH - 2 - - input.renderWidth); - // Short highlight glint at bottom of tab. - highlightInlineSteps.push('M', - (cursorX - input.renderWidth - Blockly.BlockSvg.SEP_SPACE_X + - 0.9) + ',' + (cursorY + Blockly.BlockSvg.INLINE_PADDING_Y + - Blockly.BlockSvg.TAB_HEIGHT - 0.7)); - highlightInlineSteps.push('l', - (Blockly.BlockSvg.TAB_WIDTH * 0.46) + ',-2.1'); - } - // Create inline input connection. - if (this.RTL) { - connectionX = connectionsXY.x - cursorX - - Blockly.BlockSvg.TAB_WIDTH + Blockly.BlockSvg.SEP_SPACE_X + - input.renderWidth + 1; - } else { - connectionX = connectionsXY.x + cursorX + - Blockly.BlockSvg.TAB_WIDTH - Blockly.BlockSvg.SEP_SPACE_X - - input.renderWidth - 1; - } - connectionY = connectionsXY.y + cursorY + - Blockly.BlockSvg.INLINE_PADDING_Y + 1; - input.connection.moveTo(connectionX, connectionY); - if (input.connection.targetConnection) { - input.connection.tighten_(); - } - } - } +Blockly.BlockSvg.prototype.appendInput_ = function(type, name) { + var input = Blockly.BlockSvg.superClass_.appendInput_.call(this, type, name); - cursorX = Math.max(cursorX, inputRows.rightEdge); - this.width = Math.max(this.width, cursorX); - steps.push('H', cursorX); - highlightSteps.push('H', cursorX - 0.5); - steps.push('v', row.height); - if (this.RTL) { - highlightSteps.push('v', row.height - 1); - } - } else if (row.type == Blockly.INPUT_VALUE) { - // External input. - var input = row[0]; - var fieldX = cursorX; - var fieldY = cursorY; - if (input.align != Blockly.ALIGN_LEFT) { - var fieldRightX = inputRows.rightEdge - input.fieldWidth - - Blockly.BlockSvg.TAB_WIDTH - 2 * Blockly.BlockSvg.SEP_SPACE_X; - if (input.align == Blockly.ALIGN_RIGHT) { - fieldX += fieldRightX; - } else if (input.align == Blockly.ALIGN_CENTRE) { - fieldX += fieldRightX / 2; - } - } - this.renderFields_(input.fieldRow, fieldX, fieldY); - steps.push(Blockly.BlockSvg.TAB_PATH_DOWN); - var v = row.height - Blockly.BlockSvg.TAB_HEIGHT; - steps.push('v', v); - if (this.RTL) { - // Highlight around back of tab. - highlightSteps.push(Blockly.BlockSvg.TAB_PATH_DOWN_HIGHLIGHT_RTL); - highlightSteps.push('v', v + 0.5); - } else { - // Short highlight glint at bottom of tab. - highlightSteps.push('M', (inputRows.rightEdge - 5) + ',' + - (cursorY + Blockly.BlockSvg.TAB_HEIGHT - 0.7)); - highlightSteps.push('l', (Blockly.BlockSvg.TAB_WIDTH * 0.46) + - ',-2.1'); - } - // Create external input connection. - connectionX = connectionsXY.x + - (this.RTL ? -inputRows.rightEdge - 1 : inputRows.rightEdge + 1); - connectionY = connectionsXY.y + cursorY; - input.connection.moveTo(connectionX, connectionY); - if (input.connection.targetConnection) { - input.connection.tighten_(); - this.width = Math.max(this.width, inputRows.rightEdge + - input.connection.targetBlock().getHeightWidth().width - - Blockly.BlockSvg.TAB_WIDTH + 1); - } - } else if (row.type == Blockly.DUMMY_INPUT) { - // External naked field. - var input = row[0]; - var fieldX = cursorX; - var fieldY = cursorY; - if (input.align != Blockly.ALIGN_LEFT) { - var fieldRightX = inputRows.rightEdge - input.fieldWidth - - 2 * Blockly.BlockSvg.SEP_SPACE_X; - if (inputRows.hasValue) { - fieldRightX -= Blockly.BlockSvg.TAB_WIDTH; - } - if (input.align == Blockly.ALIGN_RIGHT) { - fieldX += fieldRightX; - } else if (input.align == Blockly.ALIGN_CENTRE) { - fieldX += fieldRightX / 2; - } - } - this.renderFields_(input.fieldRow, fieldX, fieldY); - steps.push('v', row.height); - if (this.RTL) { - highlightSteps.push('v', row.height - 1); - } - } else if (row.type == Blockly.NEXT_STATEMENT) { - // Nested statement. - var input = row[0]; - if (y == 0) { - // If the first input is a statement stack, add a small row on top. - steps.push('v', Blockly.BlockSvg.SEP_SPACE_Y); - if (this.RTL) { - highlightSteps.push('v', Blockly.BlockSvg.SEP_SPACE_Y - 1); - } - cursorY += Blockly.BlockSvg.SEP_SPACE_Y; - } - var fieldX = cursorX; - var fieldY = cursorY; - if (input.align != Blockly.ALIGN_LEFT) { - var fieldRightX = inputRows.statementEdge - input.fieldWidth - - 2 * Blockly.BlockSvg.SEP_SPACE_X; - if (input.align == Blockly.ALIGN_RIGHT) { - fieldX += fieldRightX; - } else if (input.align == Blockly.ALIGN_CENTRE) { - fieldX += fieldRightX / 2; - } - } - this.renderFields_(input.fieldRow, fieldX, fieldY); - cursorX = inputRows.statementEdge + Blockly.BlockSvg.NOTCH_WIDTH; - steps.push('H', cursorX); - steps.push(Blockly.BlockSvg.INNER_TOP_LEFT_CORNER); - steps.push('v', row.height - 2 * Blockly.BlockSvg.CORNER_RADIUS); - steps.push(Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER); - steps.push('H', inputRows.rightEdge); - if (this.RTL) { - highlightSteps.push('M', - (cursorX - Blockly.BlockSvg.NOTCH_WIDTH + - Blockly.BlockSvg.DISTANCE_45_OUTSIDE) + - ',' + (cursorY + Blockly.BlockSvg.DISTANCE_45_OUTSIDE)); - highlightSteps.push( - Blockly.BlockSvg.INNER_TOP_LEFT_CORNER_HIGHLIGHT_RTL); - highlightSteps.push('v', - row.height - 2 * Blockly.BlockSvg.CORNER_RADIUS); - highlightSteps.push( - Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_RTL); - highlightSteps.push('H', inputRows.rightEdge - 0.5); - } else { - highlightSteps.push('M', - (cursorX - Blockly.BlockSvg.NOTCH_WIDTH + - Blockly.BlockSvg.DISTANCE_45_OUTSIDE) + ',' + - (cursorY + row.height - Blockly.BlockSvg.DISTANCE_45_OUTSIDE)); - highlightSteps.push( - Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_LTR); - highlightSteps.push('H', inputRows.rightEdge - 0.5); - } - // Create statement connection. - connectionX = connectionsXY.x + (this.RTL ? -cursorX : cursorX + 1); - connectionY = connectionsXY.y + cursorY + 1; - input.connection.moveTo(connectionX, connectionY); - if (input.connection.targetConnection) { - input.connection.tighten_(); - this.width = Math.max(this.width, inputRows.statementEdge + - input.connection.targetBlock().getHeightWidth().width); - } - if (y == inputRows.length - 1 || - inputRows[y + 1].type == Blockly.NEXT_STATEMENT) { - // If the final input is a statement stack, add a small row underneath. - // Consecutive statement stacks are also separated by a small divider. - steps.push('v', Blockly.BlockSvg.SEP_SPACE_Y); - if (this.RTL) { - highlightSteps.push('v', Blockly.BlockSvg.SEP_SPACE_Y - 1); - } - cursorY += Blockly.BlockSvg.SEP_SPACE_Y; - } - } - cursorY += row.height; - } - if (!inputRows.length) { - cursorY = Blockly.BlockSvg.MIN_BLOCK_Y; - steps.push('V', cursorY); - if (this.RTL) { - highlightSteps.push('V', cursorY - 1); - } + if (this.rendered) { + this.render(); + // Adding an input will cause the block to change shape. + this.bumpNeighbours_(); } - return cursorY; + return input; }; /** - * Render the bottom edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Array.} highlightSteps Path of block highlights. - * @param {!Object} connectionsXY Location of block. - * @param {number} cursorY Height of block. + * Returns connections originating from this block. + * @param {boolean} all If true, return all connections even hidden ones. + * Otherwise, for a non-rendered block return an empty list, and for a + * collapsed block don't return inputs connections. + * @return {!Array.} Array of connections. * @private */ -Blockly.BlockSvg.prototype.renderDrawBottom_ = - function(steps, highlightSteps, connectionsXY, cursorY) { - this.height = cursorY + 1; // Add one for the shadow. - if (this.nextConnection) { - steps.push('H', (Blockly.BlockSvg.NOTCH_WIDTH + (this.RTL ? 0.5 : - 0.5)) + - ' ' + Blockly.BlockSvg.NOTCH_PATH_RIGHT); - // Create next block connection. - var connectionX; - if (this.RTL) { - connectionX = connectionsXY.x - Blockly.BlockSvg.NOTCH_WIDTH; - } else { - connectionX = connectionsXY.x + Blockly.BlockSvg.NOTCH_WIDTH; +Blockly.BlockSvg.prototype.getConnections_ = function(all) { + var myConnections = []; + if (all || this.rendered) { + if (this.outputConnection) { + myConnections.push(this.outputConnection); } - var connectionY = connectionsXY.y + cursorY + 1; - this.nextConnection.moveTo(connectionX, connectionY); - if (this.nextConnection.targetConnection) { - this.nextConnection.tighten_(); + if (this.previousConnection) { + myConnections.push(this.previousConnection); } - this.height += 4; // Height of tab. - } - - // Should the bottom-left corner be rounded or square? - if (this.squareBottomLeftCorner_) { - steps.push('H 0'); - if (!this.RTL) { - highlightSteps.push('M', '0.5,' + (cursorY - 0.5)); + if (this.nextConnection) { + myConnections.push(this.nextConnection); } - } else { - steps.push('H', Blockly.BlockSvg.CORNER_RADIUS); - steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 -' + - Blockly.BlockSvg.CORNER_RADIUS + ',-' + - Blockly.BlockSvg.CORNER_RADIUS); - if (!this.RTL) { - highlightSteps.push('M', Blockly.BlockSvg.DISTANCE_45_INSIDE + ',' + - (cursorY - Blockly.BlockSvg.DISTANCE_45_INSIDE)); - highlightSteps.push('A', (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ',' + - (Blockly.BlockSvg.CORNER_RADIUS - 0.5) + ' 0 0,1 ' + - '0.5,' + (cursorY - Blockly.BlockSvg.CORNER_RADIUS)); + if (all || !this.collapsed_) { + for (var i = 0, input; input = this.inputList[i]; i++) { + if (input.connection) { + myConnections.push(input.connection); + } + } } } + return myConnections; }; /** - * Render the left edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Array.} highlightSteps Path of block highlights. - * @param {!Object} connectionsXY Location of block. - * @param {number} cursorY Height of block. + * Create a connection of the specified type. + * @param {number} type The type of the connection to create. + * @return {!Blockly.RenderedConnection} A new connection of the specified type. * @private */ -Blockly.BlockSvg.prototype.renderDrawLeft_ = - function(steps, highlightSteps, connectionsXY, cursorY) { - if (this.outputConnection) { - // Create output connection. - this.outputConnection.moveTo(connectionsXY.x, connectionsXY.y); - // This connection will be tightened when the parent renders. - steps.push('V', Blockly.BlockSvg.TAB_HEIGHT); - steps.push('c 0,-10 -' + Blockly.BlockSvg.TAB_WIDTH + ',8 -' + - Blockly.BlockSvg.TAB_WIDTH + ',-7.5 s ' + Blockly.BlockSvg.TAB_WIDTH + - ',2.5 ' + Blockly.BlockSvg.TAB_WIDTH + ',-7.5'); - if (this.RTL) { - highlightSteps.push('M', (Blockly.BlockSvg.TAB_WIDTH * -0.25) + ',8.4'); - highlightSteps.push('l', (Blockly.BlockSvg.TAB_WIDTH * -0.45) + ',-2.1'); - } else { - highlightSteps.push('V', Blockly.BlockSvg.TAB_HEIGHT - 1.5); - highlightSteps.push('m', (Blockly.BlockSvg.TAB_WIDTH * -0.92) + - ',-0.5 q ' + (Blockly.BlockSvg.TAB_WIDTH * -0.19) + - ',-5.5 0,-11'); - highlightSteps.push('m', (Blockly.BlockSvg.TAB_WIDTH * 0.92) + - ',1 V 0.5 H 1'); - } - this.width += Blockly.BlockSvg.TAB_WIDTH; - } else if (!this.RTL) { - if (this.squareTopLeftCorner_) { - // Statement block in a stack. - highlightSteps.push('V', 0.5); - } else { - highlightSteps.push('V', Blockly.BlockSvg.CORNER_RADIUS); - } - } - steps.push('z'); +Blockly.BlockSvg.prototype.makeConnection_ = function(type) { + return new Blockly.RenderedConnection(this, type); }; diff --git a/core/blockly.js b/core/blockly.js index 07403d972a..c6729c230d 100644 --- a/core/blockly.js +++ b/core/blockly.js @@ -27,16 +27,21 @@ // Top level object for Blockly. goog.provide('Blockly'); -goog.require('Blockly.BlockSvg'); +goog.require('Blockly.BlockSvg.render'); +goog.require('Blockly.DropDownDiv'); +goog.require('Blockly.Events'); goog.require('Blockly.FieldAngle'); +goog.require('Blockly.FieldNumber'); goog.require('Blockly.FieldCheckbox'); goog.require('Blockly.FieldColour'); // Date picker commented out since it increases footprint by 60%. // Add it only if you need it. //goog.require('Blockly.FieldDate'); goog.require('Blockly.FieldDropdown'); +goog.require('Blockly.FieldIconMenu'); goog.require('Blockly.FieldImage'); goog.require('Blockly.FieldTextInput'); +goog.require('Blockly.FieldNumber'); goog.require('Blockly.FieldVariable'); goog.require('Blockly.Generator'); goog.require('Blockly.Msg'); @@ -44,6 +49,7 @@ goog.require('Blockly.Procedures'); goog.require('Blockly.Toolbox'); goog.require('Blockly.WidgetDiv'); goog.require('Blockly.WorkspaceSvg'); +goog.require('Blockly.constants'); goog.require('Blockly.inject'); goog.require('Blockly.utils'); goog.require('goog.color'); @@ -54,97 +60,11 @@ goog.require('goog.userAgent'); var CLOSURE_DEFINES = {'goog.DEBUG': false}; /** - * Required name space for SVG elements. - * @const - */ -Blockly.SVG_NS = 'http://www.w3.org/2000/svg'; -/** - * Required name space for HTML elements. - * @const - */ -Blockly.HTML_NS = 'http://www.w3.org/1999/xhtml'; - -/** - * The richness of block colours, regardless of the hue. - * Must be in the range of 0 (inclusive) to 1 (exclusive). - */ -Blockly.HSV_SATURATION = 0.45; -/** - * The intensity of block colours, regardless of the hue. - * Must be in the range of 0 (inclusive) to 1 (exclusive). - */ -Blockly.HSV_VALUE = 0.65; - -/** - * Sprited icons and images. - */ -Blockly.SPRITE = { - width: 96, - height: 124, - url: 'sprites.png' -}; - -/** - * Convert a hue (HSV model) into an RGB hex triplet. - * @param {number} hue Hue on a colour wheel (0-360). - * @return {string} RGB code, e.g. '#5ba65b'. - */ -Blockly.hueToRgb = function(hue) { - return goog.color.hsvToHex(hue, Blockly.HSV_SATURATION, - Blockly.HSV_VALUE * 255); -}; - -/** - * ENUM for a right-facing value input. E.g. 'set item to' or 'return'. - * @const - */ -Blockly.INPUT_VALUE = 1; -/** - * ENUM for a left-facing value output. E.g. 'random fraction'. - * @const - */ -Blockly.OUTPUT_VALUE = 2; -/** - * ENUM for a down-facing block stack. E.g. 'if-do' or 'else'. - * @const - */ -Blockly.NEXT_STATEMENT = 3; -/** - * ENUM for an up-facing block stack. E.g. 'break out of loop'. - * @const - */ -Blockly.PREVIOUS_STATEMENT = 4; -/** - * ENUM for an dummy input. Used to add field(s) with no input. - * @const - */ -Blockly.DUMMY_INPUT = 5; - -/** - * ENUM for left alignment. - * @const - */ -Blockly.ALIGN_LEFT = -1; -/** - * ENUM for centre alignment. - * @const - */ -Blockly.ALIGN_CENTRE = 0; -/** - * ENUM for right alignment. - * @const - */ -Blockly.ALIGN_RIGHT = 1; - -/** - * Lookup table for determining the opposite type of a connection. - * @const + * The main workspace most recently used. + * Set by Blockly.WorkspaceSvg.prototype.markFocused + * @type {Blockly.Workspace} */ -Blockly.OPPOSITE_TYPE = []; -Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE] = Blockly.OUTPUT_VALUE; -Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE] = Blockly.INPUT_VALUE; -Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT] = Blockly.PREVIOUS_STATEMENT; -Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT] = Blockly.NEXT_STATEMENT; +Blockly.mainWorkspace = null; /** * Currently selected block. @@ -167,36 +87,35 @@ Blockly.highlightedConnection_ = null; Blockly.localConnection_ = null; /** - * Number of pixels the mouse must move before a drag starts. - */ -Blockly.DRAG_RADIUS = 5; - -/** - * Maximum misalignment between connections for them to snap together. - */ -Blockly.SNAP_RADIUS = 20; - -/** - * Delay in ms between trigger and bumping unconnected block out of alignment. + * All of the connections on blocks that are currently being dragged. + * @type {!Array.} + * @private */ -Blockly.BUMP_DELAY = 250; +Blockly.draggingConnections_ = []; /** - * Number of characters to truncate a collapsed block to. + * Connection on the insertion marker block that matches + * Blockly.localConnection_ on the dragged block. + * @type {Blockly.Connection} + * @private */ -Blockly.COLLAPSE_CHARS = 30; +Blockly.insertionMarkerConnection_ = null; /** - * Length in ms for a touch to become a long press. + * Grayed-out block that indicates to the user what will happen if they release + * a drag immediately. + * @type {Blockly.Block} + * @private */ -Blockly.LONGPRESS = 750; +Blockly.insertionMarker_ = null; /** - * The main workspace most recently used. - * Set by Blockly.WorkspaceSvg.prototype.markFocused - * @type {Blockly.Workspace} + * Connection that was bumped out of the way by an insertion marker, and may + * need to be put back as the drag continues. + * @type {Blockly.Connection} + * @private */ -Blockly.mainWorkspace = null; +Blockly.bumpedConnection_ = null; /** * Contents of the local clipboard. @@ -219,7 +138,7 @@ Blockly.clipboardSource_ = null; * 2 - Freely draggable. * @private */ -Blockly.dragMode_ = 0; +Blockly.dragMode_ = Blockly.DRAG_NONE; /** * Wrapper function called when a touch mouseUp occurs during a drag operation. @@ -228,6 +147,16 @@ Blockly.dragMode_ = 0; */ Blockly.onTouchUpWrapper_ = null; +/** + * Convert a hue (HSV model) into an RGB hex triplet. + * @param {number} hue Hue on a colour wheel (0-360). + * @return {string} RGB code, e.g. '#5ba65b'. + */ +Blockly.hueToRgb = function(hue) { + return goog.color.hsvToHex(hue, Blockly.HSV_SATURATION, + Blockly.HSV_VALUE * 255); +}; + /** * Returns the dimensions of the specified SVG image. * @param {!Element} svg SVG image. @@ -238,12 +167,37 @@ Blockly.svgSize = function(svg) { height: svg.cachedHeight_}; }; +/** + * Schedule a call to the resize handler. Groups of simultaneous events (e.g. + * a tree of blocks being deleted) are merged into one call. + * @param {Blockly.WorkspaceSvg} workspace Any workspace in the SVG. + */ +Blockly.asyncSvgResize = function(workspace) { + if (Blockly.svgResizePending_) { + return; + } + if (!workspace) { + workspace = Blockly.getMainWorkspace(); + } + Blockly.svgResizePending_ = true; + setTimeout(function() {Blockly.svgResize(workspace);}, 0); +}; + +/** + * Flag indicating a resize event is scheduled. + * Used to fire only one resize after multiple changes. + * @type {boolean} + * @private + */ +Blockly.svgResizePending_ = false; + /** * Size the SVG image to completely fill its container. * Record the height/width of the SVG image. * @param {!Blockly.WorkspaceSvg} workspace Any workspace in the SVG. */ Blockly.svgResize = function(workspace) { + Blockly.svgResizePending_ = false; var mainWorkspace = workspace; while (mainWorkspace.options.parentWorkspace) { mainWorkspace = mainWorkspace.options.parentWorkspace; @@ -251,7 +205,7 @@ Blockly.svgResize = function(workspace) { var svg = mainWorkspace.getParentSvg(); var div = svg.parentNode; if (!div) { - // Workspace deteted, or something. + // Workspace deleted, or something. return; } var width = div.offsetWidth; @@ -276,7 +230,6 @@ Blockly.onMouseUp_ = function(e) { var workspace = Blockly.getMainWorkspace(); Blockly.Css.setCursor(Blockly.Css.Cursor.OPEN); workspace.isScrolling = false; - // Unbind the touch event if it exists. if (Blockly.onTouchUpWrapper_) { Blockly.unbindEvent_(Blockly.onTouchUpWrapper_); @@ -299,27 +252,17 @@ Blockly.onMouseMove_ = function(e) { } var workspace = Blockly.getMainWorkspace(); if (workspace.isScrolling) { - Blockly.removeAllRanges(); var dx = e.clientX - workspace.startDragMouseX; var dy = e.clientY - workspace.startDragMouseY; - var metrics = workspace.startDragMetrics; var x = workspace.startScrollX + dx; var y = workspace.startScrollY + dy; - x = Math.min(x, -metrics.contentLeft); - y = Math.min(y, -metrics.contentTop); - x = Math.max(x, metrics.viewWidth - metrics.contentLeft - - metrics.contentWidth); - y = Math.max(y, metrics.viewHeight - metrics.contentTop - - metrics.contentHeight); - - // Move the scrollbars and the page will scroll automatically. - workspace.scrollbar.set(-x - metrics.contentLeft, - -y - metrics.contentTop); + workspace.scroll(x, y); // Cancel the long-press if the drag has moved too far. if (Math.sqrt(dx * dx + dy * dy) > Blockly.DRAG_RADIUS) { Blockly.longStop_(); } e.stopPropagation(); + e.preventDefault(); } }; @@ -329,26 +272,19 @@ Blockly.onMouseMove_ = function(e) { * @private */ Blockly.onKeyDown_ = function(e) { - if (Blockly.isTargetInput_(e)) { + if (Blockly.mainWorkspace.options.readOnly || Blockly.isTargetInput_(e)) { + // No key actions on readonly workspaces. // When focused on an HTML text input widget, don't trap any keys. return; } - var deleteBlock = false; if (e.keyCode == 27) { - // Pressing esc closes the context menu. + // Pressing esc closes the context menu and any drop-down Blockly.hideChaff(); + Blockly.DropDownDiv.hide(); } else if (e.keyCode == 8 || e.keyCode == 46) { // Delete or backspace. - try { - if (Blockly.selected && Blockly.selected.isDeletable()) { - deleteBlock = true; - } - } finally { - // Stop the browser from going back to the previous page. - // Use a finally so that any error in delete code above doesn't disappear - // from the console when the page rolls back. - e.preventDefault(); - } + // Stop the browser from going back to the previous page. + e.preventDefault(); } else if (e.altKey || e.ctrlKey || e.metaKey) { if (Blockly.selected && Blockly.selected.isDeletable() && Blockly.selected.isMovable()) { @@ -359,7 +295,13 @@ Blockly.onKeyDown_ = function(e) { } else if (e.keyCode == 88) { // 'x' for cut. Blockly.copy_(Blockly.selected); - deleteBlock = true; + Blockly.hideChaff(); + var heal = Blockly.dragMode_ != Blockly.DRAG_FREE; + Blockly.selected.dispose(heal, true); + if (Blockly.highlightedConnection_) { + Blockly.highlightedConnection_.unhighlight(); + Blockly.highlightedConnection_ = null; + } } } if (e.keyCode == 86) { @@ -367,16 +309,10 @@ Blockly.onKeyDown_ = function(e) { if (Blockly.clipboardXml_) { Blockly.clipboardSource_.paste(Blockly.clipboardXml_); } - } - } - if (deleteBlock) { - // Common code for delete and cut. - Blockly.hideChaff(); - var heal = Blockly.dragMode_ != 2; - Blockly.selected.dispose(heal, true); - if (Blockly.highlightedConnection_) { - Blockly.highlightedConnection_.unhighlight(); - Blockly.highlightedConnection_ = null; + } else if (e.keyCode == 90) { + // 'z' for undo 'Z' is for redo. + Blockly.hideChaff(); + Blockly.mainWorkspace.undo(e.shiftKey); } } }; @@ -433,8 +369,8 @@ Blockly.longStop_ = function() { * @private */ Blockly.copy_ = function(block) { - var xmlBlock = Blockly.Xml.blockToDom_(block); - if (Blockly.dragMode_ != 2) { + var xmlBlock = Blockly.Xml.blockToDom(block); + if (Blockly.dragMode_ != Blockly.DRAG_FREE) { Blockly.Xml.deleteNext(xmlBlock); } // Encode start position in XML. @@ -520,12 +456,8 @@ Blockly.getMainWorkspaceMetrics_ = function() { var MARGIN = Blockly.Flyout.prototype.CORNER_RADIUS - 1; var viewWidth = svgSize.width - MARGIN; var viewHeight = svgSize.height - MARGIN; - try { - var blockBox = this.getCanvas().getBBox(); - } catch (e) { - // Firefox has trouble with hidden elements (Bug 528969). - return null; - } + var blockBox = this.getBlocksBoundingBox(); + // Fix scale. var contentWidth = blockBox.width * this.scale; var contentHeight = blockBox.height * this.scale; @@ -549,7 +481,7 @@ Blockly.getMainWorkspaceMetrics_ = function() { var bottomEdge = topEdge + blockBox.height; } var absoluteLeft = 0; - if (!this.RTL && this.toolbox_) { + if (this.toolbox_ && this.toolbox_.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { absoluteLeft = this.toolbox_.width; } var metrics = { @@ -598,20 +530,6 @@ Blockly.setMainWorkspaceMetrics_ = function(xyRatio) { } }; -/** - * When something in Blockly's workspace changes, call a function. - * @param {!Function} func Function to call. - * @return {!Array.} Opaque data that can be passed to - * removeChangeListener. - * @deprecated April 2015 - */ -Blockly.addChangeListener = function(func) { - // Backwards compatability from before there could be multiple workspaces. - console.warn('Deprecated call to Blockly.addChangeListener, ' + - 'use workspace.addChangeListener instead.'); - return Blockly.getMainWorkspace().addChangeListener(func); -}; - /** * Returns the main workspace. Returns the last used main workspace (based on * focus). diff --git a/core/bubble.js b/core/bubble.js index 144ff05a25..d4c1e2719f 100644 --- a/core/bubble.js +++ b/core/bubble.js @@ -29,23 +29,23 @@ goog.provide('Blockly.Bubble'); goog.require('Blockly.Workspace'); goog.require('goog.dom'); goog.require('goog.math'); +goog.require('goog.math.Coordinate'); goog.require('goog.userAgent'); /** * Class for UI bubble. - * @param {!Blockly.Workspace} workspace The workspace on which to draw the + * @param {!Blockly.WorkspaceSvg} workspace The workspace on which to draw the * bubble. * @param {!Element} content SVG content for the bubble. * @param {Element} shape SVG element to avoid eclipsing. - * @param {number} anchorX Absolute horizontal position of bubbles anchor point. - * @param {number} anchorY Absolute vertical position of bubbles anchor point. + * @param {!goog.math.Coodinate} anchorXY Absolute position of bubble's anchor + * point. * @param {?number} bubbleWidth Width of bubble, or null if not resizable. * @param {?number} bubbleHeight Height of bubble, or null if not resizable. * @constructor */ -Blockly.Bubble = function(workspace, content, shape, - anchorX, anchorY, +Blockly.Bubble = function(workspace, content, shape, anchorXY, bubbleWidth, bubbleHeight) { this.workspace_ = workspace; this.content_ = content; @@ -60,7 +60,7 @@ Blockly.Bubble = function(workspace, content, shape, var canvas = workspace.getBubbleCanvas(); canvas.appendChild(this.createDom_(content, !!(bubbleWidth && bubbleHeight))); - this.setAnchorLocation(anchorX, anchorY); + this.setAnchorLocation(anchorXY); if (!bubbleWidth || !bubbleHeight) { var bBox = /** @type {SVGLocatable} */ (this.content_).getBBox(); bubbleWidth = bBox.width + 2 * Blockly.Bubble.BORDER_WIDTH; @@ -123,6 +123,12 @@ Blockly.Bubble.onMouseUpWrapper_ = null; */ Blockly.Bubble.onMouseMoveWrapper_ = null; +/** + * Function to call on resize of bubble. + * @type {Function} + */ +Blockly.Bubble.prototype.resizeCallback_ = null; + /** * Stop binding to the global mouseup and mousemove events. * @private @@ -145,16 +151,11 @@ Blockly.Bubble.unbindDragEvents_ = function() { Blockly.Bubble.prototype.rendered_ = false; /** - * Absolute X coordinate of anchor point. - * @private - */ -Blockly.Bubble.prototype.anchorX_ = 0; - -/** - * Absolute Y coordinate of anchor point. + * Absolute coordinate of anchor point. + * @type {goog.math.Coordinate} * @private */ -Blockly.Bubble.prototype.anchorY_ = 0; +Blockly.Bubble.prototype.anchorXY_ = null; /** * Relative X coordinate of bubble with respect to the anchor's centre. @@ -269,9 +270,9 @@ Blockly.Bubble.prototype.bubbleMouseDown_ = function(e) { // Left-click (or middle click) Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); - this.workspace_.startDrag(e, + this.workspace_.startDrag(e, new goog.math.Coordinate( this.workspace_.RTL ? -this.relativeLeft_ : this.relativeLeft_, - this.relativeTop_); + this.relativeTop_)); Blockly.Bubble.onMouseUpWrapper_ = Blockly.bindEvent_(document, 'mouseup', this, Blockly.Bubble.unbindDragEvents_); @@ -312,8 +313,8 @@ Blockly.Bubble.prototype.resizeMouseDown_ = function(e) { // Left-click (or middle click) Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); - this.workspace_.startDrag(e, - this.workspace_.RTL ? -this.width_ : this.width_, this.height_); + this.workspace_.startDrag(e, new goog.math.Coordinate( + this.workspace_.RTL ? -this.width_ : this.width_, this.height_)); Blockly.Bubble.onMouseUpWrapper_ = Blockly.bindEvent_(document, 'mouseup', this, Blockly.Bubble.unbindDragEvents_); @@ -341,11 +342,10 @@ Blockly.Bubble.prototype.resizeMouseMove_ = function(e) { /** * Register a function as a callback event for when the bubble is resized. - * @param {Object} thisObject The value of 'this' in the callback. * @param {!Function} callback The function to call on resize. */ -Blockly.Bubble.prototype.registerResizeEvent = function(thisObject, callback) { - Blockly.bindEvent_(this.bubbleGroup_, 'resize', thisObject, callback); +Blockly.Bubble.prototype.registerResizeEvent = function(callback) { + this.resizeCallback_ = callback; }; /** @@ -360,12 +360,10 @@ Blockly.Bubble.prototype.promote_ = function() { /** * Notification that the anchor has moved. * Update the arrow and bubble accordingly. - * @param {number} x Absolute horizontal location. - * @param {number} y Absolute vertical location. + * @param {!goog.math.Coordinate} xy Absolute location. */ -Blockly.Bubble.prototype.setAnchorLocation = function(x, y) { - this.anchorX_ = x; - this.anchorY_ = y; +Blockly.Bubble.prototype.setAnchorLocation = function(xy) { + this.anchorXY_ = xy; if (this.rendered_) { this.positionBubble_(); } @@ -383,31 +381,32 @@ Blockly.Bubble.prototype.layoutBubble_ = function() { var metrics = this.workspace_.getMetrics(); metrics.viewWidth /= this.workspace_.scale; metrics.viewLeft /= this.workspace_.scale; + var anchorX = this.anchorXY_.x; if (this.workspace_.RTL) { - if (this.anchorX_ - metrics.viewLeft - relativeLeft - this.width_ < + if (anchorX - metrics.viewLeft - relativeLeft - this.width_ < Blockly.Scrollbar.scrollbarThickness) { // Slide the bubble right until it is onscreen. - relativeLeft = this.anchorX_ - metrics.viewLeft - this.width_ - + relativeLeft = anchorX - metrics.viewLeft - this.width_ - Blockly.Scrollbar.scrollbarThickness; - } else if (this.anchorX_ - metrics.viewLeft - relativeLeft > + } else if (anchorX - metrics.viewLeft - relativeLeft > metrics.viewWidth) { // Slide the bubble left until it is onscreen. - relativeLeft = this.anchorX_ - metrics.viewLeft - metrics.viewWidth; + relativeLeft = anchorX - metrics.viewLeft - metrics.viewWidth; } } else { - if (this.anchorX_ + relativeLeft < metrics.viewLeft) { + if (anchorX + relativeLeft < metrics.viewLeft) { // Slide the bubble right until it is onscreen. - relativeLeft = metrics.viewLeft - this.anchorX_; + relativeLeft = metrics.viewLeft - anchorX; } else if (metrics.viewLeft + metrics.viewWidth < - this.anchorX_ + relativeLeft + this.width_ + + anchorX + relativeLeft + this.width_ + Blockly.BlockSvg.SEP_SPACE_X + Blockly.Scrollbar.scrollbarThickness) { // Slide the bubble left until it is onscreen. - relativeLeft = metrics.viewLeft + metrics.viewWidth - this.anchorX_ - + relativeLeft = metrics.viewLeft + metrics.viewWidth - anchorX - this.width_ - Blockly.Scrollbar.scrollbarThickness; } } - if (this.anchorY_ + relativeTop < metrics.viewTop) { + if (this.anchorXY_.y + relativeTop < metrics.viewTop) { // Slide the bubble below the block. var bBox = /** @type {SVGLocatable} */ (this.shape_).getBBox(); relativeTop = bBox.height; @@ -421,13 +420,13 @@ Blockly.Bubble.prototype.layoutBubble_ = function() { * @private */ Blockly.Bubble.prototype.positionBubble_ = function() { - var left; + var left = this.anchorXY_.x; if (this.workspace_.RTL) { - left = this.anchorX_ - this.relativeLeft_ - this.width_; + left -= this.relativeLeft_ + this.width_; } else { - left = this.anchorX_ + this.relativeLeft_; + left += this.relativeLeft_; } - var top = this.relativeTop_ + this.anchorY_; + var top = this.relativeTop_ + this.anchorXY_.y; this.bubbleGroup_.setAttribute('transform', 'translate(' + left + ',' + top + ')'); }; @@ -473,8 +472,10 @@ Blockly.Bubble.prototype.setBubbleSize = function(width, height) { this.positionBubble_(); this.renderArrow_(); } - // Fire an event to allow the contents to resize. - Blockly.fireUiEvent(this.bubbleGroup_, 'resize'); + // Allow the contents to resize. + if (this.resizeCallback_) { + this.resizeCallback_(); + } }; /** diff --git a/core/colours.js b/core/colours.js new file mode 100644 index 0000000000..bf26ffccb3 --- /dev/null +++ b/core/colours.js @@ -0,0 +1,73 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Massachusetts Institute of Technology + * All rights reserved. + * + * 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. + */ + +'use strict'; + +goog.provide('Blockly.Colours'); + +Blockly.Colours = { + // SVG colours: these must be specificed in #RRGGBB style + // To add an opacity, this must be specified as a separate property (for SVG fill-opacity) + "motion": { + "primary": "#4C97FF", + "secondary": "#4280D7", + "tertiary": "#3373CC" + }, + "looks": { + "primary": "#9966FF", + "secondary": "#855CD6", + "tertiary": "#774DCB" + }, + "sounds": { + "primary": "#D65CD6", + "secondary": "#BF40BF", + "tertiary": "#A63FA6" + }, + "control": { + "primary": "#FFAB19", + "secondary": "#EC9C13", + "tertiary": "#CF8B17" + }, + "event": { + "primary": "#FFD500", + "secondary": "#DBC200", + "tertiary": "#CCAA00" + }, + "text": "#575E75", + "workspace": "#F5F8FF", + "toolbox": "#DDDDDD", + "toolboxText": "#000000", + "flyout": "#DDDDDD", + "scrollbar": "#CCCCCC", + "scrollbarHover": '#BBBBBB', + "textField": "#FFFFFF", + "insertionMarker": "#949494", + "insertionMarkerOpacity": 0.6, + "dragShadowOpacity": 0.3, + "stackGlow": "#FFF200", + "stackGlowOpacity": 1, + // CSS colours: support RGBA + "fieldShadow": "rgba(0,0,0,0.1)", + "dropDownShadow": "rgba(0, 0, 0, .3)", + "numPadBackground": "#547AB2", + "numPadBorder": "#435F91", + "numPadActiveBackground": "#435F91", + "numPadText": "#FFFFFF" +}; diff --git a/core/comment.js b/core/comment.js index e308994b22..2121530c05 100644 --- a/core/comment.js +++ b/core/comment.js @@ -106,16 +106,27 @@ Blockly.Comment.prototype.createEditor_ = function() { var body = document.createElementNS(Blockly.HTML_NS, 'body'); body.setAttribute('xmlns', Blockly.HTML_NS); body.className = 'blocklyMinimalBody'; - this.textarea_ = document.createElementNS(Blockly.HTML_NS, 'textarea'); - this.textarea_.className = 'blocklyCommentTextarea'; - this.textarea_.setAttribute('dir', this.block_.RTL ? 'RTL' : 'LTR'); - body.appendChild(this.textarea_); + var textarea = document.createElementNS(Blockly.HTML_NS, 'textarea'); + textarea.className = 'blocklyCommentTextarea'; + textarea.setAttribute('dir', this.block_.RTL ? 'RTL' : 'LTR'); + body.appendChild(textarea); + this.textarea_ = textarea; this.foreignObject_.appendChild(body); - Blockly.bindEvent_(this.textarea_, 'mouseup', this, this.textareaFocus_); + Blockly.bindEvent_(textarea, 'mouseup', this, this.textareaFocus_); // Don't zoom with mousewheel. - Blockly.bindEvent_(this.textarea_, 'wheel', this, function(e) { + Blockly.bindEvent_(textarea, 'wheel', this, function(e) { e.stopPropagation(); }); + Blockly.bindEvent_(textarea, 'change', this, function(e) { + if (this.text_ != textarea.value) { + Blockly.Events.fire(new Blockly.Events.Change( + this.block_, 'comment', null, this.text_, textarea.value)); + this.text_ = textarea.value; + } + }); + setTimeout(function() { + textarea.focus(); + }, 0); return this.foreignObject_; }; @@ -139,12 +150,14 @@ Blockly.Comment.prototype.updateEditable = function() { * @private */ Blockly.Comment.prototype.resizeBubble_ = function() { - var size = this.bubble_.getBubbleSize(); - var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; - this.foreignObject_.setAttribute('width', size.width - doubleBorderWidth); - this.foreignObject_.setAttribute('height', size.height - doubleBorderWidth); - this.textarea_.style.width = (size.width - doubleBorderWidth - 4) + 'px'; - this.textarea_.style.height = (size.height - doubleBorderWidth - 4) + 'px'; + if (this.isVisible()) { + var size = this.bubble_.getBubbleSize(); + var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; + this.foreignObject_.setAttribute('width', size.width - doubleBorderWidth); + this.foreignObject_.setAttribute('height', size.height - doubleBorderWidth); + this.textarea_.style.width = (size.width - doubleBorderWidth - 4) + 'px'; + this.textarea_.style.height = (size.height - doubleBorderWidth - 4) + 'px'; + } }; /** @@ -156,6 +169,8 @@ Blockly.Comment.prototype.setVisible = function(visible) { // No change. return; } + Blockly.Events.fire( + new Blockly.Events.Ui(this.block_, 'commentOpen', !visible, visible)); if ((!this.block_.isEditable() && !this.textarea_) || goog.userAgent.IE) { // Steal the code from warnings to make an uneditable text bubble. // MSIE does not support foreignobject; textareas are impossible. @@ -170,13 +185,11 @@ Blockly.Comment.prototype.setVisible = function(visible) { if (visible) { // Create the bubble. this.bubble_ = new Blockly.Bubble( - /** @type {!Blockly.Workspace} */ (this.block_.workspace), + /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), this.createEditor_(), this.block_.svgPath_, - this.iconX_, this.iconY_, - this.width_, this.height_); - this.bubble_.registerResizeEvent(this, this.resizeBubble_); + this.iconXY_, this.width_, this.height_); + this.bubble_.registerResizeEvent(this.resizeBubble_.bind(this)); this.updateColour(); - this.text_ = null; } else { // Dispose of the bubble. this.bubble_.dispose(); @@ -243,10 +256,13 @@ Blockly.Comment.prototype.getText = function() { * @param {string} text Comment text. */ Blockly.Comment.prototype.setText = function(text) { + if (this.text_ != text) { + Blockly.Events.fire(new Blockly.Events.Change( + this.block_, 'comment', null, this.text_, text)); + this.text_ = text; + } if (this.textarea_) { this.textarea_.value = text; - } else { - this.text_ = text; } }; @@ -254,6 +270,9 @@ Blockly.Comment.prototype.setText = function(text) { * Dispose of this comment. */ Blockly.Comment.prototype.dispose = function() { + if (Blockly.Events.isEnabled()) { + this.setText(''); // Fire event to delete comment. + } this.block_.comment = null; Blockly.Icon.prototype.dispose.call(this); }; diff --git a/core/connection.js b/core/connection.js index db5a8a6b98..a11f39c564 100644 --- a/core/connection.js +++ b/core/connection.js @@ -25,8 +25,8 @@ 'use strict'; goog.provide('Blockly.Connection'); -goog.provide('Blockly.ConnectionDB'); +goog.require('goog.asserts'); goog.require('goog.dom'); @@ -37,7 +37,10 @@ goog.require('goog.dom'); * @constructor */ Blockly.Connection = function(source, type) { - /** @type {!Blockly.Block} */ + /** + * @type {!Blockly.Block} + * @private + */ this.sourceBlock_ = source; /** @type {number} */ this.type = type; @@ -50,6 +53,34 @@ Blockly.Connection = function(source, type) { } }; +/** + * Constant for identifying connections that accept a boolean. + * @const + */ +Blockly.Connection.BOOLEAN = 1; + +/** + * Constant for identifying connections that accept a string. + * @const + */ +Blockly.Connection.STRING = 2; + +/** + * Constant for identifying connections that accept a number OR null. + * @const + */ +Blockly.Connection.NUMBER = 3; + +/** + * Constants for checking whether two connections are compatible. + */ +Blockly.Connection.CAN_CONNECT = 0; +Blockly.Connection.REASON_SELF_CONNECTION = 1; +Blockly.Connection.REASON_WRONG_TYPE = 2; +Blockly.Connection.REASON_TARGET_NULL = 3; +Blockly.Connection.REASON_CHECKS_FAILED = 4; +Blockly.Connection.REASON_DIFFERENT_WORKSPACES = 5; + /** * Connection this connection connects to. Null if not connected. * @type {Blockly.Connection} @@ -113,11 +144,128 @@ Blockly.Connection.prototype.dbOpposite_ = null; */ Blockly.Connection.prototype.hidden_ = null; +/** + * Connect two connections together. This is the connection on the superior + * block. + * @param {!Blockly.Connection} childConnection Connection on inferior block. + * @private + */ +Blockly.Connection.prototype.connect_ = function(childConnection) { + var parentConnection = this; + var parentBlock = parentConnection.getSourceBlock(); + var childBlock = childConnection.getSourceBlock(); + var isSurroundingC = false; + if (parentConnection == parentBlock.getFirstStatementConnection()) { + isSurroundingC = true; + } + // Disconnect any existing parent on the child connection. + if (childConnection.isConnected()) { + // Scratch-specific behaviour: + // If we're using a c-shaped block to surround a stack, remember where the + // stack used to be connected. + if (isSurroundingC) { + var previousParentConnection = childConnection.targetConnection; + } + childConnection.disconnect(); + } + if (parentConnection.isConnected()) { + // Other connection is already connected to something. + // Disconnect it and reattach it or bump it as needed. + var orphanBlock = parentConnection.targetBlock(); + var shadowDom = parentConnection.getShadowDom(); + // Temporarily set the shadow DOM to null so it does not respawn. + parentConnection.setShadowDom(null); + // Displaced shadow blocks dissolve rather than reattaching or bumping. + if (orphanBlock.isShadow()) { + // Save the shadow block so that field values are preserved. + shadowDom = Blockly.Xml.blockToDom(orphanBlock); + orphanBlock.dispose(); + orphanBlock = null; + } else if (parentConnection.type == Blockly.INPUT_VALUE) { + // Value connections. + // If female block is already connected, disconnect and bump the male. + if (!orphanBlock.outputConnection) { + throw 'Orphan block does not have an output connection.'; + } + // Attempt to reattach the orphan at the end of the newly inserted + // block. Since this block may be a row, walk down to the end + // or to the first (and only) shadow block. + var connection = Blockly.Connection.lastConnectionInRow_( + childBlock, orphanBlock); + if (connection) { + orphanBlock.outputConnection.connect(connection); + orphanBlock = null; + } + } else if (parentConnection.type == Blockly.NEXT_STATEMENT) { + // Statement connections. + // Statement blocks may be inserted into the middle of a stack. + // Split the stack. + if (!orphanBlock.previousConnection) { + throw 'Orphan block does not have a previous connection.'; + } + // Attempt to reattach the orphan at the bottom of the newly inserted + // block. Since this block may be a stack, walk down to the end. + var newBlock = childBlock; + while (newBlock.nextConnection) { + if (newBlock.nextConnection.isConnected()) { + newBlock = newBlock.getNextBlock(); + } else { + if (orphanBlock.previousConnection.checkType_( + newBlock.nextConnection)) { + newBlock.nextConnection.connect(orphanBlock.previousConnection); + orphanBlock = null; + } + break; + } + } + } + if (orphanBlock) { + // Unable to reattach orphan. + parentConnection.disconnect(); + if (Blockly.Events.recordUndo) { + // Bump it off to the side after a moment. + var group = Blockly.Events.getGroup(); + setTimeout(function() { + // Verify orphan hasn't been deleted or reconnected (user on meth). + if (orphanBlock.workspace && !orphanBlock.getParent()) { + Blockly.Events.setGroup(group); + if (orphanBlock.outputConnection) { + orphanBlock.outputConnection.bumpAwayFrom_(parentConnection); + } else if (orphanBlock.previousConnection) { + orphanBlock.previousConnection.bumpAwayFrom_(parentConnection); + } + Blockly.Events.setGroup(false); + } + }, Blockly.BUMP_DELAY); + } + } + // Restore the shadow DOM. + parentConnection.setShadowDom(shadowDom); + } + + if (isSurroundingC && previousParentConnection) { + previousParentConnection.connect(parentBlock.previousConnection); + } + + var event; + if (Blockly.Events.isEnabled()) { + event = new Blockly.Events.Move(childBlock); + } + // Establish the connections. + Blockly.Connection.connectReciprocally_(parentConnection, childConnection); + // Demote the inferior block so that one is a child of the superior one. + childBlock.setParent(parentBlock); + if (event) { + event.recordNew(); + Blockly.Events.fire(event); + } +}; + /** * Sever all links to this connection (not including from the source object). */ Blockly.Connection.prototype.dispose = function() { - if (this.targetConnection) { + if (this.isConnected()) { throw 'Disconnect connection before disposing of it.'; } if (this.inDB_) { @@ -133,6 +281,22 @@ Blockly.Connection.prototype.dispose = function() { this.dbOpposite_ = null; }; +/** + * @return {boolean} true if the connection is not connected or is connected to + * an insertion marker, false otherwise. + */ +Blockly.Connection.prototype.isConnectedToNonInsertionMarker = function() { + return this.targetConnection && !this.targetBlock().isInsertionMarker(); +}; + +/** + * Get the source block for this connection. + * @return {Blockly.Block} The source block, or null if there is none. + */ +Blockly.Connection.prototype.getSourceBlock = function() { + return this.sourceBlock_; +}; + /** * Does the connection belong to a superior block (higher in the source stack)? * @return {boolean} True if connection faces down or right. @@ -143,130 +307,207 @@ Blockly.Connection.prototype.isSuperior = function() { }; /** - * Connect this connection to another connection. - * @param {!Blockly.Connection} otherConnection Connection to connect to. + * Is the connection connected? + * @return {boolean} True if connection is connected to another connection. */ -Blockly.Connection.prototype.connect = function(otherConnection) { - if (this.sourceBlock_ == otherConnection.sourceBlock_) { - throw 'Attempted to connect a block to itself.'; +Blockly.Connection.prototype.isConnected = function() { + return !!this.targetConnection; +}; + +/** + * Checks whether the current connection can connect with the target + * connection. + * @param {Blockly.Connection} target Connection to check compatibility with. + * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, + * an error code otherwise. + * @private + */ +Blockly.Connection.prototype.canConnectWithReason_ = function(target) { + if (!target) { + return Blockly.Connection.REASON_TARGET_NULL; + } else if (this.sourceBlock_ && + target.getSourceBlock() == this.sourceBlock_) { + return Blockly.Connection.REASON_SELF_CONNECTION; + } else if (target.type != Blockly.OPPOSITE_TYPE[this.type]) { + return Blockly.Connection.REASON_WRONG_TYPE; + } else if (this.sourceBlock_ && target.getSourceBlock() && + this.sourceBlock_.workspace !== target.getSourceBlock().workspace) { + return Blockly.Connection.REASON_DIFFERENT_WORKSPACES; + } else if (!this.checkType_(target)) { + return Blockly.Connection.REASON_CHECKS_FAILED; + } + return Blockly.Connection.CAN_CONNECT; +}; + +/** + * Checks whether the current connection and target connection are compatible + * and throws an exception if they are not. + * @param {Blockly.Connection} target The connection to check compatibility + * with. + * @private + */ +Blockly.Connection.prototype.checkConnection_ = function(target) { + switch (this.canConnectWithReason_(target)) { + case Blockly.Connection.CAN_CONNECT: + break; + case Blockly.Connection.REASON_SELF_CONNECTION: + throw 'Attempted to connect a block to itself.'; + case Blockly.Connection.REASON_DIFFERENT_WORKSPACES: + // Usually this means one block has been deleted. + throw 'Blocks not on same workspace.'; + case Blockly.Connection.REASON_WRONG_TYPE: + throw 'Attempt to connect incompatible types.'; + case Blockly.Connection.REASON_TARGET_NULL: + throw 'Target connection is null.'; + case Blockly.Connection.REASON_CHECKS_FAILED: + throw 'Connection checks failed.'; + default: + throw 'Unknown connection failure: this should never happen!'; } - if (this.sourceBlock_.workspace !== otherConnection.sourceBlock_.workspace) { - throw 'Blocks are on different workspaces.'; +}; + +/** + * Check if the two connections can be dragged to connect to each other. + * This is used by the connection database when searching for the closest + * connection. + * @param {!Blockly.Connection} candidate A nearby connection to check. + * @return {boolean} True if the connection is allowed, false otherwise. + */ +Blockly.Connection.prototype.isConnectionAllowed = function(candidate) { + + // Don't consider insertion markers. + if (candidate.sourceBlock_.isInsertionMarker()) { + return false; } - if (Blockly.OPPOSITE_TYPE[this.type] != otherConnection.type) { - throw 'Attempt to connect incompatible types.'; + + // Type checking. + var canConnect = this.canConnectWithReason_(candidate); + if (canConnect != Blockly.Connection.CAN_CONNECT && + canConnect != Blockly.Connection.REASON_MUST_DISCONNECT) { + return false; } - if (this.type == Blockly.INPUT_VALUE || this.type == Blockly.OUTPUT_VALUE) { - if (this.targetConnection) { - // Can't make a value connection if male block is already connected. - throw 'Source connection already connected (value).'; - } else if (otherConnection.targetConnection) { - // If female block is already connected, disconnect and bump the male. - var orphanBlock = otherConnection.targetBlock(); - orphanBlock.setParent(null); - if (orphanBlock.isShadow()) { - orphanBlock.dispose(); - } else { - if (!orphanBlock.outputConnection) { - throw 'Orphan block does not have an output connection.'; + + var firstStatementConnection = + this.sourceBlock_.getFirstStatementConnection(); + switch (candidate.type) { + case Blockly.PREVIOUS_STATEMENT: { + if (!firstStatementConnection || this != firstStatementConnection) { + if (this.targetConnection) { + return false; } - // Attempt to reattach the orphan at the end of the newly inserted - // block. Since this block may be a row, walk down to the end. - var newBlock = this.sourceBlock_; - var connection; - while (connection = Blockly.Connection.singleConnection_( - /** @type {!Blockly.Block} */ (newBlock), orphanBlock)) { - // '=' is intentional in line above. - newBlock = connection.targetBlock(); - if (!newBlock || newBlock.isShadow()) { - orphanBlock.outputConnection.connect(connection); - orphanBlock = null; - break; + if (candidate.targetConnection) { + // If the other side of this connection is the active insertion marker + // connection, we've obviously already decided that this is a good + // connection. + if (candidate.targetConnection == + Blockly.insertionMarkerConnection_) { + return true; + } else { + return false; + } + } + } + + // Scratch-specific behaviour: + // If this is a c-shaped block, statement blocks cannot be connected + // anywhere other than inside the first statement input. + if (firstStatementConnection) { + // Can't connect if there is already a block inside the first statement + // input. + if (this == firstStatementConnection) { + if (this.targetConnection) { + return false; } } - if (orphanBlock) { - // Unable to reattach orphan. Bump it off to the side. - setTimeout(function() { - orphanBlock.outputConnection.bumpAwayFrom_(otherConnection); - }, Blockly.BUMP_DELAY); + // Can't connect this block's next connection unless we're connecting + // in front of the first block on a stack. + else if (this == this.sourceBlock_.nextConnection && + candidate.isConnectedToNonInsertionMarker()) { + return false; } } + break; } - } else { - if (this.targetConnection) { - throw 'Source connection already connected (block).'; - } else if (otherConnection.targetConnection) { - // Statement blocks may be inserted into the middle of a stack. - if (this.type != Blockly.PREVIOUS_STATEMENT) { - throw 'Can only do a mid-stack connection with the top of a block.'; + case Blockly.OUTPUT_VALUE: { + // Don't offer to connect an already connected left (male) value plug to + // an available right (female) value plug. + if (candidate.targetConnection || this.targetConnection) { + return false; } - // Split the stack. - var orphanBlock = otherConnection.targetBlock(); - orphanBlock.setParent(null); - if (!orphanBlock.previousConnection) { - throw 'Orphan block does not have a previous connection.'; + break; + } + case Blockly.INPUT_VALUE: { + // Offering to connect the left (male) of a value block to an already + // connected value pair is ok, we'll splice it in. + // However, don't offer to splice into an unmovable block. + if (candidate.targetConnection && + !candidate.targetBlock().isMovable() && + !candidate.targetBlock().isShadow()) { + return false; } - // Attempt to reattach the orphan at the bottom of the newly inserted - // block. Since this block may be a stack, walk down to the end. - var newBlock = this.sourceBlock_; - while (newBlock.nextConnection) { - if (newBlock.nextConnection.targetConnection) { - newBlock = newBlock.getNextBlock(); - } else { - if (orphanBlock.previousConnection.checkType_( - newBlock.nextConnection)) { - newBlock.nextConnection.connect(orphanBlock.previousConnection); - orphanBlock = null; - } - break; - } + break; + } + case Blockly.NEXT_STATEMENT: { + // Scratch-specific behaviour: + // If this is a c-block, we can't connect this block's + // previous connection unless we're connecting to the end of the last + // block on a stack or there's already a block connected inside the c. + if (firstStatementConnection && + this == this.sourceBlock_.previousConnection && + candidate.isConnectedToNonInsertionMarker() && + !firstStatementConnection.targetConnection) { + return false; } - if (orphanBlock) { - // Unable to reattach orphan. Bump it off to the side. - setTimeout(function() { - orphanBlock.previousConnection.bumpAwayFrom_(otherConnection); - }, Blockly.BUMP_DELAY); + // Don't let a block with no next connection bump other blocks out of the + // stack. + if (candidate.isConnectedToNonInsertionMarker() && + !this.sourceBlock_.nextConnection) { + return false; } + break; } + default: + throw 'Unknown connection type in isConnectionAllowed'; + } + + // Don't let blocks try to connect to themselves or ones they nest. + if (Blockly.draggingConnections_.indexOf(candidate) != -1) { + return false; } + return true; +}; + +/** + * Connect this connection to another connection. + * @param {!Blockly.Connection} otherConnection Connection to connect to. + */ +Blockly.Connection.prototype.connect = function(otherConnection) { + if (this.targetConnection == otherConnection) { + // Already connected together. NOP. + return; + } + this.checkConnection_(otherConnection); // Determine which block is superior (higher in the source stack). - var parentBlock, childBlock; if (this.isSuperior()) { // Superior block. - parentBlock = this.sourceBlock_; - childBlock = otherConnection.sourceBlock_; + this.connect_(otherConnection); } else { // Inferior block. - parentBlock = otherConnection.sourceBlock_; - childBlock = this.sourceBlock_; + otherConnection.connect_(this); } +}; - // Establish the connections. - this.targetConnection = otherConnection; - otherConnection.targetConnection = this; - - // Demote the inferior block so that one is a child of the superior one. - childBlock.setParent(parentBlock); - - if (parentBlock.rendered) { - parentBlock.updateDisabled(); - } - if (childBlock.rendered) { - childBlock.updateDisabled(); - } - if (parentBlock.rendered && childBlock.rendered) { - if (this.type == Blockly.NEXT_STATEMENT || - this.type == Blockly.PREVIOUS_STATEMENT) { - // Child block may need to square off its corners if it is in a stack. - // Rendering a child will render its parent. - childBlock.render(); - } else { - // Child block does not change shape. Rendering the parent node will - // move its connected children into position. - parentBlock.render(); - } - } +/** + * Update two connections to target each other. + * @param {Blockly.Connection} first The first connection to update. + * @param {Blockly.Connection} second The second conneciton to update. + * @private + */ +Blockly.Connection.connectReciprocally_ = function(first, second) { + goog.asserts.assert(first && second, 'Cannot connect null connections.'); + first.targetConnection = second; + second.targetConnection = first; }; /** @@ -293,302 +534,112 @@ Blockly.Connection.singleConnection_ = function(block, orphanBlock) { return connection; }; +/** + * Walks down a row a blocks, at each stage checking if there are any + * connections that will accept the orphaned block. If at any point there + * are zero or multiple eligible connections, returns null. Otherwise + * returns the only input on the last block in the chain. + * Terminates early for shadow blocks. + * @param {!Blockly.Block} startBlock The block on which to start the search. + * @param {!Blockly.Block} orphanBlock The block that is looking for a home. + * @return {Blockly.Connection} The suitable connection point on the chain + * of blocks, or null. + * @private + */ +Blockly.Connection.lastConnectionInRow_ = function(startBlock, orphanBlock) { + var newBlock = startBlock; + var connection; + while (connection = Blockly.Connection.singleConnection_( + /** @type {!Blockly.Block} */ (newBlock), orphanBlock)) { + // '=' is intentional in line above. + newBlock = connection.targetBlock(); + if (!newBlock || newBlock.isShadow()) { + return connection; + } + } + return null; +}; + /** * Disconnect this connection. */ Blockly.Connection.prototype.disconnect = function() { var otherConnection = this.targetConnection; - if (!otherConnection) { - throw 'Source connection not connected.'; - } else if (otherConnection.targetConnection != this) { - throw 'Target connection not connected to source connection.'; - } - otherConnection.targetConnection = null; - this.targetConnection = null; + goog.asserts.assert(otherConnection, 'Source connection not connected.'); + goog.asserts.assert(otherConnection.targetConnection == this, + 'Target connection not connected to source connection.'); - // Rerender the parent so that it may reflow. var parentBlock, childBlock, parentConnection; if (this.isSuperior()) { // Superior block. parentBlock = this.sourceBlock_; - childBlock = otherConnection.sourceBlock_; + childBlock = otherConnection.getSourceBlock(); parentConnection = this; } else { // Inferior block. - parentBlock = otherConnection.sourceBlock_; + parentBlock = otherConnection.getSourceBlock(); childBlock = this.sourceBlock_; parentConnection = otherConnection; } - var shadow = parentConnection.getShadowDom(); - if (parentBlock.workspace && !childBlock.isShadow() && shadow) { - // Respawn the shadow block. - var blockShadow = - Blockly.Xml.domToBlock(parentBlock.workspace, shadow); - if (blockShadow.outputConnection) { - parentConnection.connect(blockShadow.outputConnection); - } else if (blockShadow.previousConnection) { - parentConnection.connect(blockShadow.previousConnection); - } else { - throw 'Child block does not have output or previous statement.'; - } - blockShadow.initSvg(); - blockShadow.render(false); - } - if (parentBlock.rendered) { - parentBlock.render(); - } - if (childBlock.rendered) { - childBlock.updateDisabled(); - childBlock.render(); - } + this.disconnectInternal_(parentBlock, childBlock); + parentConnection.respawnShadow_(); }; /** - * Returns the block that this connection connects to. - * @return {Blockly.Block} The connected block or null if none is connected. - */ -Blockly.Connection.prototype.targetBlock = function() { - if (this.targetConnection) { - return this.targetConnection.sourceBlock_; - } - return null; -}; - -/** - * Move the block(s) belonging to the connection to a point where they don't - * visually interfere with the specified connection. - * @param {!Blockly.Connection} staticConnection The connection to move away - * from. + * Disconnect two blocks that are connected by this connection. + * @param {!Blockly.Block} parentBlock The superior block. + * @param {!Blockly.Block} childBlock The inferior block. * @private */ -Blockly.Connection.prototype.bumpAwayFrom_ = function(staticConnection) { - if (Blockly.dragMode_ != 0) { - // Don't move blocks around while the user is doing the same. - return; - } - // Move the root block. - var rootBlock = this.sourceBlock_.getRootBlock(); - if (rootBlock.isInFlyout) { - // Don't move blocks around in a flyout. - return; - } - var reverse = false; - if (!rootBlock.isMovable()) { - // Can't bump an uneditable block away. - // Check to see if the other block is movable. - rootBlock = staticConnection.sourceBlock_.getRootBlock(); - if (!rootBlock.isMovable()) { - return; - } - // Swap the connections and move the 'static' connection instead. - staticConnection = this; - reverse = true; - } - // Raise it to the top for extra visibility. - rootBlock.getSvgRoot().parentNode.appendChild(rootBlock.getSvgRoot()); - var dx = (staticConnection.x_ + Blockly.SNAP_RADIUS) - this.x_; - var dy = (staticConnection.y_ + Blockly.SNAP_RADIUS) - this.y_; - if (reverse) { - // When reversing a bump due to an uneditable block, bump up. - dy = -dy; - } - if (rootBlock.RTL) { - dx = -dx; - } - rootBlock.moveBy(dx, dy); -}; - -/** - * Change the connection's coordinates. - * @param {number} x New absolute x coordinate. - * @param {number} y New absolute y coordinate. - */ -Blockly.Connection.prototype.moveTo = function(x, y) { - // Remove it from its old location in the database (if already present) - if (this.inDB_) { - this.db_.removeConnection_(this); +Blockly.Connection.prototype.disconnectInternal_ = function(parentBlock, + childBlock) { + var event; + if (Blockly.Events.isEnabled()) { + event = new Blockly.Events.Move(childBlock); } - this.x_ = x; - this.y_ = y; - // Insert it into its new location in the database. - if (!this.hidden_) { - this.db_.addConnection_(this); - } -}; - -/** - * Change the connection's coordinates. - * @param {number} dx Change to x coordinate. - * @param {number} dy Change to y coordinate. - */ -Blockly.Connection.prototype.moveBy = function(dx, dy) { - this.moveTo(this.x_ + dx, this.y_ + dy); -}; - -/** - * Add highlighting around this connection. - */ -Blockly.Connection.prototype.highlight = function() { - var steps; - if (this.type == Blockly.INPUT_VALUE || this.type == Blockly.OUTPUT_VALUE) { - var tabWidth = this.sourceBlock_.RTL ? -Blockly.BlockSvg.TAB_WIDTH : - Blockly.BlockSvg.TAB_WIDTH; - steps = 'm 0,0 v 5 c 0,10 ' + -tabWidth + ',-8 ' + -tabWidth + ',7.5 s ' + - tabWidth + ',-2.5 ' + tabWidth + ',7.5 v 5'; - } else { - if (this.sourceBlock_.RTL) { - steps = 'm 20,0 h -5 ' + Blockly.BlockSvg.NOTCH_PATH_RIGHT + ' h -5'; - } else { - steps = 'm -20,0 h 5 ' + Blockly.BlockSvg.NOTCH_PATH_LEFT + ' h 5'; - } + var otherConnection = this.targetConnection; + otherConnection.targetConnection = null; + this.targetConnection = null; + childBlock.setParent(null); + if (event) { + event.recordNew(); + Blockly.Events.fire(event); } - var xy = this.sourceBlock_.getRelativeToSurfaceXY(); - var x = this.x_ - xy.x; - var y = this.y_ - xy.y; - Blockly.Connection.highlightedPath_ = Blockly.createSvgElement('path', - {'class': 'blocklyHighlightedConnectionPath', - 'd': steps, - transform: 'translate(' + x + ',' + y + ')'}, - this.sourceBlock_.getSvgRoot()); }; /** - * Remove the highlighting around this connection. - */ -Blockly.Connection.prototype.unhighlight = function() { - goog.dom.removeNode(Blockly.Connection.highlightedPath_); - delete Blockly.Connection.highlightedPath_; -}; - -/** - * Move the blocks on either side of this connection right next to each other. + * Respawn the shadow block if there was one connected to the this connection. + * @return {Blockly.Block} The newly spawned shadow block, or null if none was + * spawned. * @private */ -Blockly.Connection.prototype.tighten_ = function() { - var dx = this.targetConnection.x_ - this.x_; - var dy = this.targetConnection.y_ - this.y_; - if (dx != 0 || dy != 0) { - var block = this.targetBlock(); - var svgRoot = block.getSvgRoot(); - if (!svgRoot) { - throw 'block is not rendered.'; +Blockly.Connection.prototype.respawnShadow_ = function() { + var parentBlock = this.getSourceBlock(); + var shadow = this.getShadowDom(); + if (parentBlock.workspace && shadow && Blockly.Events.recordUndo) { + var blockShadow = + Blockly.Xml.domToBlock(shadow, parentBlock.workspace); + if (blockShadow.outputConnection) { + this.connect(blockShadow.outputConnection); + } else if (blockShadow.previousConnection) { + this.connect(blockShadow.previousConnection); + } else { + throw 'Child block does not have output or previous statement.'; } - var xy = Blockly.getRelativeXY_(svgRoot); - block.getSvgRoot().setAttribute('transform', - 'translate(' + (xy.x - dx) + ',' + (xy.y - dy) + ')'); - block.moveConnections_(-dx, -dy); + return blockShadow; } + return null; }; /** - * Find the closest compatible connection to this connection. - * @param {number} maxLimit The maximum radius to another connection. - * @param {number} dx Horizontal offset between this connection's location - * in the database and the current location (as a result of dragging). - * @param {number} dy Vertical offset between this connection's location - * in the database and the current location (as a result of dragging). - * @return {!{connection: ?Blockly.Connection, radius: number}} Contains two properties: 'connection' which is either - * another connection or null, and 'radius' which is the distance. + * Returns the block that this connection connects to. + * @return {Blockly.Block} The connected block or null if none is connected. */ -Blockly.Connection.prototype.closest = function(maxLimit, dx, dy) { - if (this.targetConnection) { - // Don't offer to connect to a connection that's already connected. - return {connection: null, radius: maxLimit}; - } - // Determine the opposite type of connection. - var db = this.dbOpposite_; - - // Since this connection is probably being dragged, add the delta. - var currentX = this.x_ + dx; - var currentY = this.y_ + dy; - - // Binary search to find the closest y location. - var pointerMin = 0; - var pointerMax = db.length - 2; - var pointerMid = pointerMax; - while (pointerMin < pointerMid) { - if (db[pointerMid].y_ < currentY) { - pointerMin = pointerMid; - } else { - pointerMax = pointerMid; - } - pointerMid = Math.floor((pointerMin + pointerMax) / 2); - } - - // Walk forward and back on the y axis looking for the closest x,y point. - pointerMin = pointerMid; - pointerMax = pointerMid; - var closestConnection = null; - var sourceBlock = this.sourceBlock_; - var thisConnection = this; - if (db.length) { - while (pointerMin >= 0 && checkConnection_(pointerMin)) { - pointerMin--; - } - do { - pointerMax++; - } while (pointerMax < db.length && checkConnection_(pointerMax)); - } - - /** - * Computes if the current connection is within the allowed radius of another - * connection. - * This function is a closure and has access to outside variables. - * @param {number} yIndex The other connection's index in the database. - * @return {boolean} True if the search needs to continue: either the current - * connection's vertical distance from the other connection is less than - * the allowed radius, or if the connection is not compatible. - * @private - */ - function checkConnection_(yIndex) { - var connection = db[yIndex]; - if (connection.type == Blockly.OUTPUT_VALUE || - connection.type == Blockly.PREVIOUS_STATEMENT) { - // Don't offer to connect an already connected left (male) value plug to - // an available right (female) value plug. Don't offer to connect the - // bottom of a statement block to one that's already connected. - if (connection.targetConnection) { - return true; - } - } - // Offering to connect the top of a statement block to an already connected - // connection is ok, we'll just insert it into the stack. - - // Offering to connect the left (male) of a value block to an already - // connected value pair is ok, we'll splice it in. - // However, don't offer to splice into an unmovable block. - if (connection.type == Blockly.INPUT_VALUE && - connection.targetConnection && - !connection.targetBlock().isMovable() && - !connection.targetBlock().isShadow()) { - return true; - } - - // Do type checking. - if (!thisConnection.checkType_(connection)) { - return true; - } - - // Don't let blocks try to connect to themselves or ones they nest. - var targetSourceBlock = connection.sourceBlock_; - do { - if (sourceBlock == targetSourceBlock) { - return true; - } - targetSourceBlock = targetSourceBlock.getParent(); - } while (targetSourceBlock); - - // Only connections within the maxLimit radius. - var dx = currentX - connection.x_; - var dy = currentY - connection.y_; - var r = Math.sqrt(dx * dx + dy * dy); - if (r <= maxLimit) { - closestConnection = connection; - maxLimit = r; - } - return Math.abs(dy) < maxLimit; +Blockly.Connection.prototype.targetBlock = function() { + if (this.isConnected()) { + return this.targetConnection.getSourceBlock(); } - return {connection: closestConnection, radius: maxLimit}; + return null; }; /** @@ -599,17 +650,6 @@ Blockly.Connection.prototype.closest = function(maxLimit, dx, dy) { * @private */ Blockly.Connection.prototype.checkType_ = function(otherConnection) { - // Don't split a connection where both sides are immovable. - var thisTargetBlock = this.targetBlock(); - if (thisTargetBlock && !thisTargetBlock.isMovable() && - !this.sourceBlock_.isMovable()) { - return false; - } - var otherTargetBlock = otherConnection.targetBlock(); - if (otherTargetBlock && !otherTargetBlock.isMovable() && - !otherConnection.sourceBlock_.isMovable()) { - return false; - } if (!this.check_ || !otherConnection.check_) { // One or both sides are promiscuous enough that anything will fit. return true; @@ -639,12 +679,9 @@ Blockly.Connection.prototype.setCheck = function(check) { } this.check_ = check; // The new value type may not be compatible with the existing connection. - if (this.targetConnection && !this.checkType_(this.targetConnection)) { - if (this.isSuperior()) { - this.targetBlock().setParent(null); - } else { - this.sourceBlock_.setParent(null); - } + if (this.isConnected() && !this.checkType_(this.targetConnection)) { + var child = this.isSuperior() ? this.targetBlock() : this.sourceBlock_; + child.unplug(); // Bump away. this.sourceBlock_.bumpNeighbours_(); } @@ -654,6 +691,22 @@ Blockly.Connection.prototype.setCheck = function(check) { return this; }; +/** + * Returns a shape enum for this connection. + * @return {number} Enum representing shape. + */ +Blockly.Connection.prototype.getOutputShape = function() { + if (!this.check_) return Blockly.Connection.NUMBER; + if (this.check_.indexOf('Boolean') !== -1) { + return Blockly.Connection.BOOLEAN; + } + if (this.check_.indexOf('String') !== -1) { + return Blockly.Connection.STRING; + } + + return Blockly.Connection.NUMBER; +}; + /** * Change a connection's shadow block. * @param {Element} shadow DOM representation of a block or null. @@ -669,251 +722,3 @@ Blockly.Connection.prototype.setShadowDom = function(shadow) { Blockly.Connection.prototype.getShadowDom = function() { return this.shadowDom_; }; - -/** - * Find all nearby compatible connections to this connection. - * Type checking does not apply, since this function is used for bumping. - * @param {number} maxLimit The maximum radius to another connection. - * @return {!Array.} List of connections. - * @private - */ -Blockly.Connection.prototype.neighbours_ = function(maxLimit) { - // Determine the opposite type of connection. - var db = this.dbOpposite_; - - var currentX = this.x_; - var currentY = this.y_; - - // Binary search to find the closest y location. - var pointerMin = 0; - var pointerMax = db.length - 2; - var pointerMid = pointerMax; - while (pointerMin < pointerMid) { - if (db[pointerMid].y_ < currentY) { - pointerMin = pointerMid; - } else { - pointerMax = pointerMid; - } - pointerMid = Math.floor((pointerMin + pointerMax) / 2); - } - - // Walk forward and back on the y axis looking for the closest x,y point. - pointerMin = pointerMid; - pointerMax = pointerMid; - var neighbours = []; - var sourceBlock = this.sourceBlock_; - if (db.length) { - while (pointerMin >= 0 && checkConnection_(pointerMin)) { - pointerMin--; - } - do { - pointerMax++; - } while (pointerMax < db.length && checkConnection_(pointerMax)); - } - - /** - * Computes if the current connection is within the allowed radius of another - * connection. - * This function is a closure and has access to outside variables. - * @param {number} yIndex The other connection's index in the database. - * @return {boolean} True if the current connection's vertical distance from - * the other connection is less than the allowed radius. - */ - function checkConnection_(yIndex) { - var dx = currentX - db[yIndex].x_; - var dy = currentY - db[yIndex].y_; - var r = Math.sqrt(dx * dx + dy * dy); - if (r <= maxLimit) { - neighbours.push(db[yIndex]); - } - return dy < maxLimit; - } - return neighbours; -}; - -/** - * Set whether this connections is hidden (not tracked in a database) or not. - * @param {boolean} hidden True if connection is hidden. - */ -Blockly.Connection.prototype.setHidden = function(hidden) { - this.hidden_ = hidden; - if (hidden && this.inDB_) { - this.db_.removeConnection_(this); - } else if (!hidden && !this.inDB_) { - this.db_.addConnection_(this); - } -}; - -/** - * Hide this connection, as well as all down-stream connections on any block - * attached to this connection. This happens when a block is collapsed. - * Also hides down-stream comments. - */ -Blockly.Connection.prototype.hideAll = function() { - this.setHidden(true); - if (this.targetConnection) { - var blocks = this.targetBlock().getDescendants(); - for (var b = 0; b < blocks.length; b++) { - var block = blocks[b]; - // Hide all connections of all children. - var connections = block.getConnections_(true); - for (var c = 0; c < connections.length; c++) { - connections[c].setHidden(true); - } - // Close all bubbles of all children. - var icons = block.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].setVisible(false); - } - } - } -}; - -/** - * Unhide this connection, as well as all down-stream connections on any block - * attached to this connection. This happens when a block is expanded. - * Also unhides down-stream comments. - * @return {!Array.} List of blocks to render. - */ -Blockly.Connection.prototype.unhideAll = function() { - this.setHidden(false); - // All blocks that need unhiding must be unhidden before any rendering takes - // place, since rendering requires knowing the dimensions of lower blocks. - // Also, since rendering a block renders all its parents, we only need to - // render the leaf nodes. - var renderList = []; - if (this.type != Blockly.INPUT_VALUE && this.type != Blockly.NEXT_STATEMENT) { - // Only spider down. - return renderList; - } - var block = this.targetBlock(); - if (block) { - var connections; - if (block.isCollapsed()) { - // This block should only be partially revealed since it is collapsed. - connections = []; - block.outputConnection && connections.push(block.outputConnection); - block.nextConnection && connections.push(block.nextConnection); - block.previousConnection && connections.push(block.previousConnection); - } else { - // Show all connections of this block. - connections = block.getConnections_(true); - } - for (var c = 0; c < connections.length; c++) { - renderList.push.apply(renderList, connections[c].unhideAll()); - } - if (renderList.length == 0) { - // Leaf block. - renderList[0] = block; - } - } - return renderList; -}; - - -/** - * Database of connections. - * Connections are stored in order of their vertical component. This way - * connections in an area may be looked up quickly using a binary search. - * @constructor - */ -Blockly.ConnectionDB = function() { -}; - -Blockly.ConnectionDB.prototype = new Array(); -/** - * Don't inherit the constructor from Array. - * @type {!Function} - */ -Blockly.ConnectionDB.constructor = Blockly.ConnectionDB; - -/** - * Add a connection to the database. Must not already exist in DB. - * @param {!Blockly.Connection} connection The connection to be added. - * @private - */ -Blockly.ConnectionDB.prototype.addConnection_ = function(connection) { - if (connection.inDB_) { - throw 'Connection already in database.'; - } - if (connection.sourceBlock_.isInFlyout) { - // Don't bother maintaining a database of connections in a flyout. - return; - } - // Insert connection using binary search. - var pointerMin = 0; - var pointerMax = this.length; - while (pointerMin < pointerMax) { - var pointerMid = Math.floor((pointerMin + pointerMax) / 2); - if (this[pointerMid].y_ < connection.y_) { - pointerMin = pointerMid + 1; - } else if (this[pointerMid].y_ > connection.y_) { - pointerMax = pointerMid; - } else { - pointerMin = pointerMid; - break; - } - } - this.splice(pointerMin, 0, connection); - connection.inDB_ = true; -}; - -/** - * Remove a connection from the database. Must already exist in DB. - * @param {!Blockly.Connection} connection The connection to be removed. - * @private - */ -Blockly.ConnectionDB.prototype.removeConnection_ = function(connection) { - if (!connection.inDB_) { - throw 'Connection not in database.'; - } - connection.inDB_ = false; - // Find the connection using a binary search. - // About 10% faster than a linear search using indexOf. - var pointerMin = 0; - var pointerMax = this.length - 2; - var pointerMid = pointerMax; - while (pointerMin < pointerMid) { - if (this[pointerMid].y_ < connection.y_) { - pointerMin = pointerMid; - } else { - pointerMax = pointerMid; - } - pointerMid = Math.floor((pointerMin + pointerMax) / 2); - } - - // Walk forward and back on the y axis looking for the connection. - // When found, splice it out of the array. - pointerMin = pointerMid; - pointerMax = pointerMid; - while (pointerMin >= 0 && this[pointerMin].y_ == connection.y_) { - if (this[pointerMin] == connection) { - this.splice(pointerMin, 1); - return; - } - pointerMin--; - } - do { - if (this[pointerMax] == connection) { - this.splice(pointerMax, 1); - return; - } - pointerMax++; - } while (pointerMax < this.length && - this[pointerMax].y_ == connection.y_); - throw 'Unable to find connection in connectionDB.'; -}; - -/** - * Initialize a set of connection DBs for a specified workspace. - * @param {!Blockly.Workspace} workspace The workspace this DB is for. - */ -Blockly.ConnectionDB.init = function(workspace) { - // Create four databases, one for each connection type. - var dbList = []; - dbList[Blockly.INPUT_VALUE] = new Blockly.ConnectionDB(); - dbList[Blockly.OUTPUT_VALUE] = new Blockly.ConnectionDB(); - dbList[Blockly.NEXT_STATEMENT] = new Blockly.ConnectionDB(); - dbList[Blockly.PREVIOUS_STATEMENT] = new Blockly.ConnectionDB(); - workspace.connectionDBList = dbList; -}; diff --git a/core/connection_db.js b/core/connection_db.js new file mode 100644 index 0000000000..9d143e3671 --- /dev/null +++ b/core/connection_db.js @@ -0,0 +1,300 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2011 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 Components for managing connections between blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.ConnectionDB'); + +goog.require('Blockly.Connection'); + + +/** + * Database of connections. + * Connections are stored in order of their vertical component. This way + * connections in an area may be looked up quickly using a binary search. + * @constructor + */ +Blockly.ConnectionDB = function() { +}; + +Blockly.ConnectionDB.prototype = new Array(); +/** + * Don't inherit the constructor from Array. + * @type {!Function} + */ +Blockly.ConnectionDB.constructor = Blockly.ConnectionDB; + +/** + * Add a connection to the database. Must not already exist in DB. + * @param {!Blockly.Connection} connection The connection to be added. + */ +Blockly.ConnectionDB.prototype.addConnection = function(connection) { + if (connection.inDB_) { + throw 'Connection already in database.'; + } + if (connection.getSourceBlock().isInFlyout) { + // Don't bother maintaining a database of connections in a flyout. + return; + } + var position = this.findPositionForConnection_(connection); + this.splice(position, 0, connection); + connection.inDB_ = true; +}; + +/** + * Find the given connection. + * Starts by doing a binary search to find the approximate location, then + * linearly searches nearby for the exact connection. + * @param {!Blockly.Connection} conn The connection to find. + * @return {number} The index of the connection, or -1 if the connection was + * not found. + */ +Blockly.ConnectionDB.prototype.findConnection = function(conn) { + if (!this.length) { + return -1; + } + + var bestGuess = this.findPositionForConnection_(conn); + if (bestGuess >= this.length) { + // Not in list + return -1; + } + + var yPos = conn.y_; + // Walk forward and back on the y axis looking for the connection. + var pointerMin = bestGuess; + var pointerMax = bestGuess; + while (pointerMin >= 0 && this[pointerMin].y_ == yPos) { + if (this[pointerMin] == conn) { + return pointerMin; + } + pointerMin--; + } + + while (pointerMax < this.length && this[pointerMax].y_ == yPos) { + if (this[pointerMax] == conn) { + return pointerMax; + } + pointerMax++; + } + return -1; +}; + +/** + * Finds a candidate position for inserting this connection into the list. + * This will be in the correct y order but makes no guarantees about ordering in + * the x axis. + * @param {!Blockly.Connection} connection The connection to insert. + * @return {number} The candidate index. + * @private + */ +Blockly.ConnectionDB.prototype.findPositionForConnection_ = + function(connection) { + if (!this.length) { + return 0; + } + var pointerMin = 0; + var pointerMax = this.length; + while (pointerMin < pointerMax) { + var pointerMid = Math.floor((pointerMin + pointerMax) / 2); + if (this[pointerMid].y_ < connection.y_) { + pointerMin = pointerMid + 1; + } else if (this[pointerMid].y_ > connection.y_) { + pointerMax = pointerMid; + } else { + pointerMin = pointerMid; + break; + } + } + return pointerMin; +}; + +/** + * Remove a connection from the database. Must already exist in DB. + * @param {!Blockly.Connection} connection The connection to be removed. + * @private + */ +Blockly.ConnectionDB.prototype.removeConnection_ = function(connection) { + if (!connection.inDB_) { + throw 'Connection not in database.'; + } + var removalIndex = this.findConnection(connection); + if (removalIndex == -1) { + throw 'Unable to find connection in connectionDB.'; + } + connection.inDB_ = false; + this.splice(removalIndex, 1); +}; + +/** + * Find all nearby connections to the given connection. + * Type checking does not apply, since this function is used for bumping. + * @param {!Blockly.Connection} connection The connection whose neighbours + * should be returned. + * @param {number} maxRadius The maximum radius to another connection. + * @return {!Array.} List of connections. + */ +Blockly.ConnectionDB.prototype.getNeighbours = function(connection, maxRadius) { + var db = this; + var currentX = connection.x_; + var currentY = connection.y_; + + // Binary search to find the closest y location. + var pointerMin = 0; + var pointerMax = db.length - 2; + var pointerMid = pointerMax; + while (pointerMin < pointerMid) { + if (db[pointerMid].y_ < currentY) { + pointerMin = pointerMid; + } else { + pointerMax = pointerMid; + } + pointerMid = Math.floor((pointerMin + pointerMax) / 2); + } + + var neighbours = []; + /** + * Computes if the current connection is within the allowed radius of another + * connection. + * This function is a closure and has access to outside variables. + * @param {number} yIndex The other connection's index in the database. + * @return {boolean} True if the current connection's vertical distance from + * the other connection is less than the allowed radius. + */ + function checkConnection_(yIndex) { + var dx = currentX - db[yIndex].x_; + var dy = currentY - db[yIndex].y_; + var r = Math.sqrt(dx * dx + dy * dy); + if (r <= maxRadius) { + neighbours.push(db[yIndex]); + } + return dy < maxRadius; + } + + // Walk forward and back on the y axis looking for the closest x,y point. + pointerMin = pointerMid; + pointerMax = pointerMid; + if (db.length) { + while (pointerMin >= 0 && checkConnection_(pointerMin)) { + pointerMin--; + } + do { + pointerMax++; + } while (pointerMax < db.length && checkConnection_(pointerMax)); + } + + return neighbours; +}; + + +/** + * Is the candidate connection close to the reference connection. + * Extremely fast; only looks at Y distance. + * @param {number} index Index in database of candidate connection. + * @param {number} baseY Reference connection's Y value. + * @param {number} maxRadius The maximum radius to another connection. + * @return {boolean} True if connection is in range. + * @private + */ +Blockly.ConnectionDB.prototype.isInYRange_ = function(index, baseY, maxRadius) { + return (Math.abs(this[index].y_ - baseY) <= maxRadius); +}; + +/** + * Find the closest compatible connection to this connection. + * @param {!Blockly.Connection} conn The connection searching for a compatible + * mate. + * @param {number} maxRadius The maximum radius to another connection. + * @param {!goog.math.Coordinate} dxy Offset between this connection's location + * in the database and the current location (as a result of dragging). + * @return {!{connection: ?Blockly.Connection, radius: number}} Contains two + * properties:' connection' which is either another connection or null, + * and 'radius' which is the distance. + */ +Blockly.ConnectionDB.prototype.searchForClosest = function(conn, maxRadius, + dxy) { + // Don't bother. + if (!this.length) { + return {connection: null, radius: maxRadius}; + } + + // Stash the values of x and y from before the drag. + var baseY = conn.y_; + var baseX = conn.x_; + + conn.x_ = baseX + dxy.x; + conn.y_ = baseY + dxy.y; + + // findPositionForConnection finds an index for insertion, which is always + // after any block with the same y index. We want to search both forward + // and back, so search on both sides of the index. + var closestIndex = this.findPositionForConnection_(conn); + + var bestConnection = null; + var bestRadius = maxRadius; + var temp; + + // Walk forward and back on the y axis looking for the closest x,y point. + var pointerMin = closestIndex - 1; + while (pointerMin >= 0 && this.isInYRange_(pointerMin, conn.y_, maxRadius)) { + temp = this[pointerMin]; + if (conn.isConnectionAllowed(temp, bestRadius)) { + bestConnection = temp; + bestRadius = temp.distanceFrom(conn); + } + pointerMin--; + } + + var pointerMax = closestIndex; + while (pointerMax < this.length && this.isInYRange_(pointerMax, conn.y_, + maxRadius)) { + temp = this[pointerMax]; + if (conn.isConnectionAllowed(temp, bestRadius)) { + bestConnection = temp; + bestRadius = temp.distanceFrom(conn); + } + pointerMax++; + } + + // Reset the values of x and y. + conn.x_ = baseX; + conn.y_ = baseY; + + // If there were no valid connections, bestConnection will be null. + return {connection: bestConnection, radius: bestRadius}; +}; + +/** + * Initialize a set of connection DBs for a specified workspace. + * @param {!Blockly.Workspace} workspace The workspace this DB is for. + */ +Blockly.ConnectionDB.init = function(workspace) { + // Create four databases, one for each connection type. + var dbList = []; + dbList[Blockly.INPUT_VALUE] = new Blockly.ConnectionDB(); + dbList[Blockly.OUTPUT_VALUE] = new Blockly.ConnectionDB(); + dbList[Blockly.NEXT_STATEMENT] = new Blockly.ConnectionDB(); + dbList[Blockly.PREVIOUS_STATEMENT] = new Blockly.ConnectionDB(); + workspace.connectionDBList = dbList; +}; diff --git a/core/constants.js b/core/constants.js new file mode 100644 index 0000000000..66cd2a8864 --- /dev/null +++ b/core/constants.js @@ -0,0 +1,195 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 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 Blockly constants. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.constants'); + + +/** + * Number of pixels the mouse must move before a drag starts. + */ +Blockly.DRAG_RADIUS = 5; + +/** + * Maximum misalignment between connections for them to snap together. + */ +Blockly.SNAP_RADIUS = 72; + +/** + * How much to prefer staying connected to the current connection over moving to + * a new connection. The current previewed connection is considered to be this + * much closer to the matching connection on the block than it actually is. + */ +Blockly.CURRENT_CONNECTION_PREFERENCE = 20; + +/** + * Delay in ms between trigger and bumping unconnected block out of alignment. + */ +Blockly.BUMP_DELAY = 250; + +/** + * Number of characters to truncate a collapsed block to. + */ +Blockly.COLLAPSE_CHARS = 30; + +/** + * Length in ms for a touch to become a long press. + */ +Blockly.LONGPRESS = 750; + +/** + * The richness of block colours, regardless of the hue. + * Must be in the range of 0 (inclusive) to 1 (exclusive). + */ +Blockly.HSV_SATURATION = 0.45; + +/** + * The intensity of block colours, regardless of the hue. + * Must be in the range of 0 (inclusive) to 1 (exclusive). + */ +Blockly.HSV_VALUE = 0.65; + +/** + * Sprited icons and images. + */ +Blockly.SPRITE = { + width: 96, + height: 124, + url: 'sprites.png' +}; + +// Constants below this point are not intended to be changed. + +/** + * Required name space for SVG elements. + * @const + */ +Blockly.SVG_NS = 'http://www.w3.org/2000/svg'; + +/** + * Required name space for HTML elements. + * @const + */ +Blockly.HTML_NS = 'http://www.w3.org/1999/xhtml'; + +/** + * ENUM for a right-facing value input. E.g. 'set item to' or 'return'. + * @const + */ +Blockly.INPUT_VALUE = 1; + +/** + * ENUM for a left-facing value output. E.g. 'random fraction'. + * @const + */ +Blockly.OUTPUT_VALUE = 2; + +/** + * ENUM for a down-facing block stack. E.g. 'if-do' or 'else'. + * @const + */ +Blockly.NEXT_STATEMENT = 3; + +/** + * ENUM for an up-facing block stack. E.g. 'break out of loop'. + * @const + */ +Blockly.PREVIOUS_STATEMENT = 4; + +/** + * ENUM for an dummy input. Used to add field(s) with no input. + * @const + */ +Blockly.DUMMY_INPUT = 5; + +/** + * ENUM for left alignment. + * @const + */ +Blockly.ALIGN_LEFT = -1; + +/** + * ENUM for centre alignment. + * @const + */ +Blockly.ALIGN_CENTRE = 0; + +/** + * ENUM for right alignment. + * @const + */ +Blockly.ALIGN_RIGHT = 1; + +/** + * ENUM for no drag operation. + * @const + */ +Blockly.DRAG_NONE = 0; + +/** + * ENUM for inside the sticky DRAG_RADIUS. + * @const + */ +Blockly.DRAG_STICKY = 1; + +/** + * ENUM for freely draggable. + * @const + */ +Blockly.DRAG_FREE = 2; + +/** + * Lookup table for determining the opposite type of a connection. + * @const + */ +Blockly.OPPOSITE_TYPE = []; +Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE] = Blockly.OUTPUT_VALUE; +Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE] = Blockly.INPUT_VALUE; +Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT] = Blockly.PREVIOUS_STATEMENT; +Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT] = Blockly.NEXT_STATEMENT; + +/** + * ENUM for toolbox and flyout at top of screen. + * @const + */ +Blockly.TOOLBOX_AT_TOP = 0; + +/** + * ENUM for toolbox and flyout at bottom of screen. + * @const + */ +Blockly.TOOLBOX_AT_BOTTOM = 1; + +/** + * ENUM for toolbox and flyout at left of screen. + * @const + */ +Blockly.TOOLBOX_AT_LEFT = 2; + +/** + * ENUM for toolbox and flyout at right of screen. + * @const + */ +Blockly.TOOLBOX_AT_RIGHT = 3; diff --git a/core/contextmenu.js b/core/contextmenu.js index defdd1f318..ebd92df17d 100644 --- a/core/contextmenu.js +++ b/core/contextmenu.js @@ -58,7 +58,7 @@ Blockly.ContextMenu.show = function(e, options, rtl) { */ var menu = new goog.ui.Menu(); menu.setRightToLeft(rtl); - for (var x = 0, option; option = options[x]; x++) { + for (var i = 0, option; option = options[i]; i++) { var menuItem = new goog.ui.MenuItem(option.text); menuItem.setRightToLeft(rtl); menu.addChild(menuItem, true); @@ -123,7 +123,8 @@ Blockly.ContextMenu.hide = function() { */ Blockly.ContextMenu.callbackFactory = function(block, xml) { return function() { - var newBlock = Blockly.Xml.domToBlock(block.workspace, xml); + Blockly.Events.disable(); + var newBlock = Blockly.Xml.domToBlock(xml, block.workspace); // Move the new block next to the old block. var xy = block.getRelativeToSurfaceXY(); if (block.RTL) { @@ -133,6 +134,10 @@ Blockly.ContextMenu.callbackFactory = function(block, xml) { } xy.y += Blockly.SNAP_RADIUS * 2; newBlock.moveBy(xy.x, xy.y); + Blockly.Events.enable(); + if (Blockly.Events.isEnabled() && !newBlock.isShadow()) { + Blockly.Events.fire(new Blockly.Events.Create(newBlock)); + } newBlock.select(); }; }; diff --git a/core/css.js b/core/css.js index f1cafb0a9b..c284cd6dfa 100644 --- a/core/css.js +++ b/core/css.js @@ -26,6 +26,9 @@ goog.provide('Blockly.Css'); +goog.require('Blockly.Colours'); + +goog.require('goog.userAgent'); /** * List of cursors. @@ -84,6 +87,17 @@ Blockly.Css.inject = function(hasCss, pathToMedia) { // Strip off any trailing slash (either Unix or Windows). Blockly.Css.mediaPath_ = pathToMedia.replace(/[\\\/]$/, ''); text = text.replace(/<<>>/g, Blockly.Css.mediaPath_); + // Dynamically replace colours in the CSS text, in case they have + // been set at run-time injection. + for (var colourProperty in Blockly.Colours) { + if (Blockly.Colours.hasOwnProperty(colourProperty)) { + // Replace all + text = text.replace( + new RegExp('\\$colour\\_' + colourProperty, 'g'), + Blockly.Colours[colourProperty] + ); + } + } // Inject CSS tag. var cssNode = document.createElement('style'); document.head.appendChild(cssNode); @@ -98,6 +112,11 @@ Blockly.Css.inject = function(hasCss, pathToMedia) { * @param {Blockly.Css.Cursor} cursor Enum. */ Blockly.Css.setCursor = function(cursor) { + if (goog.userAgent.MOBILE || goog.userAgent.ANDROID || goog.userAgent.IPAD) { + // Don't try to switch the mouse cursor on a mobile device. + // This is an optimization - since we almost never have cursors on mobile anyway. + return; + } if (Blockly.Css.currentCursor_ == cursor) { return; } @@ -132,17 +151,41 @@ Blockly.Css.setCursor = function(cursor) { */ Blockly.Css.CONTENT = [ '.blocklySvg {', - 'background-color: #fff;', + 'background-color: $colour_workspace;', 'outline: none;', 'overflow: hidden;', /* IE overflows by default. */ '}', + /* Necessary to position the drag surface */ + '.blocklyRelativeWrapper {', + 'position: relative;', + 'width: 100%;', + 'height: 100%;', + '}', + '.blocklyWidgetDiv {', 'display: none;', 'position: absolute;', 'z-index: 999;', '}', + '.blocklyWidgetDiv.fieldTextInput {', + 'overflow: hidden;', + 'border: 1px solid;', + 'box-sizing: border-box;', + 'transform-origin: 0 0;', + '-ms-transform-origin: 0 0;', + '-moz-transform-origin: 0 0;', + '-webkit-transform-origin: 0 0;', + '}', + + '.blocklyNonSelectable {', + 'user-select: none;', + '-moz-user-select: none;', + '-webkit-user-select: none;', + '-ms-user-select: none;', + '}', + '.blocklyTooltipDiv {', 'background-color: #ffffc7;', 'border: 1px solid #ddc;', @@ -157,6 +200,118 @@ Blockly.Css.CONTENT = [ 'z-index: 1000;', '}', + '.blocklyDragSurface {', + 'display: none;', + 'position: absolute;', + 'top: 0;', + 'left: 0;', + 'right: 0;', + 'bottom: 0;', + 'overflow: visible !important;', + 'z-index: 5000;', /* Always display on top */ + '-webkit-backface-visibility: hidden;', + 'backface-visibility: hidden;', + '-webkit-perspective: 1000;', + 'perspective: 1000;', + '}', + + '.blocklyDropDownDiv {', + 'position: absolute;', + 'left: 0;', + 'top: 0;', + 'z-index: 1000;', + 'display: none;', + 'border: 1px solid;', + 'border-radius: 4px;', + 'box-shadow: 0px 0px 8px 1px ' + Blockly.Colours.dropDownShadow + ';', + 'padding: 4px;', + '-webkit-user-select: none;', + '}', + + '.blocklyDropDownArrow {', + 'position: absolute;', + 'left: 0;', + 'top: 0;', + 'width: 16px;', + 'height: 16px;', + 'z-index: -1;', + '}', + + '.blocklyDropDownButton {', + 'display: inline-block;', + 'float: left;', + 'padding: 0;', + 'margin: 4px;', + 'border-radius: 4px;', + 'outline: none;', + 'border: 1px solid;', + 'transition: box-shadow .1s;', + 'cursor: pointer;', + '}', + + '.blocklyDropDownButtonHover {', + 'box-shadow: 0px 0px 0px 4px ' + Blockly.Colours.fieldShadow + ';', + '}', + + '.blocklyDropDownButton:active {', + 'box-shadow: 0px 0px 0px 6px ' + Blockly.Colours.fieldShadow + ';', + '}', + + '.blocklyDropDownButton > img {', + 'width: 80%;', + 'height: 80%;', + 'margin-top: 5%', + '}', + + '.blocklyDropDownPlaceholder {', + 'display: inline-block;', + 'float: left;', + 'padding: 0;', + 'margin: 4px;', + '}', + + '.blocklyNumPadButton {', + 'display: inline-block;', + 'float: left;', + 'padding: 0;', + 'width: 48px;', + 'height: 48px;', + 'margin: 4px;', + 'border-radius: 4px;', + 'background: $colour_numPadBackground;', + 'color: $colour_numPadText;', + 'outline: none;', + 'border: 1px solid $colour_numPadBorder;', + 'cursor: pointer;', + 'font-weight: 600;', + 'font-family: sans-serif;', + 'font-size: 12pt;', + '-webkit-tap-highlight-color: rgba(0,0,0,0);', + '}', + + '.blocklyNumPadButton > img {', + 'margin-top: 10%;', + 'width: 80%;', + 'height: 80%;', + '}', + + '.blocklyNumPadButton:active {', + 'background: $colour_numPadActiveBackground;', + '-webkit-tap-highlight-color: rgba(0,0,0,0);', + '}', + + '.arrowTop {', + 'border-top: 1px solid;', + 'border-left: 1px solid;', + 'border-top-left-radius: 4px;', + '}', + + '.arrowBottom {', + 'border-bottom: 1px solid;', + 'border-right: 1px solid;', + 'border-bottom-right-radius: 4px;', + '}', + '.blocklyResizeSE {', 'cursor: se-resize;', 'fill: #aaa;', @@ -178,29 +333,16 @@ Blockly.Css.CONTENT = [ 'stroke-width: 4px;', '}', - '.blocklyPathLight {', - 'fill: none;', - 'stroke-linecap: round;', - 'stroke-width: 1;', + '.blocklyPath {', + 'stroke-width: 1px;', '}', '.blocklySelected>.blocklyPath {', - 'stroke: #fc3;', - 'stroke-width: 3px;', - '}', - - '.blocklySelected>.blocklyPathLight {', - 'display: none;', - '}', - - '.blocklyDragging>.blocklyPath,', - '.blocklyDragging>.blocklyPathLight {', - 'fill-opacity: .8;', - 'stroke-opacity: .8;', + // 'stroke: #fc3;', + // 'stroke-width: 3px;', '}', - '.blocklyDragging>.blocklyPathDark {', - 'display: none;', + '.blocklyDragging>.blocklyPath {', '}', '.blocklyDisabled>.blocklyPath {', @@ -208,15 +350,15 @@ Blockly.Css.CONTENT = [ 'stroke-opacity: .5;', '}', - '.blocklyDisabled>.blocklyPathLight,', - '.blocklyDisabled>.blocklyPathDark {', - 'display: none;', - '}', - '.blocklyText {', 'cursor: default;', 'fill: #fff;', 'font-family: sans-serif;', + 'font-size: 12pt;', + 'font-weight: 600;', + '}', + + '.blocklyTextTruncated {', 'font-size: 11pt;', '}', @@ -232,7 +374,7 @@ Blockly.Css.CONTENT = [ '.blocklyNonEditableText>text,', '.blocklyEditableText>text {', - 'fill: #000;', + 'fill: $colour_text;', '}', '.blocklyEditableText:hover>rect {', @@ -241,7 +383,7 @@ Blockly.Css.CONTENT = [ '}', '.blocklyBubbleText {', - 'fill: #000;', + 'fill: $colour_text;', '}', /* @@ -297,13 +439,17 @@ Blockly.Css.CONTENT = [ '.blocklyHtmlInput {', 'border: none;', - 'border-radius: 4px;', 'font-family: sans-serif;', + 'font-size: 12pt;', 'height: 100%;', 'margin: 0;', 'outline: none;', - 'padding: 0 1px;', - 'width: 100%', + 'box-sizing: border-box;', + 'padding: 2px 8px 0 8px;', + 'width: 100%;', + 'text-align: center;', + 'color: $colour_text;', + 'font-weight: 600;', '}', '.blocklyMainBackground {', @@ -318,7 +464,7 @@ Blockly.Css.CONTENT = [ '}', '.blocklyFlyoutBackground {', - 'fill: #ddd;', + 'fill: $colour_flyout;', 'fill-opacity: .8;', '}', @@ -327,12 +473,12 @@ Blockly.Css.CONTENT = [ '}', '.blocklyScrollbarKnob {', - 'fill: #ccc;', + 'fill: $colour_scrollbar;', '}', '.blocklyScrollbarBackground:hover+.blocklyScrollbarKnob,', '.blocklyScrollbarKnob:hover {', - 'fill: #bbb;', + 'fill: $colour_scrollbarHover;', '}', '.blocklyZoom>image {', @@ -393,6 +539,10 @@ Blockly.Css.CONTENT = [ 'padding: 0 !important;', '}', + '.blocklyDropDownNumPad {', + 'background-color: $colour_numPadBackground;', + '}', + /* Override the default Closure URL. */ '.blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,', '.blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {', @@ -401,7 +551,8 @@ Blockly.Css.CONTENT = [ /* Category tree in Toolbox. */ '.blocklyToolboxDiv {', - 'background-color: #ddd;', + 'background-color: $colour_toolbox;', + 'color: $colour_toolboxText;', 'overflow-x: visible;', 'overflow-y: auto;', 'position: absolute;', @@ -423,6 +574,16 @@ Blockly.Css.CONTENT = [ 'white-space: nowrap;', '}', + '.blocklyHorizontalTree {', + 'float: left;', + 'margin: 1px 5px 8px 0px;', + '}', + + '.blocklyHorizontalTreeRtl {', + 'float: right;', + 'margin: 1px 0px 8px 5px;', + '}', + '.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {', 'margin-left: 8px;', '}', @@ -437,6 +598,13 @@ Blockly.Css.CONTENT = [ 'margin: 5px 0;', '}', + '.blocklyTreeSeparatorHorizontal {', + 'border-right: solid #e5e5e5 1px;', + 'width: 0px;', + 'padding: 5px 0;', + 'margin: 0 5px;', + '}', + '.blocklyTreeIcon {', 'background-image: url(<<>>/sprites.png);', 'height: 16px;', diff --git a/core/dragsurface_svg.js b/core/dragsurface_svg.js new file mode 100644 index 0000000000..ba979bce35 --- /dev/null +++ b/core/dragsurface_svg.js @@ -0,0 +1,219 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Massachusetts Institute of Technology + * All rights reserved. + * + * 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 An SVG that floats on top of the workspace. + * Blocks are moved into this SVG during a drag, improving performance. + * The entire SVG is translated, so the blocks are never repainted during drag. + * @author tmickel@mit.edu (Tim Mickel) + */ + +'use strict'; + +goog.provide('Blockly.DragSurfaceSvg'); + +goog.require('Blockly.utils'); +goog.require('Blockly.constants'); +goog.require('Blockly.Colours'); + +goog.require('goog.asserts'); +goog.require('goog.math.Coordinate'); + +/** + * Class for a Drag Surface SVG. + * @param {Element} container Containing element. + * @constructor + */ +Blockly.DragSurfaceSvg = function(container) { + this.container_ = container; +}; + +/** + * The SVG drag surface. Set once by Blockly.DragSurfaceSvg.createDom. + * @type {Element} + * @private + */ +Blockly.DragSurfaceSvg.prototype.SVG_ = null; + +/** + * SVG group inside the drag surface. This is where blocks are moved to. + * @type {Element} + * @private + */ +Blockly.DragSurfaceSvg.prototype.dragGroup_ = null; + +/** + * Containing HTML element; parent of the workspace and the drag surface. + * @type {Element} + * @private + */ +Blockly.DragSurfaceSvg.prototype.container_ = null; + +/** + * Cached value for the scale of the drag surface. + * Used to set/get the correct translation during and after a drag. + * @type {Number} + * @private + */ +Blockly.DragSurfaceSvg.prototype.scale_ = 1; + +/** + * ID for the drag shadow filter, set in createDom. + * @type {string} + * @private + */ +Blockly.DragSurfaceSvg.prototype.dragShadowFilterId_ = ''; + +/** + * Standard deviation for gaussian blur on drag shadow, in px. + * @type {number} + * @const + */ +Blockly.DragSurfaceSvg.SHADOW_STD_DEVIATION = 6; + +/** + * Create the drag surface and inject it into the container. + */ +Blockly.DragSurfaceSvg.prototype.createDom = function() { + if (this.SVG_) { + return; // Already created. + } + this.SVG_ = Blockly.createSvgElement('svg', { + 'xmlns': Blockly.SVG_NS, + 'xmlns:html': Blockly.HTML_NS, + 'xmlns:xlink': 'http://www.w3.org/1999/xlink', + 'version': '1.1', + 'class': 'blocklyDragSurface' + }, this.container_); + var defs = Blockly.createSvgElement('defs', {}, this.SVG_); + this.dragShadowFilterId_ = this.createDropShadowDom_(defs); + this.dragGroup_ = Blockly.createSvgElement('g', {}, this.SVG_); + this.dragGroup_.setAttribute('filter', 'url(#' + this.dragShadowFilterId_ + ')'); +}; + +/** + * Create the SVG def for the drop shadow. + * @param {Element} defs Defs element to insert the shadow filter definition + * @return {string} ID for the filter element + */ +Blockly.DragSurfaceSvg.prototype.createDropShadowDom_ = function(defs) { + // Adjust these width/height, x/y properties to prevent the shadow from clipping + var dragShadowFilter = Blockly.createSvgElement('filter', + {'id': 'blocklyDragShadowFilter', 'height': '140%', 'width': '140%', y: '-20%', x: '-20%'}, defs); + Blockly.createSvgElement('feGaussianBlur', + {'in': 'SourceAlpha', 'stdDeviation': Blockly.DragSurfaceSvg.SHADOW_STD_DEVIATION}, dragShadowFilter); + var componentTransfer = Blockly.createSvgElement('feComponentTransfer', {'result': 'offsetBlur'}, dragShadowFilter); + // Shadow opacity is specified in the adjustable colour library, + // since the darkness of the shadow largely depends on the workspace colour. + Blockly.createSvgElement('feFuncA', + {'type': 'linear', 'slope': Blockly.Colours.dragShadowOpacity}, componentTransfer); + Blockly.createSvgElement('feComposite', + {'in': 'SourceGraphic', 'in2': 'offsetBlur', 'operator': 'over'}, dragShadowFilter); + return dragShadowFilter.id; +}; + +/** + * Set the SVG blocks on the drag surface's group and show the surface. + * Only one block should be on the drag surface at a time. + * @param {!Element} blocks Block or group of blocks to place on the drag surface + */ +Blockly.DragSurfaceSvg.prototype.setBlocksAndShow = function(blocks) { + goog.asserts.assert(this.dragGroup_.childNodes.length == 0, 'Already dragging a block.'); + // appendChild removes the blocks from the previous parent + this.dragGroup_.appendChild(blocks); + this.SVG_.style.display = 'block'; +}; + +/** + * Translate and scale the entire drag surface group to keep in sync with the workspace. + * @param {Number} x X translation + * @param {Number} y Y translation + * @param {Number} scale Scale of the group + */ +Blockly.DragSurfaceSvg.prototype.translateAndScaleGroup = function(x, y, scale) { + var transform; + this.scale_ = scale; + if (Blockly.is3dSupported()) { + transform = 'transform: translate3d(' + x + 'px, ' + y + 'px, 0px)' + + 'scale3d(' + scale + ',' + scale + ',' + scale + ')'; + this.dragGroup_.setAttribute('style', transform); + } else { + transform = 'translate(' + x + ', ' + y + ') scale(' + scale + ')'; + this.dragGroup_.setAttribute('transform', transform); + } +}; + +/** + * Translate the entire drag surface during a drag. + * We translate the drag surface instead of the blocks inside the surface + * so that the browser avoids repainting the SVG. + * Because of this, the drag coordinates must be adjusted by scale. + * @param {Number} x X translation for the entire surface + * @param {Number} y Y translation for the entire surface + */ +Blockly.DragSurfaceSvg.prototype.translateSurface = function(x, y) { + var transform; + x *= this.scale_; + y *= this.scale_; + if (Blockly.is3dSupported()) { + transform = 'transform: translate3d(' + x + 'px, ' + y + 'px, 0px); display: block;'; + this.SVG_.setAttribute('style', transform); + } else { + transform = 'translate(' + x + ', ' + y + ')'; + this.SVG_.setAttribute('transform', transform); + } +}; + +/** + * Reports the surface translation in scaled workspace coordinates. + * Use this when finishing a drag to return blocks to the correct position. + * @return {goog.math.Coordinate} Current translation of the surface + */ +Blockly.DragSurfaceSvg.prototype.getSurfaceTranslation = function() { + var xy = Blockly.getRelativeXY_(this.SVG_); + return new goog.math.Coordinate(xy.x / this.scale_, xy.y / this.scale_); +}; + +/** + * Provide a reference to the drag group (primarily for BlockSvg.getRelativeToSurfaceXY). + * @return {Element} Drag surface group element + */ +Blockly.DragSurfaceSvg.prototype.getGroup = function() { + return this.dragGroup_; +}; + +/** + * Get the current blocks on the drag surface, if any (primarily for BlockSvg.getRelativeToSurfaceXY). + * @return {Element} Drag surface block DOM element + */ +Blockly.DragSurfaceSvg.prototype.getCurrentBlock = function() { + return this.dragGroup_.childNodes[0]; +}; + +/** + * Clear the group and hide the surface; move the blocks off onto the provided element. + * @param {!Element} newSurface Surface the dragging blocks should be moved to + */ +Blockly.DragSurfaceSvg.prototype.clearAndHide = function(newSurface) { + // appendChild removes the node from this.dragGroup_ + newSurface.appendChild(this.getCurrentBlock()); + this.SVG_.style.display = 'none'; + goog.asserts.assert(this.dragGroup_.childNodes.length == 0, 'Drag group was not cleared.'); +}; diff --git a/core/dropdowndiv.js b/core/dropdowndiv.js new file mode 100644 index 0000000000..4ce350380d --- /dev/null +++ b/core/dropdowndiv.js @@ -0,0 +1,353 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Massachusetts Institute of Technology + * All rights reserved. + * + * 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 A div that floats on top of the workspace, for drop-down menus. + * The drop-down can be kept inside the workspace, animate in/out, etc. + * @author tmickel@mit.edu (Tim Mickel) + */ + +'use strict'; + +goog.provide('Blockly.DropDownDiv'); + +goog.require('goog.dom'); +goog.require('goog.style'); + +/** + * Class for drop-down div. + * @constructor + */ +Blockly.DropDownDiv = function() { +}; + +/** + * The div element. Set once by Blockly.DropDownDiv.createDom. + * @type {Element} + * @private + */ +Blockly.DropDownDiv.DIV_ = null; + +/** + * Drop-downs will appear within the bounds of this element if possible. + * Set in Blockly.DropDownDiv.setBoundsElement. + * @type {Element} + * @private + */ +Blockly.DropDownDiv.boundsElement_ = null; + +/** + * The object currently using the drop-down. + * @type {Object} + * @private + */ +Blockly.DropDownDiv.owner_ = null; + +/** + * Arrow size in px. Should match the value in CSS (need to position pre-render). + * @type {number} + * @const + */ +Blockly.DropDownDiv.ARROW_SIZE = 16; + +/** + * Drop-down border size in px. Should match the value in CSS (need to position the arrow). + * @type {number} + * @const + */ +Blockly.DropDownDiv.BORDER_SIZE = 1; + +/** + * Amount the arrow must be kept away from the edges of the main drop-down div, in px. + * @type {number} + * @const + */ +Blockly.DropDownDiv.ARROW_HORIZONTAL_PADDING = 12; + +/** + * Amount drop-downs should be padded away from the source, in px. + * @type {number} + * @const + */ +Blockly.DropDownDiv.PADDING_Y = 20; + +/** + * Length of animations in seconds. + * @type {number} + * @const + */ +Blockly.DropDownDiv.ANIMATION_TIME = 0.25; + +/** + * Timer for animation out, to be cleared if we need to immediately hide + * without disrupting new shows. + * @type {number} + */ +Blockly.DropDownDiv.animateOutTimer_ = null; + +/** + * When the drop-down is opened, we save the position it animated from + * so that it can animate back to that position on close. + * Absolute X position of that position, in px. + * @type {number} + */ +Blockly.DropDownDiv.hideAnimationX_ = 0; + +/** + * When the drop-down is opened, we save the position it animated from + * so that it can animate back to that position on close. + * Absolute Y position of that position, in px. + * @type {number} + */ +Blockly.DropDownDiv.hideAnimationY_ = 0; + +/** + * Callback for when the drop-down is hidden. + * @type {Function} + */ +Blockly.DropDownDiv.onHide_ = 0; + +/** + * Create and insert the DOM element for this div. + * @param {Element} container Element that the div should be contained in. + */ +Blockly.DropDownDiv.createDom = function() { + if (Blockly.DropDownDiv.DIV_) { + return; // Already created. + } + Blockly.DropDownDiv.DIV_ = goog.dom.createDom('div', 'blocklyDropDownDiv'); + document.body.appendChild(Blockly.DropDownDiv.DIV_); + Blockly.DropDownDiv.content_ = goog.dom.createDom('div', 'blocklyDropDownContent'); + Blockly.DropDownDiv.DIV_.appendChild(Blockly.DropDownDiv.content_); + Blockly.DropDownDiv.arrow_ = goog.dom.createDom('div', 'blocklyDropDownArrow'); + Blockly.DropDownDiv.DIV_.appendChild(Blockly.DropDownDiv.arrow_); +}; + +/** + * Set an element to maintain bounds within. Drop-downs will appear + * within the box of this element if possible. + * @param {Element} boundsElement Element to bound drop-down to. + */ +Blockly.DropDownDiv.setBoundsElement = function(boundsElement) { + Blockly.DropDownDiv.boundsElement_ = boundsElement; +}; + +/** + * Provide the div for inserting content into the drop-down. + * @return {Element} Div to populate with content + */ +Blockly.DropDownDiv.getContentDiv = function() { + return Blockly.DropDownDiv.content_; +}; + +/** + * Clear the content of the drop-down. + */ +Blockly.DropDownDiv.clearContent = function() { + Blockly.DropDownDiv.content_.innerHTML = ''; +}; + +/** + * Set the colour for the drop-down. + * @param {string} backgroundColour Any CSS color for the background + * @param {string} borderColour Any CSS color for the border + */ +Blockly.DropDownDiv.setColour = function(backgroundColour, borderColour) { + Blockly.DropDownDiv.DIV_.style.backgroundColor = backgroundColour; + Blockly.DropDownDiv.arrow_.style.backgroundColor = backgroundColour; + Blockly.DropDownDiv.DIV_.style.borderColor = borderColour; + Blockly.DropDownDiv.arrow_.style.borderColor = borderColour; +}; + +/** + * Show and place the drop-down. + * The drop-down is placed with an absolute "origin point" (x, y) - i.e., + * the arrow will point at this origin and box will positioned below or above it. + * If we can maintain the container bounds at the primary point, the arrow will + * point there, and the container will be positioned below it. + * If we can't maintain the container bounds at the primary point, fall-back to the + * secondary point and position above. + * @param {Object} owner The object showing the drop-down + * @param {number} primaryX Desired origin point x, in absolute px + * @param {number} primaryY Desired origin point y, in absolute px + * @param {number} secondaryX Secondary/alternative origin point x, in absolute px + * @param {number} secondaryY Secondary/alternative origin point y, in absolute px + * @param {Function=} opt_onHide Optional callback for when the drop-down is hidden + * @return {boolean} True if the menu rendered at the primary origin point. + */ +Blockly.DropDownDiv.show = function(owner, primaryX, primaryY, secondaryX, secondaryY, opt_onHide) { + Blockly.DropDownDiv.owner_ = owner; + Blockly.DropDownDiv.onHide_ = opt_onHide; + var div = Blockly.DropDownDiv.DIV_; + var metrics = Blockly.DropDownDiv.getPositionMetrics(primaryX, primaryY, secondaryX, secondaryY); + // Update arrow CSS + Blockly.DropDownDiv.arrow_.style.transform = 'translate(' + + metrics.arrowX + 'px,' + metrics.arrowY + 'px) rotate(45deg)'; + Blockly.DropDownDiv.arrow_.setAttribute('class', + metrics.arrowAtTop ? 'blocklyDropDownArrow arrowTop' : 'blocklyDropDownArrow arrowBottom'); + // First apply initial translation + div.style.transform = 'translate(' + metrics.finalX + 'px,' + metrics.finalY + 'px)'; + // Save for animate out + Blockly.DropDownDiv.hideAnimationX_ = metrics.initialX; + Blockly.DropDownDiv.hideAnimationY_ = metrics.initialY; + // Show the div + div.style.display = 'block'; + div.style.opacity = 1; + return metrics.arrowAtTop; +}; + +/** + * Helper to position the drop-down and the arrow, maintaining bounds. + * See explanation of origin points in Blockly.DropDownDiv.show. + * @param {number} primaryX Desired origin point x, in absolute px + * @param {number} primaryY Desired origin point y, in absolute px + * @param {number} secondaryX Secondary/alternative origin point x, in absolute px + * @param {number} secondaryY Secondary/alternative origin point y, in absolute px + * @returns {Object} Various final metrics, including rendered positions for drop-down and arrow. + */ +Blockly.DropDownDiv.getPositionMetrics = function(primaryX, primaryY, secondaryX, secondaryY) { + var div = Blockly.DropDownDiv.DIV_; + var boundPosition = goog.style.getPageOffset(Blockly.DropDownDiv.boundsElement_); + var boundSize = goog.style.getSize(Blockly.DropDownDiv.boundsElement_); + var divSize = goog.style.getSize(div); + + // First decide if we will render at primary or secondary position + // i.e., above or below + // renderX, renderY will eventually be the final rendered position of the box. + var renderX, renderY, renderedSecondary; + // Can the div fit inside the bounds if we render below the primary point? + if (primaryY + divSize.height > boundPosition.y + boundSize.height) { + // We can't fit below in terms of y. Can we fit above? + if (secondaryY - divSize.height < boundPosition.y) { + // We also can't fit above, so just render below anyway. + renderX = primaryX; + renderY = primaryY + Blockly.DropDownDiv.PADDING_Y; + renderedSecondary = false; + } else { + // We can fit above, render secondary + renderX = secondaryX; + renderY = secondaryY - divSize.height - Blockly.DropDownDiv.PADDING_Y; + renderedSecondary = true; + } + } else { + // We can fit below, render primary + renderX = primaryX; + renderY = primaryY + Blockly.DropDownDiv.PADDING_Y; + renderedSecondary = false; + } + // First calculate the absolute arrow X + // This needs to be done before positioning the div, since the arrow + // wants to be as close to the origin point as possible. + var arrowX = renderX - Blockly.DropDownDiv.ARROW_SIZE / 2; + // Keep in overall bounds + arrowX = Math.max(boundPosition.x, Math.min(arrowX, boundPosition.x + boundSize.width)); + + // Adjust the x-position of the drop-down so that the div is centered and within bounds. + var centerX = divSize.width / 2; + renderX -= centerX; + // Fit horizontally in the bounds. + renderX = Math.max( + boundPosition.x, + Math.min(renderX, boundPosition.x + boundSize.width - divSize.width) + ); + // After we've finished caclulating renderX, adjust the arrow to be relative to it. + arrowX -= renderX; + + // Pad the arrow by some pixels, primarily so that it doesn't render on top of a rounded border. + arrowX = Math.max( + Blockly.DropDownDiv.ARROW_HORIZONTAL_PADDING, + Math.min(arrowX, divSize.width - Blockly.DropDownDiv.ARROW_HORIZONTAL_PADDING - Blockly.DropDownDiv.ARROW_SIZE) + ); + + // Calculate arrow Y. If we rendered secondary, add on bottom. + // Extra pixels are added so that it covers the border of the div. + var arrowY = (renderedSecondary) ? divSize.height - Blockly.DropDownDiv.BORDER_SIZE : 0; + arrowY -= (Blockly.DropDownDiv.ARROW_SIZE / 2) + Blockly.DropDownDiv.BORDER_SIZE; + + // Initial position calculated without any padding to provide an animation point. + var initialX = renderX; // X position remains constant during animation. + var initialY; + if (renderedSecondary) { + initialY = secondaryY - divSize.height; // No padding on Y + } else { + initialY = primaryY; // No padding on Y + } + + return { + initialX: initialX, + initialY : initialY, + finalX: renderX, + finalY: renderY, + arrowX: arrowX, + arrowY: arrowY, + arrowAtTop: !renderedSecondary + }; +}; + +/** + * Hide the menu only if it is owned by the provided object. + * @param {Object} owner Object which must be owning the drop-down to hide + * @return {Boolean} True if hidden + */ +Blockly.DropDownDiv.hideIfOwner = function(owner) { + if (Blockly.DropDownDiv.owner_ === owner) { + Blockly.DropDownDiv.hide(); + return true; + } + return false; +}; + +/** + * Hide the menu, triggering animation. + */ +Blockly.DropDownDiv.hide = function() { + // Start the animation by setting the translation and fading out. + var div = Blockly.DropDownDiv.DIV_; + div.style.transition = 'transform ' + Blockly.DropDownDiv.ANIMATION_TIME + 's, ' + + 'opacity ' + Blockly.DropDownDiv.ANIMATION_TIME + 's'; + div.style.transform = 'translate(' + Blockly.DropDownDiv.hideAnimationX_ + + 'px,' + Blockly.DropDownDiv.hideAnimationY_ + 'px)'; + div.style.opacity = 0; + Blockly.DropDownDiv.animateOutTimer_ = setTimeout(function() { + // Finish animation - reset all values to default. + Blockly.DropDownDiv.hideWithoutAnimation(); + }, Blockly.DropDownDiv.ANIMATION_TIME * 1000); + if (Blockly.DropDownDiv.onHide_) { + Blockly.DropDownDiv.onHide_(); + Blockly.DropDownDiv.onHide_ = null; + } +}; + +/** + * Hide the menu, without animation. + */ +Blockly.DropDownDiv.hideWithoutAnimation = function() { + var div = Blockly.DropDownDiv.DIV_; + Blockly.DropDownDiv.animateOutTimer_ && window.clearTimeout(Blockly.DropDownDiv.animateOutTimer_); + div.style.transition = ''; + div.style.transform = ''; + div.style.display = 'none'; + Blockly.DropDownDiv.clearContent(); + Blockly.DropDownDiv.owner_ = null; + if (Blockly.DropDownDiv.onHide_) { + Blockly.DropDownDiv.onHide_(); + Blockly.DropDownDiv.onHide_ = null; + } +}; diff --git a/core/events.js b/core/events.js new file mode 100644 index 0000000000..bc4299e550 --- /dev/null +++ b/core/events.js @@ -0,0 +1,782 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 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 Events fired as a result of actions in Blockly's editor. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Events'); + +goog.require('goog.math.Coordinate'); + + +/** + * Group ID for new events. Grouped events are indivisible. + * @type {string} + * @private + */ +Blockly.Events.group_ = ''; + +/** + * Sets whether events should be added to the undo stack. + * @type {boolean} + */ +Blockly.Events.recordUndo = true; + +/** + * Allow change events to be created and fired. + * @type {number} + * @private + */ +Blockly.Events.disabled_ = 0; + +/** + * Name of event that creates a block. + * @const + */ +Blockly.Events.CREATE = 'create'; + +/** + * Name of event that deletes a block. + * @const + */ +Blockly.Events.DELETE = 'delete'; + +/** + * Name of event that changes a block. + * @const + */ +Blockly.Events.CHANGE = 'change'; + +/** + * Name of event that moves a block. + * @const + */ +Blockly.Events.MOVE = 'move'; + +/** + * Name of event that records a UI change. + * @const + */ +Blockly.Events.UI = 'ui'; + +/** + * List of events queued for firing. + * @private + */ +Blockly.Events.FIRE_QUEUE_ = []; + +/** + * Create a custom event and fire it. + * @param {!Blockly.Events.Abstract} event Custom data for event. + */ +Blockly.Events.fire = function(event) { + if (!Blockly.Events.isEnabled()) { + return; + } + if (!Blockly.Events.FIRE_QUEUE_.length) { + // First event added; schedule a firing of the event queue. + setTimeout(Blockly.Events.fireNow_, 0); + } + Blockly.Events.FIRE_QUEUE_.push(event); +}; + +/** + * Fire all queued events. + * @private + */ +Blockly.Events.fireNow_ = function() { + var queue = Blockly.Events.filter(Blockly.Events.FIRE_QUEUE_, true); + Blockly.Events.FIRE_QUEUE_.length = 0; + for (var i = 0, event; event = queue[i]; i++) { + var workspace = Blockly.Workspace.getById(event.workspaceId); + if (workspace) { + workspace.fireChangeListener(event); + } + } +}; + +/** + * Filter the queued events and merge duplicates. + * @param {!Array.} queueIn Array of events. + * @param {boolean} forward True if forward (redo), false if backward (undo). + * @return {!Array.} Array of filtered events. + */ +Blockly.Events.filter = function(queueIn, forward) { + var queue = goog.array.clone(queueIn); + if (!forward) { + // Undo is merged in reverse order. + queue.reverse(); + } + // Merge duplicates. O(n^2), but n should be very small. + for (var i = 0, event1; event1 = queue[i]; i++) { + for (var j = i + 1, event2; event2 = queue[j]; j++) { + if (event1.type == event2.type && + event1.blockId == event2.blockId && + event1.workspaceId == event2.workspaceId) { + if (event1.type == Blockly.Events.MOVE) { + // Merge move events. + event1.newParentId = event2.newParentId; + event1.newInputName = event2.newInputName; + event1.newCoordinate = event2.newCoordinate; + queue.splice(j, 1); + j--; + } else if (event1.type == Blockly.Events.CHANGE && + event1.element == event2.element && + event1.name == event2.name) { + // Merge change events. + event1.newValue = event2.newValue; + queue.splice(j, 1); + j--; + } else if (event1.type == Blockly.Events.UI && + event2.element == 'click' && + (event1.element == 'commentOpen' || + event1.element == 'mutatorOpen' || + event1.element == 'warningOpen')) { + // Merge change events. + event1.newValue = event2.newValue; + queue.splice(j, 1); + j--; + } + } + } + } + // Remove null events. + for (var i = queue.length - 1; i >= 0; i--) { + if (queue[i].isNull()) { + queue.splice(i, 1); + } + } + if (!forward) { + // Restore undo order. + queue.reverse(); + } + // Move mutation events to the top of the queue. + // Intentionally skip first event. + for (var i = 1, event; event = queue[i]; i++) { + if (event.type == Blockly.Events.CHANGE && + event.element == 'mutation') { + queue.unshift(queue.splice(i, 1)[0]); + } + } + return queue; +}; + +/** + * Modify pending undo events so that when they are fired they don't land + * in the undo stack. Called by Blockly.Workspace.clearUndo. + */ +Blockly.Events.clearPendingUndo = function() { + for (var i = 0, event; event = Blockly.Events.FIRE_QUEUE_[i]; i++) { + event.recordUndo = false; + } +}; + +/** + * Stop sending events. Every call to this function MUST also call enable. + */ +Blockly.Events.disable = function() { + Blockly.Events.disabled_++; +}; + +/** + * Start sending events. Unless events were already disabled when the + * corresponding call to disable was made. + */ +Blockly.Events.enable = function() { + Blockly.Events.disabled_--; +}; + +/** + * Returns whether events may be fired or not. + * @return {boolean} True if enabled. + */ +Blockly.Events.isEnabled = function() { + return Blockly.Events.disabled_ == 0; +}; + +/** + * Current group. + * @return {string} ID string. + */ +Blockly.Events.getGroup = function() { + return Blockly.Events.group_; +}; + +/** + * Start or stop a group. + * @param {boolean|string} state True to start new group, false to end group. + * String to set group explicitly. + */ +Blockly.Events.setGroup = function(state) { + if (typeof state == 'boolean') { + Blockly.Events.group_ = state ? Blockly.genUid() : ''; + } else { + Blockly.Events.group_ = state; + } +}; + +/** + * Compute a list of the IDs of the specified block and all its descendants. + * @param {!Blockly.Block} block The root block. + * @return {!Array.} List of block IDs. + * @private + */ +Blockly.Events.getDescendantIds_ = function(block) { + var ids = []; + var descendants = block.getDescendants(); + for (var i = 0, descendant; descendant = descendants[i]; i++) { + ids[i] = descendant.id; + } + return ids; +}; + +/** + * Decode the JSON into an event. + * @param {!Object} json JSON representation. + * @param {!Blockly.Workspace} workspace Target workspace for event. + * @return {!Blockly.Events.Abstract} The event represented by the JSON. + */ +Blockly.Events.fromJson = function(json, workspace) { + var event; + switch (json.type) { + case Blockly.Events.CREATE: + event = new Blockly.Events.Create(null); + break; + case Blockly.Events.DELETE: + event = new Blockly.Events.Delete(null); + break; + case Blockly.Events.CHANGE: + event = new Blockly.Events.Change(null); + break; + case Blockly.Events.MOVE: + event = new Blockly.Events.Move(null); + break; + case Blockly.Events.UI: + event = new Blockly.Events.Ui(null); + break; + default: + throw 'Unknown event type.'; + } + event.fromJson(json); + event.workspaceId = workspace.id; + return event; +}; + +/** + * Abstract class for an event. + * @param {Blockly.Block} block The block. + * @constructor + */ +Blockly.Events.Abstract = function(block) { + if (block) { + this.blockId = block.id; + this.workspaceId = block.workspace.id; + } + this.group = Blockly.Events.group_; + this.recordUndo = Blockly.Events.recordUndo; +}; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Abstract.prototype.toJson = function() { + var json = { + 'type': this.type, + 'blockId': this.blockId + }; + if (this.group) { + json['group'] = this.group; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Abstract.prototype.fromJson = function(json) { + this.blockId = json['blockId']; + this.group = json['group']; +}; + +/** + * Does this event record any change of state? + * @return {boolean} True if null, false if something changed. + */ +Blockly.Events.Abstract.prototype.isNull = function() { + return false; +}; + +/** + * Run an event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Abstract.prototype.run = function(forward) { + // Defined by subclasses. +}; + +/** + * Class for a block creation event. + * @param {Blockly.Block} block The created block. Null for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Create = function(block) { + if (!block) { + return; // Blank event to be populated by fromJson. + } + Blockly.Events.Create.superClass_.constructor.call(this, block); + this.xml = Blockly.Xml.blockToDomWithXY(block); + this.ids = Blockly.Events.getDescendantIds_(block); +}; +goog.inherits(Blockly.Events.Create, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Create.prototype.type = Blockly.Events.CREATE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Create.prototype.toJson = function() { + var json = Blockly.Events.Create.superClass_.toJson.call(this); + json['xml'] = Blockly.Xml.domToText(this.xml); + json['ids'] = this.ids; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Create.prototype.fromJson = function(json) { + Blockly.Events.Create.superClass_.fromJson.call(this, json); + this.xml = Blockly.Xml.textToDom('' + json['xml'] + '').firstChild; + this.ids = json['ids']; +}; + +/** + * Run a creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Create.prototype.run = function(forward) { + var workspace = Blockly.Workspace.getById(this.workspaceId); + if (forward) { + var xml = goog.dom.createDom('xml'); + xml.appendChild(this.xml); + Blockly.Xml.domToWorkspace(xml, workspace); + } else { + for (var i = 0, id; id = this.ids[i]; i++) { + var block = workspace.getBlockById(id); + if (block) { + block.dispose(false, true); + } else if (id == this.blockId) { + // Only complain about root-level block. + console.warn("Can't uncreate non-existant block: " + id); + } + } + } +}; + +/** + * Class for a block deletion event. + * @param {Blockly.Block} block The deleted block. Null for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Delete = function(block) { + if (!block) { + return; // Blank event to be populated by fromJson. + } + if (block.getParent()) { + throw 'Connected blocks cannot be deleted.'; + } + Blockly.Events.Delete.superClass_.constructor.call(this, block); + this.oldXml = Blockly.Xml.blockToDomWithXY(block); + this.ids = Blockly.Events.getDescendantIds_(block); +}; +goog.inherits(Blockly.Events.Delete, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Delete.prototype.type = Blockly.Events.DELETE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Delete.prototype.toJson = function() { + var json = Blockly.Events.Delete.superClass_.toJson.call(this); + json['ids'] = this.ids; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Delete.prototype.fromJson = function(json) { + Blockly.Events.Delete.superClass_.fromJson.call(this, json); + this.ids = json['ids']; +}; + +/** + * Run a deletion event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Delete.prototype.run = function(forward) { + var workspace = Blockly.Workspace.getById(this.workspaceId); + if (forward) { + for (var i = 0, id; id = this.ids[i]; i++) { + var block = workspace.getBlockById(id); + if (block) { + block.dispose(false, true); + } else if (id == this.blockId) { + // Only complain about root-level block. + console.warn("Can't delete non-existant block: " + id); + } + } + } else { + var xml = goog.dom.createDom('xml'); + xml.appendChild(this.oldXml); + Blockly.Xml.domToWorkspace(xml, workspace); + } +}; + +/** + * Class for a block change event. + * @param {Blockly.Block} block The changed block. Null for a blank event. + * @param {string} element One of 'field', 'comment', 'disabled', etc. + * @param {?string} name Name of input or field affected, or null. + * @param {string} oldValue Previous value of element. + * @param {string} newValue New value of element. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Change = function(block, element, name, oldValue, newValue) { + if (!block) { + return; // Blank event to be populated by fromJson. + } + Blockly.Events.Change.superClass_.constructor.call(this, block); + this.element = element; + this.name = name; + this.oldValue = oldValue; + this.newValue = newValue; +}; +goog.inherits(Blockly.Events.Change, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Change.prototype.type = Blockly.Events.CHANGE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Change.prototype.toJson = function() { + var json = Blockly.Events.Change.superClass_.toJson.call(this); + json['element'] = this.element; + if (this.name) { + json['name'] = this.name; + } + json['newValue'] = this.newValue; + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Change.prototype.fromJson = function(json) { + Blockly.Events.Change.superClass_.fromJson.call(this, json); + this.element = json['element']; + this.name = json['name']; + this.newValue = json['newValue']; +}; + +/** + * Does this event record any change of state? + * @return {boolean} True if something changed. + */ +Blockly.Events.Change.prototype.isNull = function() { + return this.oldValue == this.newValue; +}; + +/** + * Run a change event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Change.prototype.run = function(forward) { + var workspace = Blockly.Workspace.getById(this.workspaceId); + var block = workspace.getBlockById(this.blockId); + if (!block) { + console.warn("Can't change non-existant block: " + this.blockId); + return; + } + if (block.mutator) { + // Close the mutator (if open) since we don't want to update it. + block.mutator.setVisible(false); + } + var value = forward ? this.newValue : this.oldValue; + switch (this.element) { + case 'field': + var field = block.getField(this.name); + if (field) { + field.setValue(value); + } else { + console.warn("Can't set non-existant field: " + this.name); + } + break; + case 'comment': + block.setCommentText(value || null); + break; + case 'collapsed': + block.setCollapsed(value); + break; + case 'disabled': + block.setDisabled(value); + break; + case 'inline': + block.setInputsInline(value); + break; + case 'mutation': + var oldMutation = ''; + if (block.mutationToDom) { + var oldMutationDom = block.mutationToDom(); + oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); + } + if (block.domToMutation) { + value = value || ''; + var dom = Blockly.Xml.textToDom('' + value + ''); + block.domToMutation(dom.firstChild); + } + Blockly.Events.fire(new Blockly.Events.Change( + block, 'mutation', null, oldMutation, value)); + break; + default: + console.warn('Unknown change type: ' + this.element); + } +}; + +/** + * Class for a block move event. Created before the move. + * @param {Blockly.Block} block The moved block. Null for a blank event. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Move = function(block) { + if (!block) { + return; // Blank event to be populated by fromJson. + } + Blockly.Events.Move.superClass_.constructor.call(this, block); + var location = this.currentLocation_(); + this.oldParentId = location.parentId; + this.oldInputName = location.inputName; + this.oldCoordinate = location.coordinate; +}; +goog.inherits(Blockly.Events.Move, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Move.prototype.type = Blockly.Events.MOVE; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Move.prototype.toJson = function() { + var json = Blockly.Events.Move.superClass_.toJson.call(this); + if (this.newParentId) { + json['newParentId'] = this.newParentId; + } + if (this.newInputName) { + json['newInputName'] = this.newInputName; + } + if (this.newCoordinate) { + json['newCoordinate'] = Math.round(this.newCoordinate.x) + ',' + + Math.round(this.newCoordinate.y); + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Move.prototype.fromJson = function(json) { + Blockly.Events.Move.superClass_.fromJson.call(this, json); + this.newParentId = json['newParentId']; + this.newInputName = json['newInputName']; + if (json['newCoordinate']) { + var xy = json['newCoordinate'].split(','); + this.newCoordinate = + new goog.math.Coordinate(parseFloat(xy[0]), parseFloat(xy[1])); + } +}; + +/** + * Record the block's new location. Called after the move. + */ +Blockly.Events.Move.prototype.recordNew = function() { + var location = this.currentLocation_(); + this.newParentId = location.parentId; + this.newInputName = location.inputName; + this.newCoordinate = location.coordinate; +}; + +/** + * Returns the parentId and input if the block is connected, + * or the XY location if disconnected. + * @return {!Object} Collection of location info. + * @private + */ +Blockly.Events.Move.prototype.currentLocation_ = function() { + var workspace = Blockly.Workspace.getById(this.workspaceId); + var block = workspace.getBlockById(this.blockId); + var location = {}; + var parent = block.getParent(); + if (parent) { + location.parentId = parent.id; + var input = parent.getInputWithBlock(block); + if (input) { + location.inputName = input.name; + } + } else { + location.coordinate = block.getRelativeToSurfaceXY(); + } + return location; +}; + +/** + * Does this event record any change of state? + * @return {boolean} True if something changed. + */ +Blockly.Events.Move.prototype.isNull = function() { + return this.oldParentId == this.newParentId && + this.oldInputName == this.newInputName && + goog.math.Coordinate.equals(this.oldCoordinate, this.newCoordinate); +}; + +/** + * Run a move event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ +Blockly.Events.Move.prototype.run = function(forward) { + var workspace = Blockly.Workspace.getById(this.workspaceId); + var block = workspace.getBlockById(this.blockId); + if (!block) { + console.warn("Can't move non-existant block: " + this.blockId); + return; + } + var parentId = forward ? this.newParentId : this.oldParentId; + var inputName = forward ? this.newInputName : this.oldInputName; + var coordinate = forward ? this.newCoordinate : this.oldCoordinate; + var parentBlock = null; + if (parentId) { + parentBlock = workspace.getBlockById(parentId); + if (!parentBlock) { + console.warn("Can't connect to non-existant block: " + parentId); + return; + } + } + if (block.getParent()) { + block.unplug(); + } + if (coordinate) { + var xy = block.getRelativeToSurfaceXY(); + block.moveBy(coordinate.x - xy.x, coordinate.y - xy.y); + } else { + var blockConnection = block.outputConnection || block.previousConnection; + var parentConnection; + if (inputName) { + var input = parentBlock.getInput(inputName); + if (input) { + parentConnection = input.connection; + } + } else if (blockConnection.type == Blockly.PREVIOUS_STATEMENT) { + parentConnection = parentBlock.nextConnection; + } + if (parentConnection) { + blockConnection.connect(parentConnection); + } else { + console.warn("Can't connect to non-existant input: " + inputName); + } + } +}; + +/** + * Class for a UI event. + * @param {Blockly.Block} block The affected block. + * @param {string} element One of 'selected', 'comment', 'mutator', etc. + * @param {string} oldValue Previous value of element. + * @param {string} newValue New value of element. + * @extends {Blockly.Events.Abstract} + * @constructor + */ +Blockly.Events.Ui = function(block, element, oldValue, newValue) { + Blockly.Events.Ui.superClass_.constructor.call(this, block); + this.element = element; + this.oldValue = oldValue; + this.newValue = newValue; + this.recordUndo = false; +}; +goog.inherits(Blockly.Events.Ui, Blockly.Events.Abstract); + +/** + * Type of this event. + * @type {string} + */ +Blockly.Events.Ui.prototype.type = Blockly.Events.UI; + +/** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ +Blockly.Events.Ui.prototype.toJson = function() { + var json = Blockly.Events.Ui.superClass_.toJson.call(this); + json['element'] = this.element; + if (this.newValue !== undefined) { + json['newValue'] = this.newValue; + } + return json; +}; + +/** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ +Blockly.Events.Ui.prototype.fromJson = function(json) { + Blockly.Events.Ui.superClass_.fromJson.call(this, json); + this.element = json['element']; + this.newValue = json['newValue']; +}; diff --git a/core/field.js b/core/field.js index 9dfed24553..558f5c71f8 100644 --- a/core/field.js +++ b/core/field.js @@ -19,7 +19,7 @@ */ /** - * @fileoverview Input field. Used for editable titles, variables, etc. + * @fileoverview Field. Used for editable titles, variables, etc. * This is an abstract class that defines the UI on the block. Actual * instances would be Blockly.FieldTextInput, Blockly.FieldDropdown, etc. * @author fraser@google.com (Neil Fraser) @@ -36,13 +36,27 @@ goog.require('goog.userAgent'); /** - * Class for an editable field. + * Abstract class for an editable 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. * @constructor */ -Blockly.Field = function(text) { - this.size_ = new goog.math.Size(0, 25); - this.setText(text); +Blockly.Field = function(text, opt_validator) { + this.size_ = new goog.math.Size( + Blockly.BlockSvg.FIELD_WIDTH, + Blockly.BlockSvg.FIELD_HEIGHT); + this.setValue(text); + this.setValidator(opt_validator); + + /** + * Maximum characters of text to display before adding an ellipsis. + * Same for strings and numbers. + * @type {number} + */ + this.maxDisplayLength = Blockly.BlockSvg.MAX_DISPLAY_LENGTH; }; /** @@ -59,31 +73,45 @@ Blockly.Field.cacheWidths_ = null; */ Blockly.Field.cacheReference_ = 0; + /** - * Maximum characters of text to display before adding an ellipsis. + * Name of field. Unique within each block. + * Static labels are usually unnamed. + * @type {string=} + */ +Blockly.Field.prototype.name = undefined; + +/** + * Visible text to display. + * @type {string} + * @private */ -Blockly.Field.prototype.maxDisplayLength = 50; +Blockly.Field.prototype.text_ = ''; /** * Block this field is attached to. Starts as null, then in set in init. + * @type {Blockly.Block} * @private */ Blockly.Field.prototype.sourceBlock_ = null; /** * Is the field visible, or hidden due to the block being collapsed? + * @type {boolean} * @private */ Blockly.Field.prototype.visible_ = true; /** - * Change handler called when user edits an editable field. + * Validation function called when user edits an editable field. + * @type {Function} * @private */ -Blockly.Field.prototype.changeHandler_ = null; +Blockly.Field.prototype.validator_ = null; /** * Non-breaking space. + * @const */ Blockly.Field.NBSP = '\u00A0'; @@ -93,37 +121,48 @@ Blockly.Field.NBSP = '\u00A0'; Blockly.Field.prototype.EDITABLE = true; /** - * Install this field on a block. + * Attach this field to a block. * @param {!Blockly.Block} block The block containing this field. */ -Blockly.Field.prototype.init = function(block) { - if (this.sourceBlock_) { +Blockly.Field.prototype.setSourceBlock = function(block) { + goog.asserts.assert(!this.sourceBlock_, 'Field already bound to a block.'); + this.sourceBlock_ = block; +}; + +/** + * Install this field on a block. + */ +Blockly.Field.prototype.init = function() { + if (this.fieldGroup_) { // Field has already been initialized once. return; } - this.sourceBlock_ = block; // Build the DOM. this.fieldGroup_ = Blockly.createSvgElement('g', {}, null); if (!this.visible_) { this.fieldGroup_.style.display = 'none'; } - this.borderRect_ = Blockly.createSvgElement('rect', - {'rx': 4, - 'ry': 4, - 'x': -Blockly.BlockSvg.SEP_SPACE_X / 2, - 'y': 0, - 'height': 16}, this.fieldGroup_, this.sourceBlock_.workspace); + // Adjust X to be flipped for RTL. Position is relative to horizontal start of source block. + var fieldX = (this.sourceBlock_.RTL) ? -this.size_.width / 2 : this.size_.width / 2; /** @type {!Element} */ this.textElement_ = Blockly.createSvgElement('text', - {'class': 'blocklyText', 'y': this.size_.height - 12.5}, + {'class': 'blocklyText', + 'x': fieldX, + 'y': this.size_.height / 2 + Blockly.BlockSvg.FIELD_TOP_PADDING, + 'text-anchor': 'middle'}, this.fieldGroup_); this.updateEditable(); - block.getSvgRoot().appendChild(this.fieldGroup_); + this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_); this.mouseUpWrapper_ = - Blockly.bindEvent_(this.fieldGroup_, 'mouseup', this, this.onMouseUp_); + Blockly.bindEvent_(this.getClickTarget_(), 'mouseup', this, + this.onMouseUp_); // Force a render. this.updateTextNode_(); + if (Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, '', this.getValue())); + } }; /** @@ -138,8 +177,7 @@ Blockly.Field.prototype.dispose = function() { goog.dom.removeNode(this.fieldGroup_); this.fieldGroup_ = null; this.textElement_ = null; - this.borderRect_ = null; - this.changeHandler_ = null; + this.validator_ = null; }; /** @@ -154,13 +192,13 @@ Blockly.Field.prototype.updateEditable = function() { 'blocklyEditableText'); Blockly.removeClass_(/** @type {!Element} */ (this.fieldGroup_), 'blocklyNoNEditableText'); - this.fieldGroup_.style.cursor = this.CURSOR; + this.getClickTarget_().style.cursor = this.CURSOR; } else { Blockly.addClass_(/** @type {!Element} */ (this.fieldGroup_), 'blocklyNonEditableText'); Blockly.removeClass_(/** @type {!Element} */ (this.fieldGroup_), 'blocklyEditableText'); - this.fieldGroup_.style.cursor = ''; + this.getClickTarget_().style.cursor = ''; } }; @@ -189,11 +227,11 @@ Blockly.Field.prototype.setVisible = function(visible) { }; /** - * Sets a new change handler for editable fields. - * @param {Function} handler New change handler, or null. + * Sets a new validation function for editable fields. + * @param {Function} handler New validation function, or null. */ -Blockly.Field.prototype.setChangeHandler = function(handler) { - this.changeHandler_ = handler; +Blockly.Field.prototype.setValidator = function(handler) { + this.validator_ = handler; }; /** @@ -228,10 +266,6 @@ Blockly.Field.prototype.render_ = function() { Blockly.Field.cacheWidths_[key] = width; } } - if (this.borderRect_) { - this.borderRect_.setAttribute('width', - width + Blockly.BlockSvg.SEP_SPACE_X); - } } else { var width = 0; } @@ -241,8 +275,6 @@ Blockly.Field.prototype.render_ = function() { /** * Start caching field widths. Every call to this function MUST also call * stopCache. Caches must not survive between execution threads. - * @type {Object} - * @private */ Blockly.Field.startCache = function() { Blockly.Field.cacheReference_++; @@ -254,8 +286,6 @@ Blockly.Field.startCache = function() { /** * Stop caching field widths. Unless caching was already on when the * corresponding call to startCache was made. - * @type {number} - * @private */ Blockly.Field.stopCache = function() { Blockly.Field.cacheReference_--; @@ -279,12 +309,13 @@ Blockly.Field.prototype.getSize = function() { * Returns the height and width of the field, * accounting for the workspace scaling. * @return {!goog.math.Size} Height and width. + * @private */ Blockly.Field.prototype.getScaledBBox_ = function() { - var bBox = this.borderRect_.getBBox(); - // Create new object, as getBBox can return an uneditable SVGRect in IE. - return new goog.math.Size(bBox.width * this.sourceBlock_.workspace.scale, - bBox.height * this.sourceBlock_.workspace.scale); + var size = this.getSize(); + // Create new object, so as to not return an uneditable SVGRect in IE. + return new goog.math.Size(size.width * this.sourceBlock_.workspace.scale, + size.height * this.sourceBlock_.workspace.scale); }; /** @@ -315,7 +346,6 @@ Blockly.Field.prototype.setText = function(text) { if (this.sourceBlock_ && this.sourceBlock_.rendered) { this.sourceBlock_.render(); this.sourceBlock_.bumpNeighbours_(); - this.sourceBlock_.workspace.fireChangeEvent(); } }; @@ -332,6 +362,10 @@ Blockly.Field.prototype.updateTextNode_ = function() { if (text.length > this.maxDisplayLength) { // Truncate displayed string and add an ellipsis ('...'). text = text.substring(0, this.maxDisplayLength - 2) + '\u2026'; + // Add special class for sizing font when truncated + this.textElement_.setAttribute('class', 'blocklyText blocklyTextTruncated'); + } else { + this.textElement_.setAttribute('class', 'blocklyText'); } // Empty the text element. goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_)); @@ -364,10 +398,22 @@ Blockly.Field.prototype.getValue = function() { /** * By default there is no difference between the human-readable text and * the language-neutral values. Subclasses (such as dropdown) may define this. - * @param {string} text New text. + * @param {string} newText New text. */ -Blockly.Field.prototype.setValue = function(text) { - this.setText(text); +Blockly.Field.prototype.setValue = function(newText) { + if (newText === null) { + // No change if null. + return; + } + var oldText = this.getValue(); + if (oldText == newText) { + return; + } + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, oldText, newText)); + } + this.setText(newText); }; /** @@ -385,7 +431,7 @@ Blockly.Field.prototype.onMouseUp_ = function(e) { } else if (Blockly.isRightButton(e)) { // Right-click. return; - } else if (Blockly.dragMode_ == 2) { + } else if (Blockly.dragMode_ == Blockly.DRAG_FREE) { // Drag operation is concluding. Don't open the editor. return; } else if (this.sourceBlock_.isEditable()) { @@ -403,12 +449,37 @@ Blockly.Field.prototype.setTooltip = function(newTip) { // Non-abstract sub-classes may wish to implement this. See FieldLabel. }; +/** + * Select the element to bind the click handler to. When this element is + * clicked on an editable field, the editor will open. + * + *

If the block has multiple fields, this is just the group containing the + * field. If the block has only one field, we handle clicks over the whole + * block. + * + * @return {!Element} Element to bind click handler to. + * @private + */ +Blockly.Field.prototype.getClickTarget_ = function() { + var nFields = 0; + + for (var i = 0, input; input = this.sourceBlock_.inputList[i]; i++) { + nFields += input.fieldRow.length; + } + + if (nFields <= 1) { + return this.sourceBlock_.getSvgRoot(); + } else { + return this.getSvgRoot(); + } +}; + /** * Return the absolute coordinates of the top-left corner of this field. * The origin (0,0) is the top-left corner of the page body. - * @return {{!goog.math.Coordinate}} Object with .x and .y properties. + * @return {!goog.math.Coordinate} Object with .x and .y properties. * @private */ Blockly.Field.prototype.getAbsoluteXY_ = function() { - return goog.style.getPageOffset(this.borderRect_); + return goog.style.getPageOffset(this.getClickTarget_()); }; diff --git a/core/field_angle.js b/core/field_angle.js index 8fb311fcc0..b5ca196cee 100644 --- a/core/field_angle.js +++ b/core/field_angle.js @@ -34,20 +34,19 @@ goog.require('goog.userAgent'); /** * Class for an editable angle field. * @param {string} text The initial content of the field. - * @param {Function=} opt_changeHandler An optional function that is called + * @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 the accepted text or null to abort * the change. * @extends {Blockly.FieldTextInput} * @constructor */ -Blockly.FieldAngle = function(text, opt_changeHandler) { +Blockly.FieldAngle = function(text, opt_validator) { // Add degree symbol: "360°" (LTR) or "°360" (RTL) this.symbol_ = Blockly.createSvgElement('tspan', {}, null); this.symbol_.appendChild(document.createTextNode('\u00B0')); - Blockly.FieldAngle.superClass_.constructor.call(this, text, null); - this.setChangeHandler(opt_changeHandler); + Blockly.FieldAngle.superClass_.constructor.call(this, text, opt_validator); }; goog.inherits(Blockly.FieldAngle, Blockly.FieldTextInput); @@ -55,7 +54,7 @@ goog.inherits(Blockly.FieldAngle, Blockly.FieldTextInput); * Sets a new change handler for angle field. * @param {Function} handler New change handler, or null. */ -Blockly.FieldAngle.prototype.setChangeHandler = function(handler) { +Blockly.FieldAngle.prototype.setValidator = function(handler) { var wrappedHandler; if (handler) { // Wrap the user's change handler together with the angle validator. @@ -68,7 +67,7 @@ Blockly.FieldAngle.prototype.setChangeHandler = function(handler) { v1 = value; } var v2 = Blockly.FieldAngle.angleValidator.call(this, v1); - if (v2 !== undefined) { + if (v2 === undefined) { v2 = v1; } } @@ -77,7 +76,7 @@ Blockly.FieldAngle.prototype.setChangeHandler = function(handler) { } else { wrappedHandler = Blockly.FieldAngle.angleValidator; } - Blockly.FieldAngle.superClass_.setChangeHandler.call(this, wrappedHandler); + Blockly.FieldAngle.superClass_.setValidator.call(this, wrappedHandler); }; /** @@ -91,6 +90,36 @@ Blockly.FieldAngle.ROUND = 15; */ Blockly.FieldAngle.HALF = 100 / 2; +/* The following two settings work together to set the behaviour of the angle + * picker. While many combinations are possible, two modes are typical: + * Math mode. + * 0 deg is right, 90 is up. This is the style used by protractors. + * Blockly.FieldAngle.CLOCKWISE = false; + * Blockly.FieldAngle.OFFSET = 0; + * Compass mode. + * 0 deg is up, 90 is right. This is the style used by maps. + * Blockly.FieldAngle.CLOCKWISE = true; + * Blockly.FieldAngle.OFFSET = 90; + */ + +/** + * Angle increases clockwise (true) or counterclockwise (false). + */ +Blockly.FieldAngle.CLOCKWISE = false; + +/** + * Offset the location of 0 degrees (and all angles) by a constant. + * Usually either 0 (0 = right) or 90 (0 = up). + */ +Blockly.FieldAngle.OFFSET = 0; + +/** + * Maximum allowed angle before wrapping. + * Usually either 360 (for 0 to 359.9) or 180 (for -179.9 to 180). + */ +Blockly.FieldAngle.WRAP = 360; + + /** * Radius of protractor circle. Slightly smaller than protractor size since * otherwise SVG crops off half the border at the edges. @@ -196,18 +225,20 @@ Blockly.FieldAngle.prototype.onMouseMove = function(e) { } else if (dy > 0) { angle += 360; } + if (Blockly.FieldAngle.CLOCKWISE) { + angle = Blockly.FieldAngle.OFFSET + 360 - angle; + } else { + angle -= Blockly.FieldAngle.OFFSET; + } if (Blockly.FieldAngle.ROUND) { angle = Math.round(angle / Blockly.FieldAngle.ROUND) * Blockly.FieldAngle.ROUND; } - if (angle >= 360) { - // Rounding may have rounded up to 360. - angle -= 360; - } - angle = String(angle); + angle = Blockly.FieldAngle.angleValidator(angle); Blockly.FieldTextInput.htmlInput_.value = angle; - this.setText(angle); + this.setValue(angle); this.validate_(); + this.resizeEditor_(); }; /** @@ -239,26 +270,33 @@ Blockly.FieldAngle.prototype.updateGraph_ = function() { if (!this.gauge_) { return; } - var angleRadians = goog.math.toRadians(Number(this.getText())); - if (isNaN(angleRadians)) { - this.gauge_.setAttribute('d', - 'M ' + Blockly.FieldAngle.HALF + ',' + Blockly.FieldAngle.HALF); - this.line_.setAttribute('x2', Blockly.FieldAngle.HALF); - this.line_.setAttribute('y2', Blockly.FieldAngle.HALF); - } else { - var x = Blockly.FieldAngle.HALF + Math.cos(angleRadians) * - Blockly.FieldAngle.RADIUS; - var y = Blockly.FieldAngle.HALF + Math.sin(angleRadians) * - -Blockly.FieldAngle.RADIUS; - var largeFlag = (angleRadians > Math.PI) ? 1 : 0; - this.gauge_.setAttribute('d', - 'M ' + Blockly.FieldAngle.HALF + ',' + Blockly.FieldAngle.HALF + - ' h ' + Blockly.FieldAngle.RADIUS + - ' A ' + Blockly.FieldAngle.RADIUS + ',' + Blockly.FieldAngle.RADIUS + - ' 0 ' + largeFlag + ' 0 ' + x + ',' + y + ' z'); - this.line_.setAttribute('x2', x); - this.line_.setAttribute('y2', y); + var angleDegrees = Number(this.getText()) + Blockly.FieldAngle.OFFSET; + var angleRadians = goog.math.toRadians(angleDegrees); + var path = ['M ', Blockly.FieldAngle.HALF, ',', Blockly.FieldAngle.HALF]; + var x2 = Blockly.FieldAngle.HALF; + var y2 = Blockly.FieldAngle.HALF; + if (!isNaN(angleRadians)) { + var angle1 = goog.math.toRadians(Blockly.FieldAngle.OFFSET); + var x1 = Math.cos(angle1) * Blockly.FieldAngle.RADIUS; + var y1 = Math.sin(angle1) * -Blockly.FieldAngle.RADIUS; + if (Blockly.FieldAngle.CLOCKWISE) { + angleRadians = 2 * angle1 - angleRadians; + } + x2 += Math.cos(angleRadians) * Blockly.FieldAngle.RADIUS; + y2 -= Math.sin(angleRadians) * Blockly.FieldAngle.RADIUS; + // Don't ask how the flag calculations work. They just do. + var largeFlag = Math.abs(Math.floor((angleRadians - angle1) / Math.PI) % 2); + if (Blockly.FieldAngle.CLOCKWISE) { + largeFlag = 1 - largeFlag; + } + var sweepFlag = Number(Blockly.FieldAngle.CLOCKWISE); + path.push(' l ', x1, ',', y1, + ' A ', Blockly.FieldAngle.RADIUS, ',', Blockly.FieldAngle.RADIUS, + ' 0 ', largeFlag, ' ', sweepFlag, ' ', x2, ',', y2, ' z'); } + this.gauge_.setAttribute('d', path.join('')); + this.line_.setAttribute('x2', x2); + this.line_.setAttribute('y2', y2); }; /** @@ -273,7 +311,10 @@ Blockly.FieldAngle.angleValidator = function(text) { if (n < 0) { n += 360; } + if (n > Blockly.FieldAngle.WRAP) { + n -= 360; + } n = String(n); - } + } return n; }; diff --git a/core/field_checkbox.js b/core/field_checkbox.js index c56b2e70ea..183e226c9e 100644 --- a/core/field_checkbox.js +++ b/core/field_checkbox.js @@ -32,22 +32,25 @@ goog.require('Blockly.Field'); /** * Class for a checkbox field. * @param {string} state The initial state of the field ('TRUE' or 'FALSE'). - * @param {Function=} opt_changeHandler A function that is executed when a new + * @param {Function=} opt_validator A function that is executed when a new * option is selected. Its sole argument is the new checkbox state. If * it returns a value, this becomes the new checkbox state, unless the * value is null, in which case the change is aborted. * @extends {Blockly.Field} * @constructor */ -Blockly.FieldCheckbox = function(state, opt_changeHandler) { - Blockly.FieldCheckbox.superClass_.constructor.call(this, ''); - - this.setChangeHandler(opt_changeHandler); +Blockly.FieldCheckbox = function(state, opt_validator) { + Blockly.FieldCheckbox.superClass_.constructor.call(this, '', opt_validator); // Set the initial state. this.setValue(state); }; goog.inherits(Blockly.FieldCheckbox, Blockly.Field); +/** + * Character for the checkmark. + */ +Blockly.FieldCheckbox.CHECK_CHAR = '\u2713'; + /** * Mouse cursor style when over the hotspot that initiates editability. */ @@ -58,7 +61,7 @@ Blockly.FieldCheckbox.prototype.CURSOR = 'default'; * @param {!Blockly.Block} block The block containing this text. */ Blockly.FieldCheckbox.prototype.init = function(block) { - if (this.sourceBlock_) { + if (this.fieldGroup_) { // Checkbox has already been initialized once. return; } @@ -66,8 +69,9 @@ Blockly.FieldCheckbox.prototype.init = function(block) { // The checkbox doesn't use the inherited text element. // Instead it uses a custom checkmark element that is either visible or not. this.checkElement_ = Blockly.createSvgElement('text', - {'class': 'blocklyText', 'x': -3, 'y': 14}, this.fieldGroup_); - var textNode = document.createTextNode('\u2713'); + {'class': 'blocklyText blocklyCheckbox', 'x': -3, 'y': 14}, + this.fieldGroup_); + var textNode = document.createTextNode(Blockly.FieldCheckbox.CHECK_CHAR); this.checkElement_.appendChild(textNode); this.checkElement_.style.display = this.state_ ? 'block' : 'none'; }; @@ -87,13 +91,14 @@ Blockly.FieldCheckbox.prototype.getValue = function() { Blockly.FieldCheckbox.prototype.setValue = function(strBool) { var newState = (strBool == 'TRUE'); if (this.state_ !== newState) { + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.state_, newState)); + } this.state_ = newState; if (this.checkElement_) { this.checkElement_.style.display = newState ? 'block' : 'none'; } - if (this.sourceBlock_ && this.sourceBlock_.rendered) { - this.sourceBlock_.workspace.fireChangeEvent(); - } } }; @@ -103,15 +108,14 @@ Blockly.FieldCheckbox.prototype.setValue = function(strBool) { */ Blockly.FieldCheckbox.prototype.showEditor_ = function() { var newState = !this.state_; - if (this.sourceBlock_ && this.changeHandler_) { - // Call any change handler, and allow it to override. - var override = this.changeHandler_(newState); + if (this.sourceBlock_ && this.validator_) { + // Call any validation function, and allow it to override. + var override = this.validator_(newState); if (override !== undefined) { newState = override; } } if (newState !== null) { - this.sourceBlock_.setShadow(false); this.setValue(String(newState).toUpperCase()); } }; diff --git a/core/field_colour.js b/core/field_colour.js index 69fdb93d46..96318b9eec 100644 --- a/core/field_colour.js +++ b/core/field_colour.js @@ -36,7 +36,7 @@ goog.require('goog.ui.ColorPicker'); /** * Class for a colour input field. * @param {string} colour The initial colour in '#rrggbb' format. - * @param {Function=} opt_changeHandler A function that is executed when a new + * @param {Function=} opt_validator A function that is executed when a new * colour is selected. Its sole argument is the new colour value. Its * return value becomes the selected colour, unless it is undefined, in * which case the new colour stands, or it is null, in which case the change @@ -44,12 +44,9 @@ goog.require('goog.ui.ColorPicker'); * @extends {Blockly.Field} * @constructor */ -Blockly.FieldColour = function(colour, opt_changeHandler) { - Blockly.FieldColour.superClass_.constructor.call(this, '\u00A0\u00A0\u00A0'); - - this.setChangeHandler(opt_changeHandler); - // Set the initial state. - this.setValue(colour); +Blockly.FieldColour = function(colour, opt_validator) { + Blockly.FieldColour.superClass_.constructor.call(this, colour, opt_validator); + this.setText(Blockly.Field.NBSP + Blockly.Field.NBSP + Blockly.Field.NBSP); }; goog.inherits(Blockly.FieldColour, Blockly.Field); @@ -73,7 +70,12 @@ Blockly.FieldColour.prototype.columns_ = 0; */ Blockly.FieldColour.prototype.init = function(block) { Blockly.FieldColour.superClass_.init.call(this, block); - this.borderRect_.style['fillOpacity'] = 1; + // TODO(#163): borderRect_ has been removed from the field. + // When fixing field_colour, we should re-color the shadow block instead, + // or re-implement a rectangle in the field. + if (this.borderRect_) { + this.borderRect_.style['fillOpacity'] = 1; + } this.setValue(this.getValue()); }; @@ -103,13 +105,15 @@ Blockly.FieldColour.prototype.getValue = function() { * @param {string} colour The new colour in '#rrggbb' format. */ Blockly.FieldColour.prototype.setValue = function(colour) { + if (this.sourceBlock_ && Blockly.Events.isEnabled() && + this.colour_ != colour) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.colour_, colour)); + } this.colour_ = colour; if (this.borderRect_) { this.borderRect_.style.fill = colour; } - if (this.sourceBlock_ && this.sourceBlock_.rendered) { - this.sourceBlock_.workspace.fireChangeEvent(); - } }; /** @@ -118,6 +122,7 @@ Blockly.FieldColour.prototype.setValue = function(colour) { */ Blockly.FieldColour.prototype.getText = function() { var colour = this.colour_; + // Try to use #rgb format if possible, rather than #rrggbb. var m = colour.match(/^#(.)\1(.)\2(.)\3$/); if (m) { colour = '#' + m[1] + m[2] + m[3]; @@ -214,15 +219,14 @@ Blockly.FieldColour.prototype.showEditor_ = function() { function(event) { var colour = event.target.getSelectedColor() || '#000000'; Blockly.WidgetDiv.hide(); - if (thisField.sourceBlock_ && thisField.changeHandler_) { - // Call any change handler, and allow it to override. - var override = thisField.changeHandler_(colour); + if (thisField.sourceBlock_ && thisField.validator_) { + // Call any validation function, and allow it to override. + var override = thisField.validator_(colour); if (override !== undefined) { colour = override; } } if (colour !== null) { - thisField.sourceBlock_.setShadow(false); thisField.setValue(colour); } }); diff --git a/core/field_date.js b/core/field_date.js index 11f47d9764..e2a203a2f8 100644 --- a/core/field_date.js +++ b/core/field_date.js @@ -39,7 +39,7 @@ goog.require('goog.ui.DatePicker'); /** * Class for a date input field. * @param {string} date The initial date. - * @param {Function=} opt_changeHandler A function that is executed when a new + * @param {Function=} opt_validator A function that is executed when a new * date is selected. Its sole argument is the new date value. Its * return value becomes the selected date, unless it is undefined, in * which case the new date stands, or it is null, in which case the change @@ -47,13 +47,12 @@ goog.require('goog.ui.DatePicker'); * @extends {Blockly.Field} * @constructor */ -Blockly.FieldDate = function(date, opt_changeHandler) { +Blockly.FieldDate = function(date, opt_validator) { if (!date) { date = new goog.date.Date().toIsoString(true); } - Blockly.FieldDate.superClass_.constructor.call(this, date); + Blockly.FieldDate.superClass_.constructor.call(this, date, opt_validator); this.setValue(date); - this.setChangeHandler(opt_changeHandler); }; goog.inherits(Blockly.FieldDate, Blockly.Field); @@ -83,8 +82,8 @@ Blockly.FieldDate.prototype.getValue = function() { * @param {string} date The new date. */ Blockly.FieldDate.prototype.setValue = function(date) { - if (this.sourceBlock_ && this.changeHandler_) { - var validated = this.changeHandler_(date); + if (this.sourceBlock_ && this.validator_) { + var validated = this.validator_(date); // If the new date is invalid, validation returns null. // In this case we still want to display the illegal result. if (validated !== null && validated !== undefined) { @@ -150,9 +149,9 @@ Blockly.FieldDate.prototype.showEditor_ = function() { function(event) { var date = event.date ? event.date.toIsoString(true) : ''; Blockly.WidgetDiv.hide(); - if (thisField.sourceBlock_ && thisField.changeHandler_) { - // Call any change handler, and allow it to override. - var override = thisField.changeHandler_(date); + if (thisField.sourceBlock_ && thisField.validator_) { + // Call any validation function, and allow it to override. + var override = thisField.validator_(date); if (override !== undefined) { date = override; } diff --git a/core/field_dropdown.js b/core/field_dropdown.js index b773d12f77..d715c8c725 100644 --- a/core/field_dropdown.js +++ b/core/field_dropdown.js @@ -39,9 +39,9 @@ goog.require('goog.userAgent'); /** * Class for an editable dropdown field. - * @param {(!Array.>|!Function)} menuGenerator An array of options - * for a dropdown list, or a function which generates these options. - * @param {Function=} opt_changeHandler A function that is executed when a new + * @param {(!Array.>|!Function)} menuGenerator An array of + * options for a dropdown list, or a function which generates these options. + * @param {Function=} opt_validator A function that is executed when a new * option is selected, with the newly selected value as its sole argument. * If it returns a value, that value (which must be one of the options) will * become selected in place of the newly selected option, unless the return @@ -49,15 +49,14 @@ goog.require('goog.userAgent'); * @extends {Blockly.Field} * @constructor */ -Blockly.FieldDropdown = function(menuGenerator, opt_changeHandler) { +Blockly.FieldDropdown = function(menuGenerator, opt_validator) { this.menuGenerator_ = menuGenerator; - this.setChangeHandler(opt_changeHandler); this.trimOptions_(); var firstTuple = this.getOptions_()[0]; - this.value_ = firstTuple[1]; // Call parent's constructor. - Blockly.FieldDropdown.superClass_.constructor.call(this, firstTuple[0]); + Blockly.FieldDropdown.superClass_.constructor.call(this, firstTuple[1], + opt_validator); }; goog.inherits(Blockly.FieldDropdown, Blockly.Field); @@ -81,11 +80,10 @@ Blockly.FieldDropdown.prototype.CURSOR = 'default'; * @param {!Blockly.Block} block The block containing this text. */ Blockly.FieldDropdown.prototype.init = function(block) { - if (this.sourceBlock_) { + if (this.fieldGroup_) { // Dropdown has already been initialized once. return; } - // Add dropdown arrow: "option ▾" (LTR) or "▾ אופציה" (RTL) this.arrow_ = Blockly.createSvgElement('tspan', {}, null); this.arrow_.appendChild(document.createTextNode( @@ -111,15 +109,14 @@ Blockly.FieldDropdown.prototype.showEditor_ = function() { var menuItem = e.target; if (menuItem) { var value = menuItem.getValue(); - if (thisField.sourceBlock_ && thisField.changeHandler_) { - // Call any change handler, and allow it to override. - var override = thisField.changeHandler_(value); + if (thisField.sourceBlock_ && thisField.validator_) { + // Call any validation function, and allow it to override. + var override = thisField.validator_(value); if (override !== undefined) { value = override; } } if (value !== null) { - thisField.sourceBlock_.setShadow(false); thisField.setValue(value); } } @@ -265,6 +262,13 @@ Blockly.FieldDropdown.prototype.getValue = function() { * @param {string} newValue New value to set. */ Blockly.FieldDropdown.prototype.setValue = function(newValue) { + if (newValue === null || newValue === this.value_) { + return; // No change if null. + } + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.value_, newValue)); + } this.value_ = newValue; // Look up and display the human-readable text. var options = this.getOptions_(); @@ -308,7 +312,6 @@ Blockly.FieldDropdown.prototype.setText = function(text) { if (this.sourceBlock_ && this.sourceBlock_.rendered) { this.sourceBlock_.render(); this.sourceBlock_.bumpNeighbours_(); - this.sourceBlock_.workspace.fireChangeEvent(); } }; diff --git a/core/field_iconmenu.js b/core/field_iconmenu.js new file mode 100644 index 0000000000..76d2e10987 --- /dev/null +++ b/core/field_iconmenu.js @@ -0,0 +1,297 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Massachusetts Institute of Technology + * All rights reserved. + * + * 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 Icon picker input field. + * This is primarily for use in Scratch Horizontal blocks. + * Pops open a drop-down with icons; when an icon is selected, it replaces + * the icon (image field) in the original block. + * @author tmickel@mit.edu (Tim Mickel) + */ +'use strict'; + +goog.provide('Blockly.FieldIconMenu'); + +goog.require('Blockly.DropDownDiv'); + +/** + * Class for an icon menu field. + * @param {Object} icons List of icons. These take the same options as an Image Field. + * @extends {Blockly.Field} + * @constructor + */ +Blockly.FieldIconMenu = function(icons) { + /** @type {object} */ + this.icons_ = icons; + // Example: + // [{src: '...', width: 20, height: 20, alt: '...', value: 'machine_value'}, ...] + // First icon provides the default values. + var defaultValue = icons[0].value; + Blockly.FieldIconMenu.superClass_.constructor.call(this, defaultValue); +}; +goog.inherits(Blockly.FieldIconMenu, Blockly.Field); + + +/** + * Fixed width of the drop-down, in px. Icon buttons will flow inside this width. + * @type {number} + * @const + */ +Blockly.FieldIconMenu.DROPDOWN_WIDTH = 168; + +/** + * Save the primary colour of the source block while the menu is open, for reset. + * @type {number|string} + * @private + */ +Blockly.FieldIconMenu.savedPrimary_ = null; + +/** + * Called when the field is placed on a block. + * @param {Block} block The owning block. + */ +Blockly.FieldIconMenu.prototype.init = function(block) { + // Render the arrow icon + // Fixed sizes in px. Saved for creating the flip transform of the menu renders above the button. + var arrowSize = 12; + /** @type {Number} */ + this.arrowX_ = 18; + /** @type {Number} */ + this.arrowY_ = 10; + if (block.RTL) { + // In RTL, the icon position is flipped and rendered from the right (offset by width) + this.arrowX_ = -this.arrowX_ - arrowSize; + } + /** @type {Element} */ + this.arrowIcon_ = Blockly.createSvgElement('image', { + 'height': arrowSize + 'px', + 'width': arrowSize + 'px', + 'transform': 'translate(' + this.arrowX_ + ',' + this.arrowY_ + ')' + }); + this.arrowIcon_.setAttributeNS('http://www.w3.org/1999/xlink', + 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'dropdown-arrow.svg'); + block.getSvgRoot().appendChild(this.arrowIcon_); + Blockly.FieldIconMenu.superClass_.init.call(this, block); +}; + +/** + * Mouse cursor style when over the hotspot that initiates the editor. + * @const + */ +Blockly.FieldIconMenu.prototype.CURSOR = 'default'; + +/** +* Set the language-neutral value for this icon drop-down menu. + * @param {?string} newValue New value. + * @override + */ +Blockly.FieldIconMenu.prototype.setValue = function(newValue) { + if (newValue === null || newValue === this.value_) { + return; // No change + } + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.value_, newValue)); + } + this.value_ = newValue; + // Find the relevant icon in this.icons_ to get the image src. + this.setParentFieldImage(this.getSrcForValue(this.value_)); +}; + +/** +* Find the parent block's FieldImage and set its src. + * @param {?string} src New src for the parent block FieldImage. + * @private + */ +Blockly.FieldIconMenu.prototype.setParentFieldImage = function(src) { + // Only attempt if we have a set sourceBlock_ and parentBlock_ + // It's possible that this function could be called before + // a parent block is set; in that case, fail silently. + if (this.sourceBlock_ && this.sourceBlock_.parentBlock_) { + var parentBlock = this.sourceBlock_.parentBlock_; + // Loop through all inputs' fields to find the first FieldImage + for (var i = 0, input; input = parentBlock.inputList[i]; i++) { + for (var j = 0, field; field = input.fieldRow[j]; j++) { + if (field instanceof Blockly.FieldImage) { + // Src for a FieldImage is stored in its value. + field.setValue(src); + return; + } + } + } + } +}; + +/** + * Get the language-neutral value from this drop-down menu. + * @return {string} Current language-neutral value. + */ +Blockly.FieldIconMenu.prototype.getValue = function() { + return this.value_; +}; + +/** + * For a language-neutral value, get the src for the image that represents it. + * @param {string} value Language-neutral value to look up. + * @return {string} Src to image representing value + */ +Blockly.FieldIconMenu.prototype.getSrcForValue = function(value) { + for (var i = 0, icon; icon = this.icons_[i]; i++) { + if (icon.value === value) { + return icon.src; + } + } +}; + +/** + * Show the drop-down menu for editing this field. + * @private + */ +Blockly.FieldIconMenu.prototype.showEditor_ = function() { + // If there is an existing drop-down we own, this is a request to hide the drop-down. + if (Blockly.DropDownDiv.hideIfOwner(this)) { + return; + } + // If there is an existing drop-down someone else owns, hide it immediately and clear it. + Blockly.DropDownDiv.hideWithoutAnimation(); + Blockly.DropDownDiv.clearContent(); + // Populate the drop-down with the icons for this field. + var contentDiv = Blockly.DropDownDiv.getContentDiv(); + // Accessibility properties + contentDiv.setAttribute('role', 'menu'); + contentDiv.setAttribute('aria-haspopup', 'true'); + for (var i = 0, icon; icon = this.icons_[i]; i++) { + // Icons with the type property placeholder take up space but don't have any functionality + // Use for special-case layouts + if (icon.type == 'placeholder') { + var placeholder = document.createElement('span'); + placeholder.setAttribute('class', 'blocklyDropDownPlaceholder'); + placeholder.style.width = icon.width + 'px'; + placeholder.style.height = icon.height + 'px'; + contentDiv.appendChild(placeholder); + continue; + } + var button = document.createElement('button'); + button.setAttribute('id', ':' + i); // For aria-activedescendant + button.setAttribute('role', 'menuitem'); + button.setAttribute('class', 'blocklyDropDownButton'); + button.title = icon.alt; + button.style.width = icon.width + 'px'; + button.style.height = icon.height + 'px'; + var backgroundColor = this.sourceBlock_.getColour(); + if (icon.value == this.getValue()) { + // This icon is selected, show it in a different colour + backgroundColor = this.sourceBlock_.getColourTertiary(); + button.setAttribute('aria-selected', 'true'); + } + button.style.backgroundColor = backgroundColor; + button.style.borderColor = this.sourceBlock_.getColourTertiary(); + button.onclick = this.buttonClick_.bind(this); + button.ontouchend = this.buttonClick_.bind(this); + // These are applied manually instead of using the :hover pseudoclass + // because Android has a bad long press "helper" menu and green highlight + // that we must prevent with ontouchstart preventDefault + button.ontouchstart = function(e) { + this.setAttribute('class', 'blocklyDropDownButton blocklyDropDownButtonHover'); + e.preventDefault(); + }; + button.onmouseover = function() { + this.setAttribute('class', 'blocklyDropDownButton blocklyDropDownButtonHover'); + contentDiv.setAttribute('aria-activedescendant', this.id); + }; + button.onmouseout = function() { + this.setAttribute('class', 'blocklyDropDownButton'); + contentDiv.removeAttribute('aria-activedescendant'); + }; + var buttonImg = document.createElement('img'); + buttonImg.src = icon.src; + //buttonImg.alt = icon.alt; + // Upon click/touch, we will be able to get the clicked element as e.target + // Store a data attribute on all possible click targets so we can match it to the icon. + button.setAttribute('data-value', icon.value); + buttonImg.setAttribute('data-value', icon.value); + button.appendChild(buttonImg); + contentDiv.appendChild(button); + } + contentDiv.style.width = Blockly.FieldIconMenu.DROPDOWN_WIDTH + 'px'; + // Calculate positioning for the drop-down + // sourceBlock_ is the rendered shadow field button + var scale = this.sourceBlock_.workspace.scale; + var bBox = this.sourceBlock_.getHeightWidth(); + bBox.width *= scale; + bBox.height *= scale; + var position = this.getAbsoluteXY_(); + // If we can fit it, render below the shadow block + var primaryX = position.x + bBox.width / 2; + var primaryY = position.y + bBox.height; + // If we can't fit it, render above the entire parent block + var secondaryX = primaryX; + var secondaryY = position.y - (Blockly.BlockSvg.MIN_BLOCK_Y * scale) - (Blockly.BlockSvg.FIELD_Y_OFFSET * scale); + + Blockly.DropDownDiv.setColour(this.sourceBlock_.getColour(), this.sourceBlock_.getColourTertiary()); + + // Update source block colour to look selected + this.savedPrimary_ = this.sourceBlock_.getColour(); + this.sourceBlock_.setColour(this.sourceBlock_.getColourSecondary(), + this.sourceBlock_.getColourSecondary(), this.sourceBlock_.getColourTertiary()); + + Blockly.DropDownDiv.setBoundsElement(this.sourceBlock_.workspace.getParentSvg().parentNode); + var renderedPrimary = Blockly.DropDownDiv.show(this, primaryX, primaryY, + secondaryX, secondaryY, this.onHide_.bind(this)); + if (!renderedPrimary) { + // Adjust for rotation + var arrowX = this.arrowX_ + Blockly.DropDownDiv.ARROW_SIZE / 1.5 + 1; + var arrowY = this.arrowY_ + Blockly.DropDownDiv.ARROW_SIZE / 1.5; + // Flip the arrow on the button + this.arrowIcon_.setAttribute('transform', + 'translate(' + arrowX + ',' + arrowY + ') rotate(180)'); + } +}; + +/** + * Callback for when a button is clicked inside the drop-down. + * Should be bound to the FieldIconMenu. + * @param {Event} e DOM event for the click/touch + * @private + */ +Blockly.FieldIconMenu.prototype.buttonClick_ = function(e) { + var value = e.target.getAttribute('data-value'); + this.setValue(value); + Blockly.DropDownDiv.hide(); +}; + +/** + * Callback for when the drop-down is hidden. + */ +Blockly.FieldIconMenu.prototype.onHide_ = function() { + // Reset the button colour and clear accessibility properties + // Only attempt to do this reset if sourceBlock_ is not disposed. + // It could become disposed before an onHide_, for example, + // when a block is dragged from the flyout. + if (this.sourceBlock_) { + this.sourceBlock_.setColour(this.savedPrimary_, + this.sourceBlock_.getColourSecondary(), this.sourceBlock_.getColourTertiary()); + } + Blockly.DropDownDiv.content_.removeAttribute('role'); + Blockly.DropDownDiv.content_.removeAttribute('aria-haspopup'); + Blockly.DropDownDiv.content_.removeAttribute('aria-activedescendant'); + // Unflip the arrow if appropriate + this.arrowIcon_.setAttribute('transform', 'translate(' + this.arrowX_ + ',' + this.arrowY_ + ')'); +}; diff --git a/core/field_image.js b/core/field_image.js index b24e75c542..49e750a2b6 100644 --- a/core/field_image.js +++ b/core/field_image.js @@ -38,17 +38,18 @@ goog.require('goog.userAgent'); * @param {number} width Width of the image. * @param {number} height Height of the image. * @param {string=} opt_alt Optional alt text for when block is collapsed. + * @param {boolean} flip_rtl Whether to flip the icon in RTL * @extends {Blockly.Field} * @constructor */ -Blockly.FieldImage = function(src, width, height, opt_alt) { +Blockly.FieldImage = function(src, width, height, opt_alt, flip_rtl) { this.sourceBlock_ = null; // Ensure height and width are numbers. Strings are bad at math. this.height_ = Number(height); this.width_ = Number(width); - this.size_ = new goog.math.Size(this.width_, - this.height_ + 2 * Blockly.BlockSvg.INLINE_PADDING_Y); + this.size_ = new goog.math.Size(this.width_, this.height_); this.text_ = opt_alt || ''; + this.flipRTL_ = flip_rtl; this.setValue(src); }; goog.inherits(Blockly.FieldImage, Blockly.Field); @@ -67,14 +68,12 @@ Blockly.FieldImage.prototype.EDITABLE = false; /** * Install this image on a block. - * @param {!Blockly.Block} block The block containing this text. */ -Blockly.FieldImage.prototype.init = function(block) { - if (this.sourceBlock_) { +Blockly.FieldImage.prototype.init = function() { + if (this.fieldGroup_) { // Image has already been initialized once. return; } - this.sourceBlock_ = block; // Build the DOM. /** @type {SVGElement} */ this.fieldGroup_ = Blockly.createSvgElement('g', {}, null); @@ -97,7 +96,7 @@ Blockly.FieldImage.prototype.init = function(block) { 'width': this.width_ + 'px', 'fill-opacity': 0}, this.fieldGroup_); } - block.getSvgRoot().appendChild(this.fieldGroup_); + this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_); // Configure the field to be transparent with respect to tooltips. var topElement = this.rectElement_ || this.imageElement_; @@ -151,6 +150,14 @@ Blockly.FieldImage.prototype.setValue = function(src) { } }; +/** + * Get whether to flip this image in RTL + * @return {boolean} True if we should flip in RTL. + */ +Blockly.FieldImage.prototype.getFlipRTL = function() { + return this.flipRTL_; +}; + /** * Set the alt text of this image. * @param {?string} alt New alt text. diff --git a/core/field_label.js b/core/field_label.js index da52f8d09b..cb5fa7d398 100644 --- a/core/field_label.js +++ b/core/field_label.js @@ -42,7 +42,7 @@ goog.require('goog.math.Size'); Blockly.FieldLabel = function(text, opt_class) { this.size_ = new goog.math.Size(0, 17.5); this.class_ = opt_class; - this.setText(text); + this.setValue(text); }; goog.inherits(Blockly.FieldLabel, Blockly.Field); @@ -53,15 +53,12 @@ Blockly.FieldLabel.prototype.EDITABLE = false; /** * Install this text on a block. - * @param {!Blockly.Block} block The block containing this text. */ -Blockly.FieldLabel.prototype.init = function(block) { - if (this.sourceBlock_) { +Blockly.FieldLabel.prototype.init = function() { + if (this.textElement_) { // Text has already been initialized once. return; } - this.sourceBlock_ = block; - // Build the DOM. this.textElement_ = Blockly.createSvgElement('text', {'class': 'blocklyText', 'y': this.size_.height - 5}, null); @@ -71,7 +68,7 @@ Blockly.FieldLabel.prototype.init = function(block) { if (!this.visible_) { this.textElement_.style.display = 'none'; } - block.getSvgRoot().appendChild(this.textElement_); + this.sourceBlock_.getSvgRoot().appendChild(this.textElement_); // Configure the field to be transparent with respect to tooltips. this.textElement_.tooltip = this.sourceBlock_; diff --git a/core/field_number.js b/core/field_number.js new file mode 100644 index 0000000000..e66ecf31fe --- /dev/null +++ b/core/field_number.js @@ -0,0 +1,287 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 Massachusetts Institute of Technology + * All rights reserved. + * + * 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 Field for numbers. Includes validator and numpad on touch. + * @author tmickel@mit.edu (Tim Mickel) + */ +'use strict'; + +goog.provide('Blockly.FieldNumber'); + +goog.require('Blockly.FieldTextInput'); +goog.require('goog.math'); +goog.require('goog.userAgent'); + + +/** + * Class for an editable number 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 the accepted text or null to abort + * the change. + * @param {number} precision Precision of the decimal value (negative power of 10). + * @param {number} min Minimum value of the number. + * @param {number} max Maximum value of the number. + * @extends {Blockly.FieldTextInput} + * @constructor + */ +Blockly.FieldNumber = function(text, opt_validator, precision, min, max) { + this.precision_ = precision; + this.min_ = min; + this.max_ = max; + Blockly.FieldNumber.superClass_.constructor.call(this, text, opt_validator); +}; +goog.inherits(Blockly.FieldNumber, Blockly.FieldTextInput); + +/** + * Fixed width of the num-pad drop-down, in px. + * @type {number} + * @const + */ +Blockly.FieldNumber.DROPDOWN_WIDTH = 168; + +/** + * Extra padding to add between the block and the num-pad drop-down, in px. + * @type {number} + * @const + */ +Blockly.FieldNumber.DROPDOWN_Y_PADDING = 8; + +/** + * Buttons for the num-pad, in order from the top left. + * Values are strings of the number or symbol will be added to the field text + * when the button is pressed. + * @type {Array.} + * @const + */ + // Calculator order +Blockly.FieldNumber.NUMPAD_BUTTONS = ['7', '8', '9', '4', '5', '6', '1', '2', '3', '.', '0']; + +/** + * Src for the delete icon to be shown on the num-pad. + * @type {string} + * @const + */ +Blockly.FieldNumber.NUMPAD_DELETE_ICON = 'data:image/svg+xml;utf8,' + + '' + + ''; + +/** + * Currently active field during an edit. + * Used to give a reference to the num-pad button callbacks. + * @type {?FieldNumber} + * @private + */ +Blockly.FieldNumber.activeField_ = null; + +/** + * Sets a new change handler for angle field. + * @param {Function} handler New change handler, or null. + */ +Blockly.FieldNumber.prototype.setValidator = function(handler) { + var wrappedHandler; + if (handler) { + // Wrap the user's change handler together with the number validator. + // This is copied entirely from FieldAngle. + wrappedHandler = function(value) { + var v1 = handler.call(this, value); + var v2; + if (v1 === null) { + v2 = v1; + } else { + if (v1 === undefined) { + v1 = value; + } + v2 = Blockly.FieldNumber.numberValidator.call(this, v1); + if (v2 === undefined) { + v2 = v1; + } + } + return v2 === value ? undefined : v2; + }; + } else { + wrappedHandler = Blockly.FieldNumber.numberValidator; + } + Blockly.FieldNumber.superClass_.setValidator.call(this, wrappedHandler); +}; + +/** + * Show the inline free-text editor on top of the text and the num-pad if appropriate. + * @private + */ +Blockly.FieldNumber.prototype.showEditor_ = function() { + Blockly.FieldNumber.activeField_ = this; + // Do not focus on mobile devices so we can show the num-pad + var showNumPad = + goog.userAgent.MOBILE || goog.userAgent.ANDROID || goog.userAgent.IPAD; + Blockly.FieldNumber.superClass_.showEditor_.call(this, false, showNumPad); + + // Show a numeric keypad in the drop-down on touch + if (showNumPad) { + this.showNumPad_(); + } +}; + +Blockly.FieldNumber.prototype.showNumPad_ = function() { + // If there is an existing drop-down someone else owns, hide it immediately and clear it. + Blockly.DropDownDiv.hideWithoutAnimation(); + Blockly.DropDownDiv.clearContent(); + + var contentDiv = Blockly.DropDownDiv.getContentDiv(); + + // Accessibility properties + contentDiv.setAttribute('role', 'menu'); + contentDiv.setAttribute('aria-haspopup', 'true'); + + // Add numeric keypad buttons + var buttons = Blockly.FieldNumber.NUMPAD_BUTTONS; + for (var i = 0, buttonText; buttonText = buttons[i]; i++) { + var button = document.createElement('button'); + button.setAttribute('role', 'menuitem'); + button.setAttribute('class', 'blocklyNumPadButton'); + button.title = buttonText; + button.innerHTML = buttonText; + // Num-pad only reacts on touch devices + button.ontouchstart = Blockly.FieldNumber.numPadButtonTouch_; + if (buttonText == '.' && this.precision_ == 0) { + // Don't show the decimal point for inputs that must be round numbers + button.setAttribute('style', 'visibility: hidden'); + } + contentDiv.appendChild(button); + } + // Add erase button to the end + var eraseButton = document.createElement('button'); + eraseButton.setAttribute('role', 'menuitem'); + eraseButton.setAttribute('class', 'blocklyNumPadButton'); + eraseButton.title = 'Delete'; + var eraseImage = document.createElement('img'); + eraseImage.src = Blockly.FieldNumber.NUMPAD_DELETE_ICON; + eraseButton.appendChild(eraseImage); + // Num-pad only reacts on touch devices + eraseButton.ontouchstart = Blockly.FieldNumber.numPadEraseButtonTouch_; + contentDiv.appendChild(eraseButton); + + // Set colour and size of drop-down + Blockly.DropDownDiv.setColour(Blockly.Colours.numPadBackground, Blockly.Colours.numPadBorder); + contentDiv.style.width = Blockly.FieldNumber.DROPDOWN_WIDTH + 'px'; + + // Calculate positioning for the drop-down + // sourceBlock_ is the rendered shadow field input box + var scale = this.sourceBlock_.workspace.scale; + var bBox = this.sourceBlock_.getHeightWidth(); + bBox.width *= scale; + bBox.height *= scale; + var position = this.getAbsoluteXY_(); + // If we can fit it, render below the shadow block + var primaryX = position.x + bBox.width / 2; + var primaryY = position.y + bBox.height + Blockly.FieldNumber.DROPDOWN_Y_PADDING; + // If we can't fit it, render above the entire parent block + var secondaryX = primaryX; + var secondaryY = position.y - (Blockly.BlockSvg.MIN_BLOCK_Y * scale) - (Blockly.BlockSvg.FIELD_Y_OFFSET * scale); + + Blockly.DropDownDiv.setBoundsElement(this.sourceBlock_.workspace.getParentSvg().parentNode); + Blockly.DropDownDiv.show(this, primaryX, primaryY, secondaryX, secondaryY, this.onHide_.bind(this)); +}; + +/** + * Call for when a num-pad button is touched. + * Determine what the user is inputting, and update the text field appropriately. + */ +Blockly.FieldNumber.numPadButtonTouch_ = function() { + // String of the button (e.g., '7') + var spliceValue = this.innerHTML; + // Old value of the text field + var oldValue = Blockly.FieldTextInput.htmlInput_.value; + // Determine the selected portion of the text field + var selectionStart = Blockly.FieldTextInput.htmlInput_.selectionStart; + var selectionEnd = Blockly.FieldTextInput.htmlInput_.selectionEnd; + // Splice in the new value + var newValue = oldValue.slice(0, selectionStart) + spliceValue + oldValue.slice(selectionEnd); + // Updates the display. The actual setValue occurs when the field is stopped editing. + Blockly.FieldTextInput.htmlInput_.value = Blockly.FieldTextInput.htmlInput_.defaultValue = newValue; + // Resize and scroll the text field appropriately + Blockly.FieldNumber.superClass_.resizeEditor_.call(Blockly.FieldNumber.activeField_); + Blockly.FieldTextInput.htmlInput_.setSelectionRange(newValue.length, newValue.length); + Blockly.FieldTextInput.htmlInput_.scrollLeft = Blockly.FieldTextInput.htmlInput_.scrollWidth; +}; + +/** + * Call for when the num-pad erase button is touched. + * Determine what the user is asking to erase, and erase it. + */ +Blockly.FieldNumber.numPadEraseButtonTouch_ = function() { + // Old value of the text field + var oldValue = Blockly.FieldTextInput.htmlInput_.value; + // Determine what is selected to erase (if anything) + var selectionStart = Blockly.FieldTextInput.htmlInput_.selectionStart; + var selectionEnd = Blockly.FieldTextInput.htmlInput_.selectionEnd; + // Cut out anything that was previously selected + var newValue = oldValue.slice(0, selectionStart) + oldValue.slice(selectionEnd); + if (selectionEnd - selectionStart == 0) { // Length of selection == 0 + // Delete the last character if nothing was selected + newValue = oldValue.slice(0, selectionStart - 1) + oldValue.slice(selectionStart); + } + // Update the display to show erased value. + Blockly.FieldTextInput.htmlInput_.value = Blockly.FieldTextInput.htmlInput_.defaultValue = newValue; + // Resize and scroll the text field appropriately + Blockly.FieldNumber.superClass_.resizeEditor_.call(Blockly.FieldNumber.activeField_); + Blockly.FieldTextInput.htmlInput_.setSelectionRange(newValue.length, newValue.length); + Blockly.FieldTextInput.htmlInput_.scrollLeft = Blockly.FieldTextInput.htmlInput_.scrollWidth; +}; + +/** + * Callback for when the drop-down is hidden. + */ +Blockly.FieldNumber.prototype.onHide_ = function() { + // Clear accessibility properties + Blockly.DropDownDiv.content_.removeAttribute('role'); + Blockly.DropDownDiv.content_.removeAttribute('aria-haspopup'); +}; + +/** + * Ensure that only a number may be entered with the properties of this field. + * @param {string} text The user's text. + * @return {?string} A string representing a valid angle, or null if invalid. + */ +Blockly.FieldNumber.numberValidator = function(text) { + var n = Blockly.FieldTextInput.numberValidator(text); + if (n !== null) { + // string -> float + n = parseFloat(n); + // Keep within min and max + n = Math.min(Math.max(n, this.min_), this.max_); + // Update float precision (returns a string) + n = n.toFixed(this.precision_); + // Parse to a float and back to string to remove trailing decimals + n = parseFloat(n); + n = String(n); + } + return n; +}; diff --git a/core/field_textinput.js b/core/field_textinput.js index a5cac7ebb8..e89f80c710 100644 --- a/core/field_textinput.js +++ b/core/field_textinput.js @@ -26,8 +26,11 @@ goog.provide('Blockly.FieldTextInput'); +goog.require('Blockly.BlockSvg.render'); +goog.require('Blockly.Colours'); goog.require('Blockly.Field'); goog.require('Blockly.Msg'); +goog.require('Blockly.utils'); goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.userAgent'); @@ -36,23 +39,44 @@ goog.require('goog.userAgent'); /** * Class for an editable text field. * @param {string} text The initial content of the field. - * @param {Function=} opt_changeHandler An optional function that is called + * @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.FieldTextInput = function(text, opt_changeHandler) { - Blockly.FieldTextInput.superClass_.constructor.call(this, text); - this.setChangeHandler(opt_changeHandler); +Blockly.FieldTextInput = function(text, opt_validator) { + Blockly.FieldTextInput.superClass_.constructor.call(this, text, + opt_validator); }; goog.inherits(Blockly.FieldTextInput, Blockly.Field); /** - * Point size of text. Should match blocklyText's font-size in CSS. + * Point size of text before animation. Must match size in CSS. */ -Blockly.FieldTextInput.FONTSIZE = 11; +Blockly.FieldTextInput.FONTSIZE_INITIAL = 12; + +/** + * Point size of text after animation. + */ +Blockly.FieldTextInput.FONTSIZE_FINAL = 14; + +/** + * Length of animations in seconds. + */ +Blockly.FieldTextInput.ANIMATION_TIME = 0.25; + +/** + * Padding to use for text measurement for the field during editing, in px. + */ +Blockly.FieldTextInput.TEXT_MEASURE_PADDING_MAGIC = 45; + +/** + * Numeric field types. + * Scratch-specific property to ensure the border radius is set correctly for these types. + */ +Blockly.FieldTextInput.NUMERIC_FIELD_TYPES = ['math_number', 'math_positive_number', 'math_whole_number']; /** * Mouse cursor style when over the hotspot that initiates the editor. @@ -78,20 +102,19 @@ Blockly.FieldTextInput.prototype.dispose = function() { * @param {?string} text New text. * @override */ -Blockly.FieldTextInput.prototype.setText = function(text) { +Blockly.FieldTextInput.prototype.setValue = function(text) { if (text === null) { - // No change if null. - return; + return; // No change if null. } - if (this.sourceBlock_ && this.changeHandler_) { - var validated = this.changeHandler_(text); + if (this.sourceBlock_ && this.validator_) { + var validated = this.validator_(text); // If the new text is invalid, validation returns null. // In this case we still want to display the illegal result. if (validated !== null && validated !== undefined) { text = validated; } } - Blockly.Field.prototype.setText.call(this, text); + Blockly.Field.prototype.setValue.call(this, text); }; /** @@ -106,35 +129,26 @@ Blockly.FieldTextInput.prototype.setSpellcheck = function(check) { * 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. + * @param {boolean=} opt_readOnly True if editor should be created with HTML + * input set to read-only, to prevent virtual keyboards. * @private */ -Blockly.FieldTextInput.prototype.showEditor_ = function(opt_quietInput) { +Blockly.FieldTextInput.prototype.showEditor_ = function(opt_quietInput, opt_readOnly) { + this.workspace_ = this.sourceBlock_.workspace; var quietInput = opt_quietInput || false; - if (!quietInput && (goog.userAgent.MOBILE || goog.userAgent.ANDROID || - goog.userAgent.IPAD)) { - // Mobile browsers have issues with in-line textareas (focus & keyboards). - var newValue = window.prompt(Blockly.Msg.CHANGE_VALUE_TITLE, this.text_); - if (this.sourceBlock_ && this.changeHandler_) { - var override = this.changeHandler_(newValue); - if (override !== undefined) { - newValue = override; - } - } - if (newValue !== null) { - this.setText(newValue); - } - return; - } - - Blockly.WidgetDiv.show(this, this.sourceBlock_.RTL, this.widgetDispose_()); + var readOnly = opt_readOnly || false; + Blockly.WidgetDiv.show(this, this.sourceBlock_.RTL, + this.widgetDispose_(), this.widgetDisposeAnimationFinished_(), + Blockly.FieldTextInput.ANIMATION_TIME); var div = Blockly.WidgetDiv.DIV; + // Apply text-input-specific fixed CSS + div.className += ' fieldTextInput'; // Create the input. var htmlInput = goog.dom.createDom('input', 'blocklyHtmlInput'); htmlInput.setAttribute('spellcheck', this.spellcheck_); - var fontSize = (Blockly.FieldTextInput.FONTSIZE * - this.sourceBlock_.workspace.scale) + 'pt'; - div.style.fontSize = fontSize; - htmlInput.style.fontSize = fontSize; + if (readOnly) { + htmlInput.setAttribute('readonly', 'true'); + } /** @type {!HTMLInputElement} */ Blockly.FieldTextInput.htmlInput_ = htmlInput; div.appendChild(htmlInput); @@ -146,6 +160,8 @@ Blockly.FieldTextInput.prototype.showEditor_ = function(opt_quietInput) { if (!quietInput) { htmlInput.focus(); htmlInput.select(); + // For iOS only + htmlInput.setSelectionRange(0, 99999); } // Bind to keydown -- trap Enter without IME and Esc to hide. @@ -157,10 +173,19 @@ Blockly.FieldTextInput.prototype.showEditor_ = function(opt_quietInput) { // Bind to keyPress -- repeatedly resize when holding down a key. htmlInput.onKeyPressWrapper_ = Blockly.bindEvent_(htmlInput, 'keypress', this, this.onHtmlInputChange_); - var workspaceSvg = this.sourceBlock_.workspace.getCanvas(); - htmlInput.onWorkspaceChangeWrapper_ = - Blockly.bindEvent_(workspaceSvg, 'blocklyWorkspaceChange', this, - this.resizeEditor_); + htmlInput.onWorkspaceChangeWrapper_ = this.resizeEditor_.bind(this); + this.workspace_.addChangeListener(htmlInput.onWorkspaceChangeWrapper_); + + // Add animation transition properties + div.style.transition = 'padding ' + Blockly.FieldTextInput.ANIMATION_TIME + 's,' + + 'width ' + Blockly.FieldTextInput.ANIMATION_TIME + 's,' + + 'height ' + Blockly.FieldTextInput.ANIMATION_TIME + 's,' + + 'margin-left ' + Blockly.FieldTextInput.ANIMATION_TIME + 's,' + + 'box-shadow ' + Blockly.FieldTextInput.ANIMATION_TIME + 's'; + htmlInput.style.transition = 'font-size ' + Blockly.FieldTextInput.ANIMATION_TIME + 's'; + // The animated properties themselves + htmlInput.style.fontSize = Blockly.FieldTextInput.FONTSIZE_FINAL + 'pt'; + div.style.boxShadow = '0px 0px 0px 4px ' + Blockly.Colours.fieldShadow; }; /** @@ -174,7 +199,7 @@ Blockly.FieldTextInput.prototype.onHtmlInputKeyDown_ = function(e) { if (e.keyCode == enterKey) { Blockly.WidgetDiv.hide(); } else if (e.keyCode == escKey) { - this.setText(htmlInput.defaultValue); + htmlInput.value = htmlInput.defaultValue; Blockly.WidgetDiv.hide(); } else if (e.keyCode == tabKey) { Blockly.WidgetDiv.hide(); @@ -190,21 +215,18 @@ Blockly.FieldTextInput.prototype.onHtmlInputKeyDown_ = function(e) { */ Blockly.FieldTextInput.prototype.onHtmlInputChange_ = function(e) { var htmlInput = Blockly.FieldTextInput.htmlInput_; - var escKey = 27; - if (e.keyCode != escKey) { - // Update source block. - var text = htmlInput.value; - if (text !== htmlInput.oldValue_) { - this.sourceBlock_.setShadow(false); - htmlInput.oldValue_ = text; - this.setText(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(); - } + // 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_(); }; /** @@ -216,8 +238,8 @@ Blockly.FieldTextInput.prototype.validate_ = function() { var valid = true; goog.asserts.assertObject(Blockly.FieldTextInput.htmlInput_); var htmlInput = Blockly.FieldTextInput.htmlInput_; - if (this.sourceBlock_ && this.changeHandler_) { - valid = this.changeHandler_(htmlInput.value); + if (this.sourceBlock_ && this.validator_) { + valid = this.validator_(htmlInput.value); } if (valid === null) { Blockly.addClass_(htmlInput, 'blocklyInvalidInput'); @@ -231,67 +253,136 @@ Blockly.FieldTextInput.prototype.validate_ = function() { * @private */ Blockly.FieldTextInput.prototype.resizeEditor_ = function() { + var scale = this.sourceBlock_.workspace.scale; var div = Blockly.WidgetDiv.DIV; - var bBox = this.fieldGroup_.getBBox(); - div.style.width = bBox.width * this.sourceBlock_.workspace.scale + 'px'; - div.style.height = bBox.height * this.sourceBlock_.workspace.scale + 'px'; + // Resize the box based on the measured width of the text, pre-truncation + var textWidth = Blockly.measureText( + Blockly.FieldTextInput.htmlInput_.style.fontSize, + Blockly.FieldTextInput.htmlInput_.style.fontFamily, + Blockly.FieldTextInput.htmlInput_.style.fontWeight, + Blockly.FieldTextInput.htmlInput_.value + ); + // Size drawn in the canvas needs padding and scaling + textWidth += Blockly.FieldTextInput.TEXT_MEASURE_PADDING_MAGIC; + textWidth *= scale; + // The width must be at least FIELD_WIDTH and at most FIELD_WIDTH_MAX_EDIT + var width = Math.max(textWidth, Blockly.BlockSvg.FIELD_WIDTH_MIN_EDIT * scale); + width = Math.min(width, Blockly.BlockSvg.FIELD_WIDTH_MAX_EDIT * scale); + // Add 1px to width and height to account for border (pre-scale) + div.style.width = (width / scale + 1) + 'px'; + div.style.height = (Blockly.BlockSvg.FIELD_HEIGHT_MAX_EDIT + 1) + 'px'; + div.style.transform = 'scale(' + scale + ')'; + + // Use margin-left to animate repositioning of the box (value is unscaled). + // This is the difference between the default position and the positioning + // after growing the box. + var initialWidth = Blockly.BlockSvg.FIELD_WIDTH * scale; + var finalWidth = width; + div.style.marginLeft = -0.5 * (finalWidth - initialWidth) + 'px'; + + // Add 0.5px to account for slight difference between SVG and CSS border + var borderRadius = this.getBorderRadius() + 0.5; + div.style.borderRadius = borderRadius + 'px'; + // Pull stroke colour from the existing shadow block + var strokeColour = this.sourceBlock_.getColourTertiary(); + div.style.borderColor = strokeColour; + var xy = this.getAbsoluteXY_(); + // Account for border width, post-scale + xy.x -= scale / 2; + xy.y -= scale / 2; // 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 += width; xy.x -= div.offsetWidth; } // Shift by a few pixels to line up exactly. - xy.y += 1; + xy.y += 1 * scale; 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; + xy.x += 2 * scale; + xy.y += 1 * scale; } if (goog.userAgent.WEBKIT) { - xy.y -= 3; + xy.x += 0.5; + xy.y -= 1 * scale; } + // Finally, set the actual style 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. + * Determine border radius based on the type of the owning shadow block. + * @return {Number} Border radius in px. +*/ +Blockly.Field.prototype.getBorderRadius = function() { + if (Blockly.FieldTextInput.NUMERIC_FIELD_TYPES.indexOf(this.sourceBlock_.type) > -1) { + return Blockly.BlockSvg.NUMBER_FIELD_CORNER_RADIUS; + } else { + return Blockly.BlockSvg.TEXT_FIELD_CORNER_RADIUS; + } +}; + +/** + * Close the editor, save the results, and start animating the disposal of elements. * @return {!Function} Closure to call on destruction of the WidgetDiv. * @private */ Blockly.FieldTextInput.prototype.widgetDispose_ = function() { var thisField = this; return function() { + var div = Blockly.WidgetDiv.DIV; var htmlInput = Blockly.FieldTextInput.htmlInput_; // Save the edit (if it validates). var text = htmlInput.value; - if (thisField.sourceBlock_ && thisField.changeHandler_) { - var text1 = thisField.changeHandler_(text); + if (thisField.sourceBlock_ && thisField.validator_) { + var text1 = thisField.validator_(text); if (text1 === null) { // Invalid edit. text = htmlInput.defaultValue; } else if (text1 !== undefined) { - // Change handler has changed the text. + // Validation function has changed the text. text = text1; } } - thisField.setText(text); + thisField.setValue(text); thisField.sourceBlock_.rendered && thisField.sourceBlock_.render(); Blockly.unbindEvent_(htmlInput.onKeyDownWrapper_); Blockly.unbindEvent_(htmlInput.onKeyUpWrapper_); Blockly.unbindEvent_(htmlInput.onKeyPressWrapper_); - Blockly.unbindEvent_(htmlInput.onWorkspaceChangeWrapper_); - Blockly.FieldTextInput.htmlInput_ = null; + thisField.workspace_.removeChangeListener( + htmlInput.onWorkspaceChangeWrapper_); + + // Animation of disposal + htmlInput.style.fontSize = Blockly.FieldTextInput.FONTSIZE_INITIAL + 'pt'; + div.style.boxShadow = ''; + div.style.width = Blockly.BlockSvg.FIELD_WIDTH + 'px'; + div.style.height = Blockly.BlockSvg.FIELD_HEIGHT + 'px'; + div.style.marginLeft = 0; + }; +}; + +/** + * Final disposal of the text field's elements and properties. + * @return {!Function} Closure to call on finish animation of the WidgetDiv. + * @private + */ +Blockly.FieldTextInput.prototype.widgetDisposeAnimationFinished_ = function() { + return function() { // Delete style properties. var style = Blockly.WidgetDiv.DIV.style; style.width = 'auto'; style.height = 'auto'; style.fontSize = ''; + // Reset class + Blockly.WidgetDiv.DIV.className = 'blocklyWidgetDiv'; + // Reset transitions + Blockly.WidgetDiv.DIV.style.transition = ''; + Blockly.FieldTextInput.htmlInput_.style.transition = ''; + Blockly.FieldTextInput.htmlInput_ = null; }; }; diff --git a/core/field_variable.js b/core/field_variable.js index a03cfe6ec3..8e5bac9664 100644 --- a/core/field_variable.js +++ b/core/field_variable.js @@ -36,15 +36,14 @@ goog.require('goog.string'); * Class for a variable's dropdown field. * @param {?string} varname The default name for the variable. If null, * a unique variable name will be generated. - * @param {Function=} opt_changeHandler A function that is executed when a new + * @param {Function=} opt_validator A function that is executed when a new * option is selected. Its sole argument is the new option value. * @extends {Blockly.FieldDropdown} * @constructor */ -Blockly.FieldVariable = function(varname, opt_changeHandler) { +Blockly.FieldVariable = function(varname, opt_validator) { Blockly.FieldVariable.superClass_.constructor.call(this, - Blockly.FieldVariable.dropdownCreate, null); - this.setChangeHandler(opt_changeHandler); + Blockly.FieldVariable.dropdownCreate, opt_validator); this.setValue(varname || ''); }; goog.inherits(Blockly.FieldVariable, Blockly.FieldDropdown); @@ -53,7 +52,7 @@ goog.inherits(Blockly.FieldVariable, Blockly.FieldDropdown); * Sets a new change handler for angle field. * @param {Function} handler New change handler, or null. */ -Blockly.FieldVariable.prototype.setChangeHandler = function(handler) { +Blockly.FieldVariable.prototype.setValidator = function(handler) { var wrappedHandler; if (handler) { // Wrap the user's change handler together with the variable rename handler. @@ -66,7 +65,7 @@ Blockly.FieldVariable.prototype.setChangeHandler = function(handler) { v1 = value; } var v2 = Blockly.FieldVariable.dropdownChange.call(this, v1); - if (v2 !== undefined) { + if (v2 === undefined) { v2 = v1; } } @@ -75,7 +74,7 @@ Blockly.FieldVariable.prototype.setChangeHandler = function(handler) { } else { wrappedHandler = Blockly.FieldVariable.dropdownChange; } - Blockly.FieldVariable.superClass_.setChangeHandler.call(this, wrappedHandler); + Blockly.FieldVariable.superClass_.setValidator.call(this, wrappedHandler); }; /** @@ -83,21 +82,17 @@ Blockly.FieldVariable.prototype.setChangeHandler = function(handler) { * @param {!Blockly.Block} block The block containing this text. */ Blockly.FieldVariable.prototype.init = function(block) { - if (this.sourceBlock_) { + if (this.fieldGroup_) { // Dropdown has already been initialized once. return; } - + Blockly.FieldVariable.superClass_.init.call(this, block); if (!this.getValue()) { // Variables without names get uniquely named for this workspace. - if (block.isInFlyout) { - var workspace = block.workspace.targetWorkspace; - } else { - var workspace = block.workspace; - } + var workspace = + block.isInFlyout ? block.workspace.targetWorkspace : block.workspace; this.setValue(Blockly.Variables.generateUniqueName(workspace)); } - Blockly.FieldVariable.superClass_.init.call(this, block); }; /** @@ -111,11 +106,15 @@ Blockly.FieldVariable.prototype.getValue = function() { /** * Set the variable name. - * @param {string} text New text. + * @param {string} newValue New text. */ -Blockly.FieldVariable.prototype.setValue = function(text) { - this.value_ = text; - this.setText(text); +Blockly.FieldVariable.prototype.setValue = function(newValue) { + if (this.sourceBlock_ && Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Change( + this.sourceBlock_, 'field', this.name, this.value_, newValue)); + } + this.value_ = newValue; + this.setText(newValue); }; /** diff --git a/core/flyout.js b/core/flyout.js index a3b81de1c6..300d863eaf 100644 --- a/core/flyout.js +++ b/core/flyout.js @@ -28,6 +28,7 @@ goog.provide('Blockly.Flyout'); goog.require('Blockly.Block'); goog.require('Blockly.Comment'); +goog.require('Blockly.Events'); goog.require('Blockly.WorkspaceSvg'); goog.require('goog.dom'); goog.require('goog.events'); @@ -43,12 +44,6 @@ goog.require('goog.userAgent'); Blockly.Flyout = function(workspaceOptions) { workspaceOptions.getMetrics = this.getMetrics_.bind(this); workspaceOptions.setMetrics = this.setMetrics_.bind(this); - /** - * @type {!Blockly.Workspace} - * @private - */ - this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); - this.workspace_.isFlyout = true; /** * Is RTL vs LTR. @@ -56,6 +51,25 @@ Blockly.Flyout = function(workspaceOptions) { */ this.RTL = !!workspaceOptions.RTL; + /** + * Flyout should be laid out horizontally vs vertically. + * @type {boolean} + */ + this.horizontalLayout_ = workspaceOptions.horizontalLayout; + + /** + * Position of the toolbox and flyout relative to the workspace. + * @type {number} + */ + this.toolboxPosition_ = workspaceOptions.toolboxPosition; + + /** + * @type {!Blockly.Workspace} + * @private + */ + this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); + this.workspace_.isFlyout = true; + /** * Opaque data that can be passed to Blockly.unbindEvent_. * @type {!Array.} @@ -77,6 +91,13 @@ Blockly.Flyout = function(workspaceOptions) { * @private */ this.listeners_ = []; + + /** + * List of blocks that should always be disabled. + * @type {!Array.} + * @private + */ + this.permanentlyDisabled_ = []; }; /** @@ -90,7 +111,14 @@ Blockly.Flyout.prototype.autoClose = true; * @type {number} * @const */ -Blockly.Flyout.prototype.CORNER_RADIUS = 8; +Blockly.Flyout.prototype.CORNER_RADIUS = 0; + +/** + * Margin of blocks in the flyout. + * @type {number} + * @const + */ +Blockly.Flyout.prototype.BLOCK_MARGIN = 8; /** * Top/bottom padding between scrollbar and edge of flyout background. @@ -113,6 +141,52 @@ Blockly.Flyout.prototype.width_ = 0; */ Blockly.Flyout.prototype.height_ = 0; +/** + * Width of flyout contents. + * @type {number} + * @private + */ +Blockly.Flyout.prototype.contentWidth_ = 0; + +/** + * Height of flyout contents. + * @type {number} + * @private + */ +Blockly.Flyout.prototype.contentHeight_ = 0; + +/** + * Vertical offset of flyout. + * @type {number} + * @private + */ +Blockly.Flyout.prototype.verticalOffset_ = 0; + +/** + * Range of a drag angle from a fixed flyout considered "dragging toward workspace." + * Drags that are within the bounds of this many degrees from the orthogonal + * line to the flyout edge are considered to be "drags toward the workspace." + * Example: + * Flyout Edge Workspace + * [block] / <-within this angle, drags "toward workspace" | + * [block] ---- orthogonal to flyout boundary ---- | + * [block] \ | + * The angle is given in degrees from the orthogonal. + * @type {number} + * @private +*/ +Blockly.Flyout.prototype.dragAngleRange_ = 70; + +/** + * Is the flyout dragging (scrolling)? + * 0 - DRAG_NONE - no drag is ongoing or state is undetermined + * 1 - DRAG_STICKY - still within the sticky drag radius + * 2 - DRAG_FREE - in scroll mode (never create a new block) + * @private + */ +Blockly.Flyout.prototype.dragMode_ = Blockly.DRAG_NONE; + + /** * Creates the flyout's DOM. Only needs to be called once. * @return {!Element} The flyout's SVG group. @@ -141,18 +215,17 @@ Blockly.Flyout.prototype.init = function(targetWorkspace) { this.targetWorkspace_ = targetWorkspace; this.workspace_.targetWorkspace = targetWorkspace; // Add scrollbar. - this.scrollbar_ = new Blockly.Scrollbar(this.workspace_, false, false); + this.scrollbar_ = new Blockly.Scrollbar(this.workspace_, this.horizontalLayout_, false); this.hide(); Array.prototype.push.apply(this.eventWrappers_, Blockly.bindEvent_(this.svgGroup_, 'wheel', this, this.wheel_)); if (!this.autoClose) { - Array.prototype.push.apply(this.eventWrappers_, - Blockly.bindEvent_(this.targetWorkspace_.getCanvas(), - 'blocklyWorkspaceChange', this, this.filterForCapacity_)); + this.filterWrapper_ = this.filterForCapacity_.bind(this); + this.targetWorkspace_.addChangeListener(this.filterWrapper_); } - // Dragging the flyout up and down. + // Dragging the flyout up and down (or left and right). Array.prototype.push.apply(this.eventWrappers_, Blockly.bindEvent_(this.svgGroup_, 'mousedown', this, this.onMouseDown_)); }; @@ -164,6 +237,10 @@ Blockly.Flyout.prototype.init = function(targetWorkspace) { Blockly.Flyout.prototype.dispose = function() { this.hide(); Blockly.unbindEvent_(this.eventWrappers_); + if (this.filterWrapper_) { + this.targetWorkspace_.removeChangeListener(this.filterWrapper_); + this.filterWrapper_ = null; + } if (this.scrollbar_) { this.scrollbar_.dispose(); this.scrollbar_ = null; @@ -187,9 +264,12 @@ Blockly.Flyout.prototype.dispose = function() { * .viewHeight: Height of the visible rectangle, * .viewWidth: Width of the visible rectangle, * .contentHeight: Height of the contents, + * .contentWidth: Width of the contents, * .viewTop: Offset of top edge of visible rectangle from parent, * .contentTop: Offset of the top-most content from the y=0 coordinate, * .absoluteTop: Top-edge of view. + * .viewLeft: Offset of the left edge of visible rectangle from parent, + * .contentLeft: Offset of the left-most content from the x=0 coordinate, * .absoluteLeft: Left-edge of view. * @return {Object} Contains size and position metrics of the flyout. * @private @@ -199,42 +279,75 @@ Blockly.Flyout.prototype.getMetrics_ = function() { // Flyout is hidden. return null; } - var viewHeight = this.height_ - 2 * this.SCROLLBAR_PADDING; - var viewWidth = this.width_; + try { var optionBox = this.workspace_.getCanvas().getBBox(); } catch (e) { // Firefox has trouble with hidden elements (Bug 528969). var optionBox = {height: 0, y: 0}; } - return { + + var absoluteTop = this.verticalOffset_ + this.SCROLLBAR_PADDING + if (this.horizontalLayout_) { + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { + absoluteTop = 0; + } + var viewHeight = this.height_; + var viewWidth = this.width_ - 2 * this.SCROLLBAR_PADDING; + } else { + var viewHeight = this.height_ - 2 * this.SCROLLBAR_PADDING; + var viewWidth = this.width_; + } + + var metrics = { viewHeight: viewHeight, viewWidth: viewWidth, - contentHeight: (optionBox.height + optionBox.y) * this.workspace_.scale, + contentHeight: this.contentHeight_ * this.workspace_.scale, + contentWidth: this.contentWidth_ * this.workspace_.scale, viewTop: -this.workspace_.scrollY, - contentTop: 0, - absoluteTop: this.SCROLLBAR_PADDING, - absoluteLeft: 0 + viewLeft: -this.workspace_.scrollX, + contentTop: optionBox.y, + contentLeft: 0, + absoluteTop: absoluteTop, + absoluteLeft: this.SCROLLBAR_PADDING }; + return metrics; }; /** - * Sets the Y translation of the flyout to match the scrollbars. - * @param {!Object} yRatio Contains a y property which is a float - * between 0 and 1 specifying the degree of scrolling. + * Sets the translation of the flyout to match the scrollbars. + * @param {!Object} xyRatio Contains a y property which is a float + * between 0 and 1 specifying the degree of scrolling and a + * similar x property. * @private */ -Blockly.Flyout.prototype.setMetrics_ = function(yRatio) { +Blockly.Flyout.prototype.setMetrics_ = function(xyRatio) { var metrics = this.getMetrics_(); // This is a fix to an apparent race condition. if (!metrics) { return; } - if (goog.isNumber(yRatio.y)) { + if (!this.horizontalLayout_ && goog.isNumber(xyRatio.y)) { this.workspace_.scrollY = - -metrics.contentHeight * yRatio.y - metrics.contentTop; + -metrics.contentHeight * xyRatio.y - metrics.contentTop; + } else if (this.horizontalLayout_ && goog.isNumber(xyRatio.x)) { + if (this.RTL) { + this.workspace_.scrollX = + -metrics.contentWidth * xyRatio.x + metrics.contentLeft; + } else { + this.workspace_.scrollX = + -metrics.contentWidth * xyRatio.x - metrics.contentLeft; + } } - this.workspace_.translate(0, this.workspace_.scrollY + metrics.absoluteTop); + var translateX = this.horizontalLayout_ && this.RTL ? + metrics.absoluteLeft + metrics.viewWidth - this.workspace_.scrollX : + this.workspace_.scrollX + metrics.absoluteLeft; + this.workspace_.translate(translateX, + this.workspace_.scrollY + metrics.absoluteTop); +}; + +Blockly.Flyout.prototype.setVerticalOffset = function(verticalOffset) { + this.verticalOffset_ = verticalOffset; }; /** @@ -249,47 +362,145 @@ Blockly.Flyout.prototype.position = function() { // Hidden components will return null. return; } - var edgeWidth = this.width_ - this.CORNER_RADIUS; - if (this.RTL) { + var edgeWidth = this.horizontalLayout_ ? metrics.viewWidth : this.width_; + edgeWidth -= this.CORNER_RADIUS; + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT) { edgeWidth *= -1; } - var path = ['M ' + (this.RTL ? this.width_ : 0) + ',0']; - path.push('h', edgeWidth); - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, - this.RTL ? 0 : 1, - this.RTL ? -this.CORNER_RADIUS : this.CORNER_RADIUS, - this.CORNER_RADIUS); - path.push('v', Math.max(0, metrics.viewHeight - this.CORNER_RADIUS * 2)); - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, - this.RTL ? 0 : 1, - this.RTL ? this.CORNER_RADIUS : -this.CORNER_RADIUS, - this.CORNER_RADIUS); - path.push('h', -edgeWidth); - path.push('z'); - this.svgBackground_.setAttribute('d', path.join(' ')); + + this.setBackgroundPath_(edgeWidth, + this.horizontalLayout_ ? this.height_ + this.verticalOffset_ : metrics.viewHeight); var x = metrics.absoluteLeft; - if (this.RTL) { + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT) { x += metrics.viewWidth; x -= this.width_; } + + var y = metrics.absoluteTop; + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { + y += metrics.viewHeight; + y -= this.height_; + } + this.svgGroup_.setAttribute('transform', - 'translate(' + x + ',' + metrics.absoluteTop + ')'); + 'translate(' + x + ',' + y + ')'); - // Record the height for Blockly.Flyout.getMetrics_. - this.height_ = metrics.viewHeight; + // Record the height for Blockly.Flyout.getMetrics_, or width if the layout is + // horizontal. + if (this.horizontalLayout_) { + this.width_ = metrics.viewWidth; + } else { + this.height_ = metrics.viewHeight; + } // Update the scrollbar (if one exists). if (this.scrollbar_) { this.scrollbar_.resize(); } + // The blocks need to be visible in order to be laid out and measured correctly, but we don't + // want the flyout to show up until it's properly sized. + // Opacity is set to zero in show(). + this.svgGroup_.style.opacity = 1; +}; + +/** + * Create and set the path for the visible boundaries of the flyout. + * @param {number} width The width of the flyout, not including the + * rounded corners. + * @param {number} height The height of the flyout, not including + * rounded corners. + * @private + */ +Blockly.Flyout.prototype.setBackgroundPath_ = function(width, height) { + if (this.horizontalLayout_) { + this.setBackgroundPathHorizontal_(width, height); + } else { + this.setBackgroundPathVertical_(width, height); + } }; +/** + * Create and set the path for the visible boundaries of the toolbox in vertical mode. + * @param {number} width The width of the toolbox, not including the + * rounded corners. + * @param {number} height The height of the toolbox, not including + * rounded corners. + * @private + */ +Blockly.Flyout.prototype.setBackgroundPathVertical_ = function(width, height) { + var atRight = this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT; + // Decide whether to start on the left or right. + var path = ['M ' + (atRight ? this.width_ : 0) + ',0']; + // Top. + path.push('h', width); + // Rounded corner. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, + atRight ? 0 : 1, + atRight ? -this.CORNER_RADIUS : this.CORNER_RADIUS, + this.CORNER_RADIUS); + // Side closest to workspace. + path.push('v', Math.max(0, height - this.CORNER_RADIUS * 2)); + // Rounded corner. + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, + atRight ? 0 : 1, + atRight ? this.CORNER_RADIUS : -this.CORNER_RADIUS, + this.CORNER_RADIUS); + // Bottom. + path.push('h', -width); + path.push('z'); + this.svgBackground_.setAttribute('d', path.join(' ')); +}; + +/** + * Create and set the path for the visible boundaries of the toolbox in horizontal mode. + * @param {number} width The width of the toolbox, not including the + * rounded corners. + * @param {number} height The height of the toolbox, not including + * rounded corners. + * @private + */ +Blockly.Flyout.prototype.setBackgroundPathHorizontal_ = function(width, height) { + var atTop = this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP; + // start at top left. + var path = ['M 0,' + (atTop ? 0 : this.CORNER_RADIUS)]; + + if (atTop) { + // top + path.push('h', width + this.CORNER_RADIUS); + // right + path.push('v', height); + // bottom + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + -this.CORNER_RADIUS, this.CORNER_RADIUS); + path.push('h', -1 * (width - this.CORNER_RADIUS)); + // left + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + -this.CORNER_RADIUS, -this.CORNER_RADIUS); + path.push('z'); + } else { + // top + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + this.CORNER_RADIUS, -this.CORNER_RADIUS); + path.push('h', width - this.CORNER_RADIUS); + // right + path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, + this.CORNER_RADIUS, this.CORNER_RADIUS); + path.push('v', height - this.CORNER_RADIUS); + // bottom + path.push('h', -width - this.CORNER_RADIUS); + // left + path.push('z'); + } + this.svgBackground_.setAttribute('d', path.join(' ')); +}; + + /** * Scroll the flyout to the top. */ -Blockly.Flyout.prototype.scrollToTop = function() { - this.scrollbar_.set(0); +Blockly.Flyout.prototype.scrollToStart = function() { + this.scrollbar_.set((this.horizontalLayout_ && this.RTL) ? 1000000000 : 0); }; /** @@ -298,6 +509,10 @@ Blockly.Flyout.prototype.scrollToTop = function() { * @private */ Blockly.Flyout.prototype.wheel_ = function(e) { + // Don't scroll sideways. + if (this.horizontalLayout_) { + return; + } var delta = e.deltaY; if (delta) { if (goog.userAgent.GECKO) { @@ -338,7 +553,7 @@ Blockly.Flyout.prototype.hide = function() { } this.listeners_.length = 0; if (this.reflowWrapper_) { - Blockly.unbindEvent_(this.reflowWrapper_); + this.workspace_.removeChangeListener(this.reflowWrapper_); this.reflowWrapper_ = null; } // Do NOT delete the blocks here. Wait until Flyout.show. @@ -352,18 +567,7 @@ Blockly.Flyout.prototype.hide = function() { */ Blockly.Flyout.prototype.show = function(xmlList) { this.hide(); - // Delete any blocks from a previous showing. - var blocks = this.workspace_.getTopBlocks(false); - for (var i = 0, block; block = blocks[i]; i++) { - if (block.workspace == this.workspace_) { - block.dispose(false, false); - } - } - // Delete any background buttons from a previous showing. - for (var i = 0, rect; rect = this.buttons_[i]; i++) { - goog.dom.removeNode(rect); - } - this.buttons_.length = 0; + this.clearOldBlocks_(); if (xmlList == Blockly.Variables.NAME_TYPE) { // Special category for variables. @@ -375,23 +579,73 @@ Blockly.Flyout.prototype.show = function(xmlList) { Blockly.Procedures.flyoutCategory(this.workspace_.targetWorkspace); } - var margin = this.CORNER_RADIUS; - this.svgGroup_.style.display = 'block'; + var margin = this.BLOCK_MARGIN; // Create the blocks to be shown in this flyout. var blocks = []; var gaps = []; + this.permanentlyDisabled_.length = 0; for (var i = 0, xml; xml = xmlList[i]; i++) { if (xml.tagName && xml.tagName.toUpperCase() == 'BLOCK') { - var block = Blockly.Xml.domToBlock( - /** @type {!Blockly.Workspace} */ (this.workspace_), xml); + var block = Blockly.Xml.domToBlock(xml, this.workspace_); + if (block.disabled) { + // Record blocks that were initially disabled. + // Do not enable these blocks as a result of capacity filtering. + this.permanentlyDisabled_.push(block); + } blocks.push(block); var gap = parseInt(xml.getAttribute('gap'), 10); - gaps.push(gap || margin * 3); + gaps.push(isNaN(gap) ? margin * 3 : gap); + } + } + // The blocks need to be visible in order to be laid out and measured correctly, but we don't + // want the flyout to show up until it's properly sized. + // Opacity is reset at the end of position(). + this.svgGroup_.style.opacity = 0; + this.svgGroup_.style.display = 'block'; + this.layoutBlocks_(blocks, gaps, margin); + + // IE 11 is an incompetant browser that fails to fire mouseout events. + // When the mouse is over the background, deselect all blocks. + var deselectAll = function(e) { + var blocks = this.workspace_.getTopBlocks(false); + for (var i = 0, block; block = blocks[i]; i++) { + block.removeSelect(); } + }; + this.listeners_.push(Blockly.bindEvent_(this.svgBackground_, 'mouseover', + this, deselectAll)); + + if (this.horizontalLayout_) { + this.height_ = 0; + } else { + this.width_ = 0; } + this.reflow(); + + this.filterForCapacity_(); + + // Fire a resize event to update the flyout's scrollbar. + Blockly.svgResize(this.workspace_); + this.reflowWrapper_ = this.reflow.bind(this); + this.workspace_.addChangeListener(this.reflowWrapper_); + +}; - // Lay out the blocks vertically. - var cursorY = margin; +/** + * Lay out the blocks in the flyout. + * @param {!Array.} blocks The blocks to lay out. + * @param {!Array.} gaps The visible gaps between blocks. + * @param {number} margin The margin around the edges of the flyout. + * @private + */ +Blockly.Flyout.prototype.layoutBlocks_ = function(blocks, gaps, margin) { + // Lay out the blocks. + var marginLR = margin / this.workspace_.scale + Blockly.BlockSvg.TAB_WIDTH; + var marginTB = margin; + var contentWidth = 0; + var contentHeight = 0; + var cursorX = marginLR + var cursorY = marginTB; for (var i = 0, block; block = blocks[i]; i++) { var allBlocks = block.getDescendants(); for (var j = 0, child; child = allBlocks[j]; j++) { @@ -400,110 +654,88 @@ Blockly.Flyout.prototype.show = function(xmlList) { // block. child.isInFlyout = true; } - block.render(); var root = block.getSvgRoot(); var blockHW = block.getHeightWidth(); - var x = this.RTL ? 0 : margin / this.workspace_.scale + - Blockly.BlockSvg.TAB_WIDTH; - block.moveBy(x, cursorY); - cursorY += blockHW.height + gaps[i]; + Blockly.Events.disable(); + block.moveBy((this.horizontalLayout_ && this.RTL) ? -cursorX : cursorX, cursorY); + Blockly.Events.enable(); + + // Assuming this is the last block, work out the size of the content + // (including margins) + contentWidth = cursorX + blockHW.width + marginLR; + contentHeight = cursorY + blockHW.height + marginTB; + + if (this.horizontalLayout_) { + cursorX += blockHW.width + gaps[i]; + } else { + cursorY += blockHW.height + gaps[i]; + } // Create an invisible rectangle under the block to act as a button. Just // using the block as a button is poor, since blocks have holes in them. var rect = Blockly.createSvgElement('rect', {'fill-opacity': 0}, null); + rect.tooltip = block; + Blockly.Tooltip.bindMouseEvents(rect); // Add the rectangles under the blocks, so that the blocks' tooltips work. this.workspace_.getCanvas().insertBefore(rect, block.getSvgRoot()); block.flyoutRect_ = rect; this.buttons_[i] = rect; - if (this.autoClose) { - this.listeners_.push(Blockly.bindEvent_(root, 'mousedown', null, - this.createBlockFunc_(block))); - } else { - this.listeners_.push(Blockly.bindEvent_(root, 'mousedown', null, - this.blockMouseDown_(block))); - } - this.listeners_.push(Blockly.bindEvent_(root, 'mouseover', block, - block.addSelect)); - this.listeners_.push(Blockly.bindEvent_(root, 'mouseout', block, - block.removeSelect)); - this.listeners_.push(Blockly.bindEvent_(rect, 'mousedown', null, - this.createBlockFunc_(block))); - this.listeners_.push(Blockly.bindEvent_(rect, 'mouseover', block, - block.addSelect)); - this.listeners_.push(Blockly.bindEvent_(rect, 'mouseout', block, - block.removeSelect)); + this.addBlockListeners_(root, block, rect); } - // IE 11 is an incompetant browser that fails to fire mouseout events. - // When the mouse is over the background, deselect all blocks. - var deselectAll = function(e) { - var blocks = this.workspace_.getTopBlocks(false); - for (var i = 0, block; block = blocks[i]; i++) { - block.removeSelect(); - } - }; - this.listeners_.push(Blockly.bindEvent_(this.svgBackground_, 'mouseover', - this, deselectAll)); - - this.width_ = 0; - this.reflow(); - - this.filterForCapacity_(); - - // Fire a resize event to update the flyout's scrollbar. - Blockly.fireUiEventNow(window, 'resize'); - this.reflowWrapper_ = Blockly.bindEvent_(this.workspace_.getCanvas(), - 'blocklyWorkspaceChange', this, this.reflow); - this.workspace_.fireChangeEvent(); + // Record calculated content size for getMetrics_ + this.contentWidth_ = contentWidth; + this.contentHeight_ = contentHeight; }; /** - * Compute width of flyout. Position button under each block. - * For RTL: Lay out the blocks right-aligned. + * Delete blocks and background buttons from a previous showing of the flyout. + * @private */ -Blockly.Flyout.prototype.reflow = function() { - this.workspace_.scale = this.targetWorkspace_.scale; - var flyoutWidth = 0; - var margin = this.CORNER_RADIUS; +Blockly.Flyout.prototype.clearOldBlocks_ = function() { + // Delete any blocks from a previous showing. var blocks = this.workspace_.getTopBlocks(false); - for (var x = 0, block; block = blocks[x]; x++) { - var width = block.getHeightWidth().width; - if (block.outputConnection) { - width -= Blockly.BlockSvg.TAB_WIDTH; + for (var i = 0, block; block = blocks[i]; i++) { + if (block.workspace == this.workspace_) { + block.dispose(false, false); } - flyoutWidth = Math.max(flyoutWidth, width); } - flyoutWidth += Blockly.BlockSvg.TAB_WIDTH; - flyoutWidth *= this.workspace_.scale; - flyoutWidth += margin * 1.5 + Blockly.Scrollbar.scrollbarThickness; - if (this.width_ != flyoutWidth) { - for (var x = 0, block; block = blocks[x]; x++) { - var blockHW = block.getHeightWidth(); - if (this.RTL) { - // With the flyoutWidth known, right-align the blocks. - var oldX = block.getRelativeToSurfaceXY().x; - var dx = flyoutWidth - margin; - dx /= this.workspace_.scale; - dx -= Blockly.BlockSvg.TAB_WIDTH; - block.moveBy(dx - oldX, 0); - } - if (block.flyoutRect_) { - block.flyoutRect_.setAttribute('width', blockHW.width); - block.flyoutRect_.setAttribute('height', blockHW.height); - // Blocks with output tabs are shifted a bit. - var tab = block.outputConnection ? Blockly.BlockSvg.TAB_WIDTH : 0; - var blockXY = block.getRelativeToSurfaceXY(); - block.flyoutRect_.setAttribute('x', - this.RTL ? blockXY.x - blockHW.width + tab : blockXY.x - tab); - block.flyoutRect_.setAttribute('y', blockXY.y); - } - } - // Record the width for .getMetrics_ and .position. - this.width_ = flyoutWidth; - // Fire a resize event to update the flyout's scrollbar. - Blockly.fireUiEvent(window, 'resize'); + // Delete any background buttons from a previous showing. + for (var j = 0, rect; rect = this.buttons_[j]; j++) { + goog.dom.removeNode(rect); + } + this.buttons_.length = 0; +}; + +/** + * Add listeners to a block that has been added to the flyout. + * @param {Element} root The root node of the SVG group the block is in. + * @param {!Blockly.Block} block The block to add listeners for. + * @param {!Element} rect The invisible rectangle under the block that acts as + * a button for that block. + * @private + */ +Blockly.Flyout.prototype.addBlockListeners_ = function(root, block, rect) { + if (this.autoClose) { + this.listeners_.push(Blockly.bindEvent_(root, 'mousedown', null, + this.createBlockFunc_(block))); + this.listeners_.push(Blockly.bindEvent_(rect, 'mousedown', null, + this.createBlockFunc_(block))); + } else { + this.listeners_.push(Blockly.bindEvent_(root, 'mousedown', null, + this.blockMouseDown_(block))); + this.listeners_.push(Blockly.bindEvent_(rect, 'mousedown', null, + this.blockMouseDown_(block))); } + this.listeners_.push(Blockly.bindEvent_(root, 'mouseover', block, + block.addSelect)); + this.listeners_.push(Blockly.bindEvent_(root, 'mouseout', block, + block.removeSelect)); + this.listeners_.push(Blockly.bindEvent_(rect, 'mouseover', block, + block.addSelect)); + this.listeners_.push(Blockly.bindEvent_(rect, 'mouseout', block, + block.removeSelect)); }; /** @@ -515,21 +747,25 @@ Blockly.Flyout.prototype.reflow = function() { Blockly.Flyout.prototype.blockMouseDown_ = function(block) { var flyout = this; return function(e) { + flyout.dragMode_ = Blockly.DRAG_NONE; Blockly.terminateDrag_(); + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); Blockly.hideChaff(); if (Blockly.isRightButton(e)) { // Right-click. block.showContextMenu_(e); } else { // Left-click (or middle click) - Blockly.removeAllRanges(); Blockly.Css.setCursor(Blockly.Css.Cursor.CLOSED); // Record the current mouse position. + flyout.startDragMouseY_ = e.clientY; + flyout.startDragMouseX_ = e.clientX; Blockly.Flyout.startDownEvent_ = e; Blockly.Flyout.startBlock_ = block; Blockly.Flyout.startFlyout_ = flyout; Blockly.Flyout.onMouseUpWrapper_ = Blockly.bindEvent_(document, - 'mouseup', this, Blockly.terminateDrag_); + 'mouseup', this, flyout.onMouseUp_); Blockly.Flyout.onMouseMoveBlockWrapper_ = Blockly.bindEvent_(document, 'mousemove', this, flyout.onMouseMoveBlock_); } @@ -539,17 +775,21 @@ Blockly.Flyout.prototype.blockMouseDown_ = function(block) { }; /** - * Mouse down on the flyout background. Start a vertical scroll drag. + * Mouse down on the flyout background. Start a scroll drag. * @param {!Event} e Mouse down event. * @private */ Blockly.Flyout.prototype.onMouseDown_ = function(e) { + this.dragMode_ = Blockly.DRAG_FREE; if (Blockly.isRightButton(e)) { return; } + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); Blockly.hideChaff(true); Blockly.Flyout.terminateDrag_(); this.startDragMouseY_ = e.clientY; + this.startDragMouseX_ = e.clientX; Blockly.Flyout.onMouseMoveWrapper_ = Blockly.bindEvent_(document, 'mousemove', this, this.onMouseMove_); Blockly.Flyout.onMouseUpWrapper_ = Blockly.bindEvent_(document, 'mouseup', @@ -559,19 +799,46 @@ Blockly.Flyout.prototype.onMouseDown_ = function(e) { e.stopPropagation(); }; +/** + * Handle a mouse-up anywhere in the SVG pane. Is only registered when a + * block is clicked. We can't use mouseUp on the block since a fast-moving + * cursor can briefly escape the block before it catches up. + * @param {!Event} e Mouse up event. + * @private + */ +Blockly.Flyout.prototype.onMouseUp_ = function(e) { + if (Blockly.dragMode_ != Blockly.DRAG_FREE && + !Blockly.WidgetDiv.isVisible()) { + Blockly.Events.fire( + new Blockly.Events.Ui(Blockly.Flyout.startBlock_, 'click', + undefined, undefined)); + } + Blockly.terminateDrag_(); +}; + /** * Handle a mouse-move to vertically drag the flyout. * @param {!Event} e Mouse move event. * @private */ Blockly.Flyout.prototype.onMouseMove_ = function(e) { - var dy = e.clientY - this.startDragMouseY_; - this.startDragMouseY_ = e.clientY; - var metrics = this.getMetrics_(); - var y = metrics.viewTop - dy; - y = Math.min(y, metrics.contentHeight - metrics.viewHeight); - y = Math.max(y, 0); - this.scrollbar_.set(y); + if (this.horizontalLayout_) { + var dx = e.clientX - this.startDragMouseX_; + this.startDragMouseX_ = e.clientX; + var metrics = this.getMetrics_(); + var x = metrics.viewLeft - dx; + x = Math.min(x, metrics.contentWidth - metrics.viewWidth); + x = Math.max(x, 0); + this.scrollbar_.set(x); + } else { + var dy = e.clientY - this.startDragMouseY_; + this.startDragMouseY_ = e.clientY; + var metrics = this.getMetrics_(); + var y = metrics.viewTop - dy; + y = Math.min(y, metrics.contentHeight - metrics.viewHeight); + y = Math.max(y, 0); + this.scrollbar_.set(y); + } }; /** @@ -592,15 +859,91 @@ Blockly.Flyout.prototype.onMouseMoveBlock_ = function(e) { e.stopPropagation(); return; } - Blockly.removeAllRanges(); var dx = e.clientX - Blockly.Flyout.startDownEvent_.clientX; var dy = e.clientY - Blockly.Flyout.startDownEvent_.clientY; - // Still dragging within the sticky DRAG_RADIUS. - if (Math.sqrt(dx * dx + dy * dy) > Blockly.DRAG_RADIUS) { - // Create the block. + + var createBlock = Blockly.Flyout.startFlyout_.determineDragIntention_(dx, dy); + if (createBlock) { Blockly.Flyout.startFlyout_.createBlockFunc_(Blockly.Flyout.startBlock_)( Blockly.Flyout.startDownEvent_); + } else if (Blockly.Flyout.startFlyout_.dragMode_ == Blockly.DRAG_FREE) { + // Do a scroll + Blockly.Flyout.startFlyout_.onMouseMove_(e); + } + e.stopPropagation(); +}; + +/** + * Determine the intention of a drag. + * Updates dragMode_ based on a drag delta and the current mode, + * and returns true if we should create a new block. + * @param {number} dx X delta of the drag + * @param {number} dy Y delta of the drag + * @return {boolean} True if a new block should be created. + */ +Blockly.Flyout.prototype.determineDragIntention_ = function(dx, dy) { + if (this.dragMode_ == Blockly.DRAG_FREE) { + // Once in free mode, always stay in free mode and never create a block. + return false; + } + var dragDistance = Math.sqrt(dx * dx + dy * dy); + if (dragDistance < Blockly.DRAG_RADIUS) { + // Still within the sticky drag radius + this.dragMode_ = Blockly.DRAG_STICKY; + return false; + } else { + if (this.isDragTowardWorkspace_(dx, dy)) { + // Immediately create a block + return true; + } else { + // Immediately move to free mode - the drag is away from the workspace. + this.dragMode_ = Blockly.DRAG_FREE; + return false; + } + } +}; + +/** + * Determine if a drag delta is toward the workspace, based on the position + * and orientation of the flyout. This is used in onMouseMoveBlock_ to determine + * if a new block should be created or if the flyout should scroll. + * @param {number} dx X delta of the drag + * @param {number} dy Y delta of the drag + * @return {boolean} true if the drag is toward the workspace. + * @private + */ +Blockly.Flyout.prototype.isDragTowardWorkspace_ = function(dx, dy) { + // Direction goes from -180 to 180, with 0 toward the right and 90 on top. + var dragDirection = Math.atan2(dy, dx) / Math.PI * 180; + + var draggingTowardWorkspace = false; + var range = Blockly.Flyout.startFlyout_.dragAngleRange_; + if (Blockly.Flyout.startFlyout_.horizontalLayout_) { + if (Blockly.Flyout.startFlyout_.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + // Horizontal at top + if (dragDirection < 90 + range && dragDirection > 90 - range ) { + draggingTowardWorkspace = true; + } + } else { + // Horizontal at bottom + if (dragDirection > -90 - range && dragDirection < -90 + range) { + draggingTowardWorkspace = true; + } + } + } else { + if (Blockly.Flyout.startFlyout_.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + // Vertical at left + if (dragDirection < range && dragDirection > -range) { + draggingTowardWorkspace = true; + } + } else { + // Vertical at right + if (dragDirection < -180 + range || dragDirection > 180 - range) { + draggingTowardWorkspace = true; + } + } } + return draggingTowardWorkspace; }; /** @@ -613,6 +956,9 @@ Blockly.Flyout.prototype.createBlockFunc_ = function(originBlock) { var flyout = this; var workspace = this.targetWorkspace_; return function(e) { + // Hide drop-downs and animating WidgetDiv immediately + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); if (Blockly.isRightButton(e)) { // Right-click. Don't create a block, let the context menu show. return; @@ -621,37 +967,13 @@ Blockly.Flyout.prototype.createBlockFunc_ = function(originBlock) { // Beyond capacity. return; } - // Create the new block by cloning the block in the flyout (via XML). - var xml = Blockly.Xml.blockToDom_(originBlock); - var block = Blockly.Xml.domToBlock(workspace, xml); - // Place it in the same spot as the flyout copy. - var svgRootOld = originBlock.getSvgRoot(); - if (!svgRootOld) { - throw 'originBlock is not rendered.'; - } - var xyOld = Blockly.getSvgXY_(svgRootOld, workspace); - // Scale the scroll (getSvgXY_ did not do this). - if (flyout.RTL) { - var width = workspace.getMetrics().viewWidth - flyout.width_; - xyOld.x += width / workspace.scale - width; - } else { - xyOld.x += flyout.workspace_.scrollX / flyout.workspace_.scale - - flyout.workspace_.scrollX; + Blockly.Events.disable(); + var block = flyout.placeNewBlock_(originBlock, workspace); + Blockly.Events.enable(); + if (Blockly.Events.isEnabled()) { + Blockly.Events.setGroup(true); + Blockly.Events.fire(new Blockly.Events.Create(block)); } - xyOld.y += flyout.workspace_.scrollY / flyout.workspace_.scale - - flyout.workspace_.scrollY; - var svgRootNew = block.getSvgRoot(); - if (!svgRootNew) { - throw 'block is not rendered.'; - } - var xyNew = Blockly.getSvgXY_(svgRootNew, workspace); - // Scale the scroll (getSvgXY_ did not do this). - xyNew.x += workspace.scrollX / workspace.scale - workspace.scrollX; - xyNew.y += workspace.scrollY / workspace.scale - workspace.scrollY; - if (workspace.toolbox_ && !workspace.scrollbar) { - xyNew.x += workspace.toolbox_.width / workspace.scale; - } - block.moveBy(xyOld.x - xyNew.x, xyOld.y - xyNew.y); if (flyout.autoClose) { flyout.hide(); } else { @@ -659,43 +981,135 @@ Blockly.Flyout.prototype.createBlockFunc_ = function(originBlock) { } // Start a dragging operation on the new block. block.onMouseDown_(e); + Blockly.dragMode_ = Blockly.DRAG_FREE; + block.setDragging_(true); + block.moveToDragSurface_(); }; }; +/** + * Copy a block from the flyout to the workspace and position it correctly. + * @param {!Blockly.Block} originBlock The flyout block to copy. + * @param {!Blockly.Workspace} workspace The main workspace. + * @return {!Blockly.Block} The new block in the main workspace. + * @private + */ +Blockly.Flyout.prototype.placeNewBlock_ = function(originBlock, workspace) { + var blockSvgOld = originBlock.getSvgRoot(); + if (!blockSvgOld) { + throw 'originBlock is not rendered.'; + } + // Figure out where the original block is on the screen, relative to the upper + // left corner of the main workspace. + var xyOld = Blockly.getSvgXY_(blockSvgOld, workspace); + // Take into account that the flyout might have been scrolled horizontally + // (separately from the main workspace). + // Generally a no-op in vertical mode but likely to happen in horizontal + // mode. + var scrollX = this.workspace_.scrollX; + var scale = this.workspace_.scale; + xyOld.x += scrollX / scale - scrollX; + // If the flyout is on the right side, (0, 0) in the flyout is offset to + // the right of (0, 0) in the main workspace. Offset to take that into + // account. + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT) { + scrollX = workspace.getMetrics().viewWidth - this.width_; + scale = workspace.scale; + // Scale the scroll (getSvgXY_ did not do this). + xyOld.x += scrollX / scale - scrollX; + } + + // Take into account that the flyout might have been scrolled vertically + // (separately from the main workspace). + // Generally a no-op in horizontal mode but likely to happen in vertical + // mode. + var scrollY = this.workspace_.scrollY; + scale = this.workspace_.scale; + xyOld.y += scrollY / scale - scrollY; + // If the flyout is on the bottom, (0, 0) in the flyout is offset to be below + // (0, 0) in the main workspace. Offset to take that into account. + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { + scrollY = workspace.getMetrics().viewHeight - this.height_; + scale = workspace.scale; + xyOld.y += scrollY / scale - scrollY; + } + + // Create the new block by cloning the block in the flyout (via XML). + var xml = Blockly.Xml.blockToDom(originBlock); + var block = Blockly.Xml.domToBlock(xml, workspace); + var blockSvgNew = block.getSvgRoot(); + if (!blockSvgNew) { + throw 'block is not rendered.'; + } + // Figure out where the new block got placed on the screen, relative to the + // upper left corner of the workspace. This may not be the same as the + // original block because the flyout's origin may not be the same as the + // main workspace's origin. + var xyNew = Blockly.getSvgXY_(blockSvgNew, workspace); + // Scale the scroll (getSvgXY_ did not do this). + xyNew.x += workspace.scrollX / workspace.scale - workspace.scrollX; + xyNew.y += workspace.scrollY / workspace.scale - workspace.scrollY; + // If the flyout is collapsible and the workspace can't be scrolled. + if (workspace.toolbox_ && !workspace.scrollbar) { + xyNew.x += workspace.toolbox_.width / workspace.scale; + xyNew.y += workspace.toolbox_.height / workspace.scale; + } + + // Move the new block to where the old block is. + block.moveBy(xyOld.x - xyNew.x, xyOld.y - xyNew.y); + return block; +}; + /** * Filter the blocks on the flyout to disable the ones that are above the * capacity limit. * @private */ Blockly.Flyout.prototype.filterForCapacity_ = function() { + var filtered = false; var remainingCapacity = this.targetWorkspace_.remainingCapacity(); var blocks = this.workspace_.getTopBlocks(false); for (var i = 0, block; block = blocks[i]; i++) { - var allBlocks = block.getDescendants(); - if (allBlocks.length > remainingCapacity) { - block.setDisabled(true); + if (this.permanentlyDisabled_.indexOf(block) == -1) { + var allBlocks = block.getDescendants(); + block.setDisabled(allBlocks.length > remainingCapacity); + filtered = true; } } + if (filtered) { + // Top-most block. Fire an event to allow scrollbars to resize. + Blockly.asyncSvgResize(this.workspace); + } }; /** - * Return the deletion rectangle for this flyout. + * Return the deletion rectangle for this flyout in viewport coordinates. * @return {goog.math.Rect} Rectangle in which to delete. */ -Blockly.Flyout.prototype.getRect = function() { +Blockly.Flyout.prototype.getClientRect = function() { + var flyoutRect = this.svgGroup_.getBoundingClientRect(); // BIG_NUM is offscreen padding so that blocks dragged beyond the shown flyout // area are still deleted. Must be larger than the largest screen size, // but be smaller than half Number.MAX_SAFE_INTEGER (not available on IE). var BIG_NUM = 1000000000; - var mainWorkspace = Blockly.mainWorkspace; - var x = Blockly.getSvgXY_(this.svgGroup_, mainWorkspace).x; - if (!this.RTL) { - x -= BIG_NUM; + var x = flyoutRect.left; + var y = flyoutRect.top; + var width = flyoutRect.width; + var height = flyoutRect.height; + + if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + return new goog.math.Rect(-BIG_NUM, y - BIG_NUM, BIG_NUM * 2, + BIG_NUM + height); + } else if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { + return new goog.math.Rect(-BIG_NUM, y + this.verticalOffset_, BIG_NUM * 2, + BIG_NUM + height); + } else if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + return new goog.math.Rect(x - BIG_NUM, -BIG_NUM, BIG_NUM + width, + BIG_NUM * 2); + } else { // Right + return new goog.math.Rect(x, -BIG_NUM, BIG_NUM + width, + BIG_NUM * 2); } - // Fix scale if nested in zoomed workspace. - var scale = this.targetWorkspace_ == mainWorkspace ? 1 : mainWorkspace.scale; - return new goog.math.Rect(x, -BIG_NUM, - BIG_NUM + this.width_ * scale, BIG_NUM * 2); }; /** @@ -723,3 +1137,97 @@ Blockly.Flyout.terminateDrag_ = function() { Blockly.Flyout.startBlock_ = null; Blockly.Flyout.startFlyout_ = null; }; + +/** + * Compute height of flyout. Position button under each block. + * For RTL: Lay out the blocks right-aligned. + */ +Blockly.Flyout.prototype.reflowHorizontal = function() { + this.workspace_.scale = this.targetWorkspace_.scale; + var flyoutHeight = 0; + var margin = this.BLOCK_MARGIN; + var blocks = this.workspace_.getTopBlocks(false); + for (var x = 0, block; block = blocks[x]; x++) { + var height = block.getHeightWidth().height; + flyoutHeight = Math.max(flyoutHeight, height); + } + flyoutHeight *= this.workspace_.scale; + flyoutHeight += margin * 1.5 + Blockly.Scrollbar.scrollbarThickness; + if (this.height_ != flyoutHeight) { + for (var x = 0, block; block = blocks[x]; x++) { + var blockHW = block.getHeightWidth(); + if (block.flyoutRect_) { + block.flyoutRect_.setAttribute('width', blockHW.width); + block.flyoutRect_.setAttribute('height', blockHW.height); + // Blocks with output tabs are shifted a bit. + var tab = block.outputConnection ? Blockly.BlockSvg.TAB_WIDTH : 0; + var blockXY = block.getRelativeToSurfaceXY(); + block.flyoutRect_.setAttribute('y', blockXY.y); + block.flyoutRect_.setAttribute('x', + this.RTL ? blockXY.x - blockHW.width + tab : blockXY.x - tab); + } + } + // Record the width for .getMetrics_ and .position. + this.height_ = flyoutHeight; + // Top-most block. Fire an event to allow scrollbars to resize. + Blockly.asyncSvgResize(this.workspace); + } +}; + +/** + * Compute width of flyout. Position button under each block. + * For RTL: Lay out the blocks right-aligned. + */ +Blockly.Flyout.prototype.reflowVertical = function() { + this.workspace_.scale = this.targetWorkspace_.scale; + var flyoutWidth = 0; + var margin = this.BLOCK_MARGIN; + var blocks = this.workspace_.getTopBlocks(false); + for (var x = 0, block; block = blocks[x]; x++) { + var width = block.getHeightWidth().width; + if (block.outputConnection) { + width -= Blockly.BlockSvg.TAB_WIDTH; + } + flyoutWidth = Math.max(flyoutWidth, width); + } + flyoutWidth += Blockly.BlockSvg.TAB_WIDTH; + flyoutWidth *= this.workspace_.scale; + flyoutWidth += margin * 1.5 + Blockly.Scrollbar.scrollbarThickness; + if (this.width_ != flyoutWidth) { + for (var x = 0, block; block = blocks[x]; x++) { + var blockHW = block.getHeightWidth(); + if (this.RTL) { + // With the flyoutWidth known, right-align the blocks. + var oldX = block.getRelativeToSurfaceXY().x; + var dx = flyoutWidth - margin; + dx /= this.workspace_.scale; + dx -= Blockly.BlockSvg.TAB_WIDTH; + block.moveBy(dx - oldX, 0); + } + if (block.flyoutRect_) { + block.flyoutRect_.setAttribute('width', blockHW.width); + block.flyoutRect_.setAttribute('height', blockHW.height); + // Blocks with output tabs are shifted a bit. + var tab = block.outputConnection ? Blockly.BlockSvg.TAB_WIDTH : 0; + var blockXY = block.getRelativeToSurfaceXY(); + block.flyoutRect_.setAttribute('x', + this.RTL ? blockXY.x - blockHW.width + tab : blockXY.x - tab); + block.flyoutRect_.setAttribute('y', blockXY.y); + } + } + // Record the width for .getMetrics_ and .position. + this.width_ = flyoutWidth; + // Top-most block. Fire an event to allow scrollbars to resize. + Blockly.asyncSvgResize(this.workspace); + } +}; + +Blockly.Flyout.prototype.reflow = function() { + Blockly.Events.disable(); + if (this.horizontalLayout_) { + this.reflowHorizontal(); + } else { + this.reflowVertical(); + } + Blockly.Events.enable(); +}; diff --git a/core/generator.js b/core/generator.js index 082101b402..48378cd468 100644 --- a/core/generator.js +++ b/core/generator.js @@ -63,6 +63,13 @@ Blockly.Generator.prototype.INFINITE_LOOP_TRAP = null; */ Blockly.Generator.prototype.STATEMENT_PREFIX = null; +/** + * The method of indenting. Defaults to two spaces, but language generators + * may override this to increase indent or change to tabs. + * @type {string} + */ +Blockly.Generator.prototype.INDENT = ' '; + /** * Generate code for all blocks in the workspace to the specified language. * @param {Blockly.Workspace} workspace Workspace to generate code from. @@ -163,6 +170,8 @@ Blockly.Generator.prototype.blockToCode = function(block) { var code = func.call(block, block); if (goog.isArray(code)) { // Value blocks return tuples of code and operator order. + goog.asserts.assert(block.outputConnection, + 'Expecting string from statement block "%s".', block.type); return [this.scrub_(block, code[0]), code[1]]; } else if (goog.isString(code)) { if (this.STATEMENT_PREFIX) { @@ -265,13 +274,6 @@ Blockly.Generator.prototype.addLoopTrap = function(branch, id) { return branch; }; -/** - * The method of indenting. Defaults to two spaces, but language generators - * may override this to increase indent or change to tabs. - * @type {string} - */ -Blockly.Generator.prototype.INDENT = ' '; - /** * Comma-separated list of reserved words. * @type {string} @@ -310,7 +312,7 @@ Blockly.Generator.prototype.FUNCTION_NAME_PLACEHOLDER_ = '{leCUI8hutHZI4480Dc}'; * The code gets output when Blockly.Generator.finish() is called. * * @param {string} desiredName The desired name of the function (e.g., isPrime). - * @param {!Array.} code A list of Python statements. + * @param {!Array.} code A list of statements. Use ' ' for indents. * @return {string} The actual name of the new function. This may differ * from desiredName if the former has already been taken by the user. * @private @@ -320,8 +322,15 @@ Blockly.Generator.prototype.provideFunction_ = function(desiredName, code) { var functionName = this.variableDB_.getDistinctName(desiredName, this.NAME_TYPE); this.functionNames_[desiredName] = functionName; - this.definitions_[desiredName] = code.join('\n').replace( + var codeText = code.join('\n').replace( this.FUNCTION_NAME_PLACEHOLDER_REGEXP_, functionName); + // Change all ' ' indents into the desired indent. + var oldCodeText; + while (oldCodeText != codeText) { + oldCodeText = codeText; + codeText = codeText.replace(/^(( )*) /gm, '$1' + this.INDENT); + } + this.definitions_[desiredName] = codeText; } return this.functionNames_[desiredName]; }; diff --git a/core/icon.js b/core/icon.js index d9d041dc75..9d2cbeaad9 100644 --- a/core/icon.js +++ b/core/icon.js @@ -27,6 +27,7 @@ goog.provide('Blockly.Icon'); goog.require('goog.dom'); +goog.require('goog.math.Coordinate'); /** @@ -56,16 +57,11 @@ Blockly.Icon.prototype.SIZE = 17; Blockly.Icon.prototype.bubble_ = null; /** - * Absolute X coordinate of icon's center. + * Absolute coordinate of icon's center. + * @type {goog.math.Coordinate} * @private */ -Blockly.Icon.prototype.iconX_ = 0; - -/** - * Absolute Y coordinate of icon's centre. - * @private - */ -Blockly.Icon.prototype.iconY_ = 0; +Blockly.Icon.prototype.iconXY_ = null; /** * Create the icon on the block. @@ -128,7 +124,7 @@ Blockly.Icon.prototype.isVisible = function() { * @private */ Blockly.Icon.prototype.iconClick_ = function(e) { - if (Blockly.dragMode_ == 2) { + if (Blockly.dragMode_ == Blockly.DRAG_FREE) { // Drag operation is concluding. Don't open the editor. return; } @@ -176,14 +172,12 @@ Blockly.Icon.prototype.renderIcon = function(cursorX) { /** * Notification that the icon has moved. Update the arrow accordingly. - * @param {number} x Absolute horizontal location. - * @param {number} y Absolute vertical location. + * @param {!goog.math.Coordinate} xy Absolute location. */ -Blockly.Icon.prototype.setIconLocation = function(x, y) { - this.iconX_ = x; - this.iconY_ = y; +Blockly.Icon.prototype.setIconLocation = function(xy) { + this.iconXY_ = xy; if (this.isVisible()) { - this.bubble_.setAnchorLocation(x, y); + this.bubble_.setAnchorLocation(xy); } }; @@ -195,17 +189,18 @@ Blockly.Icon.prototype.computeIconLocation = function() { // Find coordinates for the centre of the icon and update the arrow. var blockXY = this.block_.getRelativeToSurfaceXY(); var iconXY = Blockly.getRelativeXY_(this.iconGroup_); - var newX = blockXY.x + iconXY.x + this.SIZE / 2; - var newY = blockXY.y + iconXY.y + this.SIZE / 2; - if (newX !== this.iconX_ || newY !== this.iconY_) { - this.setIconLocation(newX, newY); + var newXY = new goog.math.Coordinate( + blockXY.x + iconXY.x + this.SIZE / 2, + blockXY.y + iconXY.y + this.SIZE / 2); + if (!goog.math.Coordinate.equals(this.getIconLocation(), newXY)) { + this.setIconLocation(newXY); } }; /** * Returns the center of the block's icon relative to the surface. - * @return {!Object} Object with x and y properties. + * @return {!goog.math.Coordinate} Object with x and y properties. */ Blockly.Icon.prototype.getIconLocation = function() { - return {x: this.iconX_, y: this.iconY_}; + return this.iconXY_; }; diff --git a/core/inject.js b/core/inject.js index 6c807cfff2..71fde36177 100644 --- a/core/inject.js +++ b/core/inject.js @@ -27,192 +27,59 @@ goog.provide('Blockly.inject'); goog.require('Blockly.Css'); +goog.require('Blockly.Options'); goog.require('Blockly.WorkspaceSvg'); +goog.require('Blockly.DragSurfaceSvg'); +goog.require('Blockly.DropDownDiv'); goog.require('goog.dom'); goog.require('goog.ui.Component'); goog.require('goog.userAgent'); +/** + * Radius of stack glow, in px. + * @type {number} + * @const + */ +Blockly.STACK_GLOW_RADIUS = 1; /** * Inject a Blockly editor into the specified container element (usually a div). - * @param {!Element|string} container Containing element or its ID. + * @param {!Element|string} container Containing element, or its ID, + * or a CSS selector. * @param {Object=} opt_options Optional dictionary of options. * @return {!Blockly.Workspace} Newly created main workspace. */ Blockly.inject = function(container, opt_options) { if (goog.isString(container)) { - container = document.getElementById(container); + container = document.getElementById(container) || + document.querySelector(container); } // Verify that the container is in document. if (!goog.dom.contains(document, container)) { throw 'Error: container is not in current document.'; } - var options = Blockly.parseOptions_(opt_options || {}); - var svg = Blockly.createDom_(container, options); - var workspace = Blockly.createMainWorkspace_(svg, options); + var options = new Blockly.Options(opt_options || {}); + + // Add the relative wrapper. This is for positioning the drag surface exactly + // on top of the blockly SVG. Without this, top positioning of the drag surface + // is always off by a few pixels. + var relativeWrapper = goog.dom.createDom('div', 'blocklyRelativeWrapper'); + container.appendChild(relativeWrapper); + + var svg = Blockly.createDom_(relativeWrapper, options); + var dragSurface = new Blockly.DragSurfaceSvg(relativeWrapper); + dragSurface.createDom(); + var workspace = Blockly.createMainWorkspace_(svg, options, dragSurface); Blockly.init_(workspace); workspace.markFocused(); Blockly.bindEvent_(svg, 'focus', workspace, workspace.markFocused); return workspace; }; -/** - * Parse the provided toolbox tree into a consistent DOM format. - * @param {Node|string} tree DOM tree of blocks, or text representation of same. - * @return {Node} DOM tree of blocks, or null. - * @private - */ -Blockly.parseToolboxTree_ = function(tree) { - if (tree) { - if (typeof tree != 'string') { - if (typeof XSLTProcessor == 'undefined' && tree.outerHTML) { - // In this case the tree will not have been properly built by the - // browser. The HTML will be contained in the element, but it will - // not have the proper DOM structure since the browser doesn't support - // XSLTProcessor (XML -> HTML). This is the case in IE 9+. - tree = tree.outerHTML; - } else if (!(tree instanceof Element)) { - tree = null; - } - } - if (typeof tree == 'string') { - tree = Blockly.Xml.textToDom(tree); - } - } else { - tree = null; - } - return tree; -}; - -/** - * Configure Blockly to behave according to a set of options. - * @param {!Object} options Dictionary of options. Specification: - * https://developers.google.com/blockly/installation/overview#configuration - * @return {!Object} Dictionary of normalized options. - * @private - */ -Blockly.parseOptions_ = function(options) { - var readOnly = !!options['readOnly']; - if (readOnly) { - var languageTree = null; - var hasCategories = false; - var hasTrashcan = false; - var hasCollapse = false; - var hasComments = false; - var hasDisable = false; - var hasSounds = false; - } else { - var languageTree = Blockly.parseToolboxTree_(options['toolbox']); - var hasCategories = Boolean(languageTree && - languageTree.getElementsByTagName('category').length); - var hasTrashcan = options['trashcan']; - if (hasTrashcan === undefined) { - hasTrashcan = hasCategories; - } - var hasCollapse = options['collapse']; - if (hasCollapse === undefined) { - hasCollapse = hasCategories; - } - var hasComments = options['comments']; - if (hasComments === undefined) { - hasComments = hasCategories; - } - var hasDisable = options['disable']; - if (hasDisable === undefined) { - hasDisable = hasCategories; - } - var hasSounds = options['sounds']; - if (hasSounds === undefined) { - hasSounds = true; - } - } - var hasScrollbars = options['scrollbars']; - if (hasScrollbars === undefined) { - hasScrollbars = hasCategories; - } - var hasCss = options['css']; - if (hasCss === undefined) { - hasCss = true; - } - // See grid documentation at: - // https://developers.google.com/blockly/installation/grid - var grid = options['grid'] || {}; - var gridOptions = {}; - gridOptions.spacing = parseFloat(grid['spacing']) || 0; - gridOptions.colour = grid['colour'] || '#888'; - gridOptions.length = parseFloat(grid['length']) || 1; - gridOptions.snap = gridOptions.spacing > 0 && !!grid['snap']; - var pathToMedia = 'https://blockly-demo.appspot.com/static/media/'; - if (options['media']) { - pathToMedia = options['media']; - } else if (options['path']) { - // 'path' is a deprecated option which has been replaced by 'media'. - pathToMedia = options['path'] + 'media/'; - } - - // See zoom documentation at: - // https://developers.google.com/blockly/installation/zoom - var zoom = options['zoom'] || {}; - var zoomOptions = {}; - if (zoom['controls'] === undefined) { - zoomOptions.controls = false; - } else { - zoomOptions.controls = !!zoom['controls']; - } - if (zoom['wheel'] === undefined) { - zoomOptions.wheel = false; - } else { - zoomOptions.wheel = !!zoom['wheel']; - } - if (zoom['startScale'] === undefined) { - zoomOptions.startScale = 1; - } else { - zoomOptions.startScale = parseFloat(zoom['startScale']); - } - if (zoom['maxScale'] === undefined) { - zoomOptions.maxScale = 3; - } else { - zoomOptions.maxScale = parseFloat(zoom['maxScale']); - } - if (zoom['minScale'] === undefined) { - zoomOptions.minScale = 0.3; - } else { - zoomOptions.minScale = parseFloat(zoom['minScale']); - } - if (zoom['scaleSpeed'] === undefined) { - zoomOptions.scaleSpeed = 1.2; - } else { - zoomOptions.scaleSpeed = parseFloat(zoom['scaleSpeed']); - } - - var enableRealtime = !!options['realtime']; - var realtimeOptions = enableRealtime ? options['realtimeOptions'] : undefined; - - return { - RTL: !!options['rtl'], - collapse: hasCollapse, - comments: hasComments, - disable: hasDisable, - readOnly: readOnly, - maxBlocks: options['maxBlocks'] || Infinity, - pathToMedia: pathToMedia, - hasCategories: hasCategories, - hasScrollbars: hasScrollbars, - hasTrashcan: hasTrashcan, - hasSounds: hasSounds, - hasCss: hasCss, - languageTree: languageTree, - gridOptions: gridOptions, - zoomOptions: zoomOptions, - enableRealtime: enableRealtime, - realtimeOptions: realtimeOptions - }; -}; - /** * Create the SVG image. * @param {!Element} container Containing element. - * @param {Object} options Dictionary of options. + * @param {!Blockly.Options} options Dictionary of options. * @return {!Element} Newly created SVG image. * @private */ @@ -228,16 +95,6 @@ Blockly.createDom_ = function(container, options) { Blockly.Css.inject(options.hasCss, options.pathToMedia); // Build the SVG DOM. - /* - - ... - - */ var svg = Blockly.createSvgElement('svg', { 'xmlns': 'http://www.w3.org/2000/svg', 'xmlns:html': 'http://www.w3.org/1999/xhtml', @@ -245,51 +102,31 @@ Blockly.createDom_ = function(container, options) { 'version': '1.1', 'class': 'blocklySvg' }, container); - /* - - ... filters go here ... - - */ var defs = Blockly.createSvgElement('defs', {}, svg); var rnd = String(Math.random()).substring(2); - /* - - - - - - - - - */ - var embossFilter = Blockly.createSvgElement('filter', - {'id': 'blocklyEmbossFilter' + rnd}, defs); + + // Using a dilate distorts the block shape. + // Instead use a gaussian blur, and then set all alpha to 1 with a transfer. + var stackGlowFilter = Blockly.createSvgElement('filter', + {'id': 'blocklyStackGlowFilter', + 'height': '160%', 'width': '180%', y: '-30%', x: '-40%'}, defs); Blockly.createSvgElement('feGaussianBlur', - {'in': 'SourceAlpha', 'stdDeviation': 1, 'result': 'blur'}, embossFilter); - var feSpecularLighting = Blockly.createSvgElement('feSpecularLighting', - {'in': 'blur', 'surfaceScale': 1, 'specularConstant': 0.5, - 'specularExponent': 10, 'lighting-color': 'white', 'result': 'specOut'}, - embossFilter); - Blockly.createSvgElement('fePointLight', - {'x': -5000, 'y': -10000, 'z': 20000}, feSpecularLighting); + {'in': 'SourceGraphic', + 'stdDeviation': Blockly.STACK_GLOW_RADIUS}, stackGlowFilter); + // Set all gaussian blur pixels to 1 opacity before applying flood + var componentTransfer = Blockly.createSvgElement('feComponentTransfer', {'result': 'outBlur'}, stackGlowFilter); + Blockly.createSvgElement('feFuncA', + {'type': 'table', 'tableValues': '0' + ' 1'.repeat(16)}, componentTransfer); + // Color the highlight + Blockly.createSvgElement('feFlood', + {'flood-color': Blockly.Colours.stackGlow, + 'flood-opacity': Blockly.Colours.stackGlowOpacity, 'result': 'outColor'}, stackGlowFilter); Blockly.createSvgElement('feComposite', - {'in': 'specOut', 'in2': 'SourceAlpha', 'operator': 'in', - 'result': 'specOut'}, embossFilter); + {'in': 'outColor', 'in2': 'outBlur', + 'operator': 'in', 'result': 'outGlow'}, stackGlowFilter); Blockly.createSvgElement('feComposite', - {'in': 'SourceGraphic', 'in2': 'specOut', 'operator': 'arithmetic', - 'k1': 0, 'k2': 1, 'k3': 1, 'k4': 0}, embossFilter); - options.embossFilterId = embossFilter.id; - /* - - - - - */ + {'in': 'SourceGraphic', 'in2': 'outGlow', 'operator': 'over'}, stackGlowFilter); + var disabledPattern = Blockly.createSvgElement('pattern', {'id': 'blocklyDisabledPattern' + rnd, 'patternUnits': 'userSpaceOnUse', @@ -299,12 +136,7 @@ Blockly.createDom_ = function(container, options) { Blockly.createSvgElement('path', {'d': 'M 0 0 L 10 10 M 10 0 L 0 10', 'stroke': '#cc0'}, disabledPattern); options.disabledPatternId = disabledPattern.id; - /* - - - - - */ + var gridPattern = Blockly.createSvgElement('pattern', {'id': 'blocklyGridPattern' + rnd, 'patternUnits': 'userSpaceOnUse'}, defs); @@ -326,15 +158,16 @@ Blockly.createDom_ = function(container, options) { /** * Create a main workspace and add it to the SVG. * @param {!Element} svg SVG element with pattern defined. - * @param {Object} options Dictionary of options. + * @param {!Blockly.Options} options Dictionary of options. + * @param {!Blockly.DragSurfaceSvg} dragSurface Drag surface SVG for the workspace. * @return {!Blockly.Workspace} Newly created main workspace. * @private */ -Blockly.createMainWorkspace_ = function(svg, options) { +Blockly.createMainWorkspace_ = function(svg, options, dragSurface) { options.parentWorkspace = null; options.getMetrics = Blockly.getMainWorkspaceMetrics_; options.setMetrics = Blockly.setMainWorkspaceMetrics_; - var mainWorkspace = new Blockly.WorkspaceSvg(options); + var mainWorkspace = new Blockly.WorkspaceSvg(options, dragSurface); mainWorkspace.scale = options.zoomOptions.startScale; svg.appendChild(mainWorkspace.createDom('blocklyMainBackground')); // A null translation will also apply the correct initial scale. @@ -343,7 +176,7 @@ Blockly.createMainWorkspace_ = function(svg, options) { if (!options.readOnly && !options.hasScrollbars) { var workspaceChanged = function() { - if (Blockly.dragMode_ == 0) { + if (Blockly.dragMode_ == Blockly.DRAG_NONE) { var metrics = mainWorkspace.getMetrics(); var edgeLeft = metrics.viewLeft + metrics.absoluteLeft; var edgeTop = metrics.viewTop + metrics.absoluteTop; @@ -361,26 +194,27 @@ Blockly.createMainWorkspace_ = function(svg, options) { var blockXY = block.getRelativeToSurfaceXY(); var blockHW = block.getHeightWidth(); // Bump any block that's above the top back inside. - var overflow = edgeTop + MARGIN - blockHW.height - blockXY.y; - if (overflow > 0) { - block.moveBy(0, overflow); + var overflowTop = edgeTop + MARGIN - blockHW.height - blockXY.y; + if (overflowTop > 0) { + block.moveBy(0, overflowTop); } // Bump any block that's below the bottom back inside. - var overflow = edgeTop + metrics.viewHeight - MARGIN - blockXY.y; - if (overflow < 0) { - block.moveBy(0, overflow); + var overflowBottom = + edgeTop + metrics.viewHeight - MARGIN - blockXY.y; + if (overflowBottom < 0) { + block.moveBy(0, overflowBottom); } // Bump any block that's off the left back inside. - var overflow = MARGIN + edgeLeft - + var overflowLeft = MARGIN + edgeLeft - blockXY.x - (options.RTL ? 0 : blockHW.width); - if (overflow > 0) { - block.moveBy(overflow, 0); + if (overflowLeft > 0) { + block.moveBy(overflowLeft, 0); } // Bump any block that's off the right back inside. - var overflow = edgeLeft + metrics.viewWidth - MARGIN - + var overflowRight = edgeLeft + metrics.viewWidth - MARGIN - blockXY.x + (options.RTL ? blockHW.width : 0); - if (overflow < 0) { - block.moveBy(overflow, 0); + if (overflowRight < 0) { + block.moveBy(overflowRight, 0); } } } @@ -391,6 +225,7 @@ Blockly.createMainWorkspace_ = function(svg, options) { // The SVG is now fully assembled. Blockly.svgResize(mainWorkspace); Blockly.WidgetDiv.createDom(); + Blockly.DropDownDiv.createDom(); Blockly.Tooltip.createDom(); return mainWorkspace; }; @@ -403,6 +238,7 @@ Blockly.createMainWorkspace_ = function(svg, options) { Blockly.init_ = function(mainWorkspace) { var options = mainWorkspace.options; var svg = mainWorkspace.getParentSvg(); + // Supress the browser's context menu. Blockly.bindEvent_(svg, 'contextmenu', null, function(e) { @@ -410,34 +246,14 @@ Blockly.init_ = function(mainWorkspace) { e.preventDefault(); } }); - // Bind events for scrolling the workspace. - // Most of these events should be bound to the SVG's surface. - // However, 'mouseup' has to be on the whole document so that a block dragged - // out of bounds and released will know that it has been released. - // Also, 'keydown' has to be on the whole document since the browser doesn't - // understand a concept of focus on the SVG image. Blockly.bindEvent_(window, 'resize', null, - function() {Blockly.svgResize(mainWorkspace);}); - - if (!Blockly.documentEventsBound_) { - // Only bind the window/document events once. - // Destroying and reinjecting Blockly should not bind again. - Blockly.bindEvent_(document, 'keydown', null, Blockly.onKeyDown_); - Blockly.bindEvent_(document, 'touchend', null, Blockly.longStop_); - Blockly.bindEvent_(document, 'touchcancel', null, Blockly.longStop_); - // Don't use bindEvent_ for document's mouseup since that would create a - // corresponding touch handler that would squeltch the ability to interact - // with non-Blockly elements. - document.addEventListener('mouseup', Blockly.onMouseUp_, false); - // Some iPad versions don't fire resize after portrait to landscape change. - if (goog.userAgent.IPAD) { - Blockly.bindEvent_(window, 'orientationchange', document, function() { - Blockly.fireUiEvent(window, 'resize'); + function() { + Blockly.hideChaff(true); + Blockly.asyncSvgResize(mainWorkspace); }); - } - Blockly.documentEventsBound_ = true; - } + + Blockly.inject.bindDocumentEvents_(); if (options.languageTree) { if (mainWorkspace.toolbox_) { @@ -446,16 +262,22 @@ Blockly.init_ = function(mainWorkspace) { // Build a fixed flyout with the root blocks. mainWorkspace.flyout_.init(mainWorkspace); mainWorkspace.flyout_.show(options.languageTree.childNodes); - // Translate the workspace sideways to avoid the fixed flyout. - mainWorkspace.scrollX = mainWorkspace.flyout_.width_; - if (options.RTL) { - mainWorkspace.scrollX *= -1; + // Translate the workspace to avoid the fixed flyout. + if (options.horizontalLayout) { + mainWorkspace.scrollY = mainWorkspace.flyout_.height_; + if (options.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { + mainWorkspace.scrollY *= -1; + } + } else { + mainWorkspace.scrollX = mainWorkspace.flyout_.width_; + if (options.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { + mainWorkspace.scrollX *= -1; + } } - var translation = 'translate(' + mainWorkspace.scrollX + ',0)'; - mainWorkspace.getCanvas().setAttribute('transform', translation); - mainWorkspace.getBubbleCanvas().setAttribute('transform', translation); + mainWorkspace.translate(mainWorkspace.scrollX, mainWorkspace.scrollY); } } + if (options.hasScrollbars) { mainWorkspace.scrollbar = new Blockly.ScrollbarPair(mainWorkspace); mainWorkspace.scrollbar.resize(); @@ -464,17 +286,9 @@ Blockly.init_ = function(mainWorkspace) { // Load the sounds. if (options.hasSounds) { mainWorkspace.loadAudio_( - [options.pathToMedia + 'click.mp3', - options.pathToMedia + 'click.wav', - options.pathToMedia + 'click.ogg'], 'click'); - mainWorkspace.loadAudio_( - [options.pathToMedia + 'disconnect.wav', - options.pathToMedia + 'disconnect.mp3', - options.pathToMedia + 'disconnect.ogg'], 'disconnect'); + [options.pathToMedia + 'click.wav'], 'click'); mainWorkspace.loadAudio_( - [options.pathToMedia + 'delete.mp3', - options.pathToMedia + 'delete.ogg', - options.pathToMedia + 'delete.wav'], 'delete'); + [options.pathToMedia + 'delete.wav'], 'delete'); // Bind temporary hooks that preload the sounds. var soundBinds = []; @@ -492,6 +306,36 @@ Blockly.init_ = function(mainWorkspace) { } }; +/** + * Bind document events, but only once. Destroying and reinjecting Blockly + * should not bind again. + * Bind events for scrolling the workspace. + * Most of these events should be bound to the SVG's surface. + * However, 'mouseup' has to be on the whole document so that a block dragged + * out of bounds and released will know that it has been released. + * Also, 'keydown' has to be on the whole document since the browser doesn't + * understand a concept of focus on the SVG image. + * @private + */ +Blockly.inject.bindDocumentEvents_ = function() { + if (!Blockly.documentEventsBound_) { + Blockly.bindEvent_(document, 'keydown', null, Blockly.onKeyDown_); + Blockly.bindEvent_(document, 'touchend', null, Blockly.longStop_); + Blockly.bindEvent_(document, 'touchcancel', null, Blockly.longStop_); + // Don't use bindEvent_ for document's mouseup since that would create a + // corresponding touch handler that would squeltch the ability to interact + // with non-Blockly elements. + document.addEventListener('mouseup', Blockly.onMouseUp_, false); + // Some iPad versions don't fire resize after portrait to landscape change. + if (goog.userAgent.IPAD) { + Blockly.bindEvent_(window, 'orientationchange', document, function() { + Blockly.asyncSvgResize(); + }); + } + } + Blockly.documentEventsBound_ = true; +}; + /** * Modify the block tree on the existing toolbox. * @param {Node|string} tree DOM tree of blocks, or text representation of same. diff --git a/core/input.js b/core/input.js index b924337699..183d76c73c 100644 --- a/core/input.js +++ b/core/input.js @@ -47,7 +47,10 @@ Blockly.Input = function(type, name, block, connection) { this.type = type; /** @type {string} */ this.name = name; - /** @type {!Blockly.Block} */ + /** + * @type {!Blockly.Block} + * @private + */ this.sourceBlock_ = block; /** @type {Blockly.Connection} */ this.connection = connection; @@ -84,8 +87,9 @@ Blockly.Input.prototype.appendField = function(field, opt_name) { if (goog.isString(field)) { field = new Blockly.FieldLabel(/** @type {string} */ (field)); } + field.setSourceBlock(this.sourceBlock_); if (this.sourceBlock_.rendered) { - field.init(this.sourceBlock_); + field.init(); } field.name = opt_name; @@ -108,19 +112,6 @@ Blockly.Input.prototype.appendField = function(field, opt_name) { return this; }; -/** - * Add an item to the end of the input's field row. - * @param {*} field Something to add as a field. - * @param {string=} opt_name Language-neutral identifier which may used to find - * this field again. Should be unique to the host block. - * @return {!Blockly.Input} The input being append to (to allow chaining). - * @deprecated December 2013 - */ -Blockly.Input.prototype.appendTitle = function(field, opt_name) { - console.warn('Deprecated call to appendTitle, use appendField instead.'); - return this.appendField(field, opt_name); -}; - /** * Remove a field from this input. * @param {string} name The name of the field. diff --git a/core/mutator.js b/core/mutator.js index 13d492a1e0..a53babfd98 100644 --- a/core/mutator.js +++ b/core/mutator.js @@ -198,11 +198,13 @@ Blockly.Mutator.prototype.setVisible = function(visible) { // No change. return; } + Blockly.Events.fire( + new Blockly.Events.Ui(this.block_, 'mutatorOpen', !visible, visible)); if (visible) { // Create the bubble. - this.bubble_ = new Blockly.Bubble(this.block_.workspace, - this.createEditor_(), this.block_.svgPath_, - this.iconX_, this.iconY_, null, null); + this.bubble_ = new Blockly.Bubble( + /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), + this.createEditor_(), this.block_.svgPath_, this.iconXY_, null, null); var tree = this.workspace_.options.languageTree; if (tree) { this.workspace_.flyout_.init(this.workspace_); @@ -232,17 +234,14 @@ Blockly.Mutator.prototype.setVisible = function(visible) { if (this.block_.saveConnections) { var thisMutator = this; this.block_.saveConnections(this.rootBlock_); - this.sourceListener_ = Blockly.bindEvent_( - this.block_.workspace.getCanvas(), - 'blocklyWorkspaceChange', null, - function() { - thisMutator.block_.saveConnections(thisMutator.rootBlock_) - }); + this.sourceListener_ = function() { + thisMutator.block_.saveConnections(thisMutator.rootBlock_); + }; + this.block_.workspace.addChangeListener(this.sourceListener_); } this.resizeBubble_(); // When the mutator's workspace changes, update the source block. - Blockly.bindEvent_(this.workspace_.getCanvas(), 'blocklyWorkspaceChange', - this, this.workspaceChanged_); + this.workspace_.addChangeListener(this.workspaceChanged_.bind(this)); this.updateColour(); } else { // Dispose of the bubble. @@ -255,7 +254,7 @@ Blockly.Mutator.prototype.setVisible = function(visible) { this.workspaceWidth_ = 0; this.workspaceHeight_ = 0; if (this.sourceListener_) { - Blockly.unbindEvent_(this.sourceListener_); + this.block_.workspace.removeChangeListener(this.sourceListener_); this.sourceListener_ = null; } } @@ -268,7 +267,7 @@ Blockly.Mutator.prototype.setVisible = function(visible) { * @private */ Blockly.Mutator.prototype.workspaceChanged_ = function() { - if (Blockly.dragMode_ == 0) { + if (Blockly.dragMode_ == Blockly.DRAG_NONE) { var blocks = this.workspace_.getTopBlocks(false); var MARGIN = 20; for (var b = 0, block; block = blocks[b]; b++) { @@ -283,23 +282,37 @@ Blockly.Mutator.prototype.workspaceChanged_ = function() { // When the mutator's workspace changes, update the source block. if (this.rootBlock_.workspace == this.workspace_) { + Blockly.Events.setGroup(true); + var block = this.block_; + var oldMutationDom = block.mutationToDom(); + var oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); // Switch off rendering while the source block is rebuilt. - var savedRendered = this.block_.rendered; - this.block_.rendered = false; + var savedRendered = block.rendered; + block.rendered = false; // Allow the source block to rebuild itself. - this.block_.compose(this.rootBlock_); + block.compose(this.rootBlock_); // Restore rendering and show the changes. - this.block_.rendered = savedRendered; + block.rendered = savedRendered; // Mutation may have added some elements that need initalizing. - this.block_.initSvg(); - if (this.block_.rendered) { - this.block_.render(); + block.initSvg(); + var newMutationDom = block.mutationToDom(); + var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom); + if (oldMutation != newMutation) { + Blockly.Events.fire(new Blockly.Events.Change( + block, 'mutation', null, oldMutation, newMutation)); + // Ensure that any bump is part of this mutation's event group. + var group = Blockly.Events.getGroup(); + setTimeout(function() { + Blockly.Events.setGroup(group); + block.bumpNeighbours_(); + Blockly.Events.setGroup(false); + }, Blockly.BUMP_DELAY); + } + if (block.rendered) { + block.render(); } this.resizeBubble_(); - // The source block may have changed, notify its workspace. - this.block_.workspace.fireChangeEvent(); - goog.Timer.callOnce( - this.block_.bumpNeighbours_, Blockly.BUMP_DELAY, this.block_); + Blockly.Events.setGroup(false); } }; @@ -330,3 +343,37 @@ Blockly.Mutator.prototype.dispose = function() { this.block_.mutator = null; Blockly.Icon.prototype.dispose.call(this); }; + +/** + * Reconnect an block to a mutated input. + * @param {Blockly.Connection} connectionChild Connection on child block. + * @param {!Blockly.Block} block Parent block. + * @param {string} inputName Name of input on parent block. + * @return {boolean} True iff a reconnection was made, false otherwise. + */ +Blockly.Mutator.reconnect = function(connectionChild, block, inputName) { + if (!connectionChild || !connectionChild.getSourceBlock().workspace) { + return false; // No connection or block has been deleted. + } + var connectionParent = block.getInput(inputName).connection; + var currentParent = connectionChild.targetBlock(); + if ((!currentParent || currentParent == block) && + connectionParent.targetConnection != connectionChild) { + if (connectionParent.isConnected()) { + // There's already something connected here. Get rid of it. + connectionParent.disconnect(); + } + connectionParent.connect(connectionChild); + return true; + } + return false; +}; + +// Export symbols that would otherwise be renamed by Closure compiler. +if (!goog.global['Blockly']) { + goog.global['Blockly'] = {}; +} +if (!goog.global['Blockly']['Mutator']) { + goog.global['Blockly']['Mutator'] = {}; +} +goog.global['Blockly']['Mutator']['reconnect'] = Blockly.Mutator.reconnect; diff --git a/core/options.js b/core/options.js new file mode 100644 index 0000000000..b102a0ce3e --- /dev/null +++ b/core/options.js @@ -0,0 +1,251 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 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 Object that controls settings for the workspace. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Options'); +goog.require('Blockly.Colours'); + + +/** + * Parse the user-specified options, using reasonable defaults where behaviour + * is unspecified. + * @param {!Object} options Dictionary of options. Specification: + * https://developers.google.com/blockly/installation/overview#configuration + * @constructor + */ +Blockly.Options = function(options) { + var readOnly = !!options['readOnly']; + if (readOnly) { + var languageTree = null; + var hasCategories = false; + var hasTrashcan = false; + var hasCollapse = false; + var hasComments = false; + var hasDisable = false; + var hasSounds = false; + } else { + var languageTree = Blockly.Options.parseToolboxTree(options['toolbox']); + var hasCategories = Boolean(languageTree && + languageTree.getElementsByTagName('category').length); + var hasTrashcan = options['trashcan']; + if (hasTrashcan === undefined) { + hasTrashcan = hasCategories; + } + var hasCollapse = options['collapse']; + if (hasCollapse === undefined) { + hasCollapse = hasCategories; + } + var hasComments = options['comments']; + if (hasComments === undefined) { + hasComments = hasCategories; + } + var hasDisable = options['disable']; + if (hasDisable === undefined) { + hasDisable = hasCategories; + } + var hasSounds = options['sounds']; + if (hasSounds === undefined) { + hasSounds = true; + } + } + var hasScrollbars = options['scrollbars']; + if (hasScrollbars === undefined) { + hasScrollbars = hasCategories; + } + var hasCss = options['css']; + if (hasCss === undefined) { + hasCss = true; + } + var pathToMedia = 'https://blockly-demo.appspot.com/static/media/'; + if (options['media']) { + pathToMedia = options['media']; + } else if (options['path']) { + // 'path' is a deprecated option which has been replaced by 'media'. + pathToMedia = options['path'] + 'media/'; + } + + var horizontalLayout = options['horizontalLayout']; + if (horizontalLayout === undefined) { + horizontalLayout = false; + } + var toolboxAtStart = options['toolboxPosition']; + if (toolboxAtStart === 'end') { + toolboxAtStart = false; + } else { + toolboxAtStart = true; + } + + if (horizontalLayout) { + var toolboxPosition = toolboxAtStart ? Blockly.TOOLBOX_AT_TOP : Blockly.TOOLBOX_AT_BOTTOM; + } else { + var toolboxPosition = + (toolboxAtStart == options['rtl']) ? Blockly.TOOLBOX_AT_RIGHT : Blockly.TOOLBOX_AT_LEFT; + } + + var enableRealtime = !!options['realtime']; + var realtimeOptions = enableRealtime ? options['realtimeOptions'] : undefined; + + // Colour overrides provided by the injection + var colours = options['colours']; + if (colours) { + for (var colourProperty in colours) { + if (colours.hasOwnProperty(colourProperty) && + Blockly.Colours.hasOwnProperty(colourProperty)) { + // If a property is in both colours option and Blockly.Colours, + // set the Blockly.Colours value to the override. + Blockly.Colours[colourProperty] = colours[colourProperty]; + } + } + } + + this.RTL = !!options['rtl']; + this.collapse = hasCollapse; + this.comments = hasComments; + this.disable = hasDisable; + this.readOnly = readOnly; + this.maxBlocks = options['maxBlocks'] || Infinity; + this.pathToMedia = pathToMedia; + this.hasCategories = hasCategories; + this.hasScrollbars = hasScrollbars; + this.hasTrashcan = hasTrashcan; + this.hasSounds = hasSounds; + this.hasCss = hasCss; + this.languageTree = languageTree; + this.gridOptions = Blockly.Options.parseGridOptions_(options); + this.zoomOptions = Blockly.Options.parseZoomOptions_(options); + this.enableRealtime = enableRealtime; + this.realtimeOptions = realtimeOptions; + this.horizontalLayout = horizontalLayout; + this.toolboxAtStart = toolboxAtStart; + this.toolboxPosition = toolboxPosition; +}; + +/** + * @type {Blockly.Workspace} the parent of the current workspace, or null if + * there is no parent workspace. + **/ +Blockly.Options.prototype.parentWorkspace = null; + +/** + * If set, sets the translation of the workspace to match the scrollbars. + * No-op if unset. + */ +Blockly.Options.prototype.setMetrics = function(translation) { return; }; + +/** + * Return an object with the metrics required to size the workspace, or null + * if unset. + * @return {Object} Contains size an position metrics, or null. + */ +Blockly.Options.prototype.getMetrics = function() { return null; }; + +/** + * Parse the user-specified zoom options, using reasonable defaults where + * behaviour is unspecified. See zoom documentation: + * https://developers.google.com/blockly/installation/zoom + * @param {!Object} options Dictionary of options. + * @return {!Object} A dictionary of normalized options. + * @private + */ +Blockly.Options.parseZoomOptions_ = function(options) { + var zoom = options['zoom'] || {}; + var zoomOptions = {}; + if (zoom['controls'] === undefined) { + zoomOptions.controls = false; + } else { + zoomOptions.controls = !!zoom['controls']; + } + if (zoom['wheel'] === undefined) { + zoomOptions.wheel = false; + } else { + zoomOptions.wheel = !!zoom['wheel']; + } + if (zoom['startScale'] === undefined) { + zoomOptions.startScale = 1; + } else { + zoomOptions.startScale = parseFloat(zoom['startScale']); + } + if (zoom['maxScale'] === undefined) { + zoomOptions.maxScale = 3; + } else { + zoomOptions.maxScale = parseFloat(zoom['maxScale']); + } + if (zoom['minScale'] === undefined) { + zoomOptions.minScale = 0.3; + } else { + zoomOptions.minScale = parseFloat(zoom['minScale']); + } + if (zoom['scaleSpeed'] === undefined) { + zoomOptions.scaleSpeed = 1.2; + } else { + zoomOptions.scaleSpeed = parseFloat(zoom['scaleSpeed']); + } + return zoomOptions; +}; + +/** + * Parse the user-specified grid options, using reasonable defaults where + * behaviour is unspecified. See grid documentation: + * https://developers.google.com/blockly/installation/grid + * @param {!Object} options Dictionary of options. + * @return {!Object} A dictionary of normalized options. + * @private + */ +Blockly.Options.parseGridOptions_ = function(options) { + var grid = options['grid'] || {}; + var gridOptions = {}; + gridOptions.spacing = parseFloat(grid['spacing']) || 0; + gridOptions.colour = grid['colour'] || '#888'; + gridOptions.length = parseFloat(grid['length']) || 1; + gridOptions.snap = gridOptions.spacing > 0 && !!grid['snap']; + return gridOptions; +}; + +/** + * Parse the provided toolbox tree into a consistent DOM format. + * @param {Node|string} tree DOM tree of blocks, or text representation of same. + * @return {Node} DOM tree of blocks, or null. + */ +Blockly.Options.parseToolboxTree = function(tree) { + if (tree) { + if (typeof tree != 'string') { + if (typeof XSLTProcessor == 'undefined' && tree.outerHTML) { + // In this case the tree will not have been properly built by the + // browser. The HTML will be contained in the element, but it will + // not have the proper DOM structure since the browser doesn't support + // XSLTProcessor (XML -> HTML). This is the case in IE 9+. + tree = tree.outerHTML; + } else if (!(tree instanceof Element)) { + tree = null; + } + } + if (typeof tree == 'string') { + tree = Blockly.Xml.textToDom(tree); + } + } else { + tree = null; + } + return tree; +}; diff --git a/core/procedures.js b/core/procedures.js index e7ba5981e1..594f82e120 100644 --- a/core/procedures.js +++ b/core/procedures.js @@ -251,16 +251,28 @@ Blockly.Procedures.disposeCallers = function(name, workspace) { /** * When a procedure definition changes its parameters, find and edit all its * callers. - * @param {string} name Name of edited procedure definition. - * @param {!Blockly.Workspace} workspace The workspace to delete callers from. - * @param {!Array.} paramNames Array of new parameter names. - * @param {!Array.} paramIds Array of unique parameter IDs. + * @param {!Blockly.Block} defBlock Procedure definition block. */ -Blockly.Procedures.mutateCallers = function(name, workspace, - paramNames, paramIds) { - var callers = Blockly.Procedures.getCallers(name, workspace); - for (var i = 0; i < callers.length; i++) { - callers[i].setProcedureParameters(paramNames, paramIds); +Blockly.Procedures.mutateCallers = function(defBlock) { + var oldRecordUndo = Blockly.Events.recordUndo; + var name = defBlock.getProcedureDef()[0]; + var xmlElement = defBlock.mutationToDom(true); + var callers = Blockly.Procedures.getCallers(name, defBlock.workspace); + for (var i = 0, caller; caller = callers[i]; i++) { + var oldMutationDom = caller.mutationToDom(); + var oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); + caller.domToMutation(xmlElement); + var newMutationDom = caller.mutationToDom(); + var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom); + if (oldMutation != newMutation) { + // Fire a mutation on every caller block. But don't record this as an + // undo action since it is deterministically tied to the procedure's + // definition mutation. + Blockly.Events.recordUndo = false; + Blockly.Events.fire(new Blockly.Events.Change( + caller, 'mutation', null, oldMutation, newMutation)); + Blockly.Events.recordUndo = oldRecordUndo; + } } }; diff --git a/core/rendered_connection.js b/core/rendered_connection.js new file mode 100644 index 0000000000..6aff78a732 --- /dev/null +++ b/core/rendered_connection.js @@ -0,0 +1,371 @@ +/** + * @license + * Visual Blocks Editor + * + * Copyright 2016 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 Components for creating connections between blocks. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.RenderedConnection'); + +goog.require('Blockly.Connection'); + + +/** + * Class for a connection between blocks that may be rendered on screen. + * @param {!Blockly.Block} source The block establishing this connection. + * @param {number} type The type of the connection. + * @constructor + */ +Blockly.RenderedConnection = function(source, type) { + Blockly.RenderedConnection.superClass_.constructor.call(this, source, type); +}; +goog.inherits(Blockly.RenderedConnection, Blockly.Connection); + +/** + * Returns the distance between this connection and another connection. + * @param {!Blockly.Connection} otherConnection The other connection to measure + * the distance to. + * @return {number} The distance between connections. + */ +Blockly.RenderedConnection.prototype.distanceFrom = function(otherConnection) { + var xDiff = this.x_ - otherConnection.x_; + var yDiff = this.y_ - otherConnection.y_; + return Math.sqrt(xDiff * xDiff + yDiff * yDiff); +}; + +/** + * Move the block(s) belonging to the connection to a point where they don't + * visually interfere with the specified connection. + * @param {!Blockly.Connection} staticConnection The connection to move away + * from. + * @private + */ +Blockly.RenderedConnection.prototype.bumpAwayFrom_ = function(staticConnection) { + if (Blockly.dragMode_ != Blockly.DRAG_NONE) { + // Don't move blocks around while the user is doing the same. + return; + } + // Move the root block. + var rootBlock = this.sourceBlock_.getRootBlock(); + if (rootBlock.isInFlyout) { + // Don't move blocks around in a flyout. + return; + } + var reverse = false; + if (!rootBlock.isMovable()) { + // Can't bump an uneditable block away. + // Check to see if the other block is movable. + rootBlock = staticConnection.getSourceBlock().getRootBlock(); + if (!rootBlock.isMovable()) { + return; + } + // Swap the connections and move the 'static' connection instead. + staticConnection = this; + reverse = true; + } + // Raise it to the top for extra visibility. + rootBlock.getSvgRoot().parentNode.appendChild(rootBlock.getSvgRoot()); + var dx = (staticConnection.x_ + Blockly.SNAP_RADIUS) - this.x_; + var dy = (staticConnection.y_ + Blockly.SNAP_RADIUS) - this.y_; + if (reverse) { + // When reversing a bump due to an uneditable block, bump up. + dy = -dy; + } + if (rootBlock.RTL) { + dx = -dx; + } + rootBlock.moveBy(dx, dy); +}; + +/** + * Change the connection's coordinates. + * @param {number} x New absolute x coordinate. + * @param {number} y New absolute y coordinate. + */ +Blockly.RenderedConnection.prototype.moveTo = function(x, y) { + // Remove it from its old location in the database (if already present) + if (this.inDB_) { + this.db_.removeConnection_(this); + } + this.x_ = x; + this.y_ = y; + // Insert it into its new location in the database. + if (!this.hidden_) { + this.db_.addConnection(this); + } +}; + +/** + * Change the connection's coordinates. + * @param {number} dx Change to x coordinate. + * @param {number} dy Change to y coordinate. + */ +Blockly.RenderedConnection.prototype.moveBy = function(dx, dy) { + this.moveTo(this.x_ + dx, this.y_ + dy); +}; + +/** + * Move the blocks on either side of this connection right next to each other. + * @private + */ +Blockly.RenderedConnection.prototype.tighten_ = function() { + var dx = this.targetConnection.x_ - this.x_; + var dy = this.targetConnection.y_ - this.y_; + if (dx != 0 || dy != 0) { + var block = this.targetBlock(); + var svgRoot = block.getSvgRoot(); + if (!svgRoot) { + throw 'block is not rendered.'; + } + var xy = Blockly.getRelativeXY_(svgRoot); + block.getSvgRoot().setAttribute('transform', + 'translate(' + (xy.x - dx) + ',' + (xy.y - dy) + ')'); + block.moveConnections_(-dx, -dy); + } +}; + +/** + * Find the closest compatible connection to this connection. + * @param {number} maxLimit The maximum radius to another connection. + * @param {!goog.math.Coordinate} dxy Offset between this connection's location + * in the database and the current location (as a result of dragging). + * @return {!{connection: ?Blockly.Connection, radius: number}} Contains two + * properties: 'connection' which is either another connection or null, + * and 'radius' which is the distance. + */ +Blockly.RenderedConnection.prototype.closest = function(maxLimit, dxy) { + return this.dbOpposite_.searchForClosest(this, maxLimit, dxy); +}; + +/** + * Add highlighting around this connection. + */ +Blockly.RenderedConnection.prototype.highlight = function() { + var steps; + if (this.type == Blockly.INPUT_VALUE || this.type == Blockly.OUTPUT_VALUE) { + var tabWidth = this.sourceBlock_.RTL ? -Blockly.BlockSvg.TAB_WIDTH : + Blockly.BlockSvg.TAB_WIDTH; + steps = 'm 0,0 ' + Blockly.BlockSvg.TAB_PATH_DOWN + ' v 5'; + + } else { + steps = 'm -20,0 h 5 ' + Blockly.BlockSvg.NOTCH_PATH_LEFT + ' h 5'; + } + var xy = this.sourceBlock_.getRelativeToSurfaceXY(); + var x = this.x_ - xy.x; + var y = this.y_ - xy.y; + Blockly.Connection.highlightedPath_ = Blockly.createSvgElement('path', + {'class': 'blocklyHighlightedConnectionPath', + 'd': steps, + transform: 'translate(' + x + ',' + y + ')' + + (this.sourceBlock_.RTL ? ' scale(-1 1)' : '')}, + this.sourceBlock_.getSvgRoot()); +}; + +/** + * Unhide this connection, as well as all down-stream connections on any block + * attached to this connection. This happens when a block is expanded. + * Also unhides down-stream comments. + * @return {!Array.} List of blocks to render. + */ +Blockly.RenderedConnection.prototype.unhideAll = function() { + this.setHidden(false); + // All blocks that need unhiding must be unhidden before any rendering takes + // place, since rendering requires knowing the dimensions of lower blocks. + // Also, since rendering a block renders all its parents, we only need to + // render the leaf nodes. + var renderList = []; + if (this.type != Blockly.INPUT_VALUE && this.type != Blockly.NEXT_STATEMENT) { + // Only spider down. + return renderList; + } + var block = this.targetBlock(); + if (block) { + var connections; + if (block.isCollapsed()) { + // This block should only be partially revealed since it is collapsed. + connections = []; + block.outputConnection && connections.push(block.outputConnection); + block.nextConnection && connections.push(block.nextConnection); + block.previousConnection && connections.push(block.previousConnection); + } else { + // Show all connections of this block. + connections = block.getConnections_(true); + } + for (var c = 0; c < connections.length; c++) { + renderList.push.apply(renderList, connections[c].unhideAll()); + } + if (!renderList.length) { + // Leaf block. + renderList[0] = block; + } + } + return renderList; +}; + +/** + * Remove the highlighting around this connection. + */ +Blockly.RenderedConnection.prototype.unhighlight = function() { + goog.dom.removeNode(Blockly.Connection.highlightedPath_); + delete Blockly.Connection.highlightedPath_; +}; + +/** + * Set whether this connections is hidden (not tracked in a database) or not. + * @param {boolean} hidden True if connection is hidden. + */ +Blockly.RenderedConnection.prototype.setHidden = function(hidden) { + this.hidden_ = hidden; + if (hidden && this.inDB_) { + this.db_.removeConnection_(this); + } else if (!hidden && !this.inDB_) { + this.db_.addConnection(this); + } +}; + +/** + * Hide this connection, as well as all down-stream connections on any block + * attached to this connection. This happens when a block is collapsed. + * Also hides down-stream comments. + */ +Blockly.RenderedConnection.prototype.hideAll = function() { + this.setHidden(true); + if (this.targetConnection) { + var blocks = this.targetBlock().getDescendants(); + for (var b = 0; b < blocks.length; b++) { + var block = blocks[b]; + // Hide all connections of all children. + var connections = block.getConnections_(true); + for (var c = 0; c < connections.length; c++) { + connections[c].setHidden(true); + } + // Close all bubbles of all children. + var icons = block.getIcons(); + for (var i = 0; i < icons.length; i++) { + icons[i].setVisible(false); + } + } + } +}; + +/** + * Check if the two connections can be dragged to connect to each other. + * @param {!Blockly.Connection} candidate A nearby connection to check. + * @param {number} maxRadius The maximum radius allowed for connections. + * @return {boolean} True if the connection is allowed, false otherwise. + */ +Blockly.RenderedConnection.prototype.isConnectionAllowed = function(candidate, + maxRadius) { + if (this.distanceFrom(candidate) > maxRadius) { + return false; + } + + return Blockly.RenderedConnection.superClass_.isConnectionAllowed.call(this, + candidate); +}; + +/** + * Disconnect two blocks that are connected by this connection. + * @param {!Blockly.Block} parentBlock The superior block. + * @param {!Blockly.Block} childBlock The inferior block. + * @private + */ +Blockly.RenderedConnection.prototype.disconnectInternal_ = function(parentBlock, + childBlock) { + Blockly.RenderedConnection.superClass_.disconnectInternal_.call(this, + parentBlock, childBlock); + // Rerender the parent so that it may reflow. + if (parentBlock.rendered) { + parentBlock.render(); + } + if (childBlock.rendered) { + childBlock.updateDisabled(); + childBlock.render(); + } +}; + +/** + * Respawn the shadow block if there was one connected to the this connection. + * Render/rerender blocks as needed. + * @private + */ +Blockly.RenderedConnection.prototype.respawnShadow_ = function() { + var parentBlock = this.getSourceBlock(); + // Respawn the shadow block if there is one. + var shadow = this.getShadowDom(); + if (parentBlock.workspace && shadow && Blockly.Events.recordUndo) { + var blockShadow = + Blockly.RenderedConnection.superClass_.respawnShadow_.call(this); + if (!blockShadow) { + throw 'Couldn\'t respawn the shadow block that should exist here.'; + } + blockShadow.initSvg(); + blockShadow.render(false); + if (parentBlock.rendered) { + parentBlock.render(); + } + } +}; + +/** + * Find all nearby compatible connections to this connection. + * Type checking does not apply, since this function is used for bumping. + * @param {number} maxLimit The maximum radius to another connection. + * @return {!Array.} List of connections. + * @private + */ +Blockly.RenderedConnection.prototype.neighbours_ = function(maxLimit) { + return this.dbOpposite_.getNeighbours(this, maxLimit); +}; + +/** + * Connect two connections together. This is the connection on the superior + * block. Rerender blocks as needed. + * @param {!Blockly.Connection} childConnection Connection on inferior block. + * @private + */ +Blockly.RenderedConnection.prototype.connect_ = function(childConnection) { + Blockly.RenderedConnection.superClass_.connect_.call(this, childConnection); + + var parentConnection = this; + var parentBlock = parentConnection.getSourceBlock(); + var childBlock = childConnection.getSourceBlock(); + + if (parentBlock.rendered) { + parentBlock.updateDisabled(); + } + if (childBlock.rendered) { + childBlock.updateDisabled(); + } + if (parentBlock.rendered && childBlock.rendered) { + if (parentConnection.type == Blockly.NEXT_STATEMENT || + parentConnection.type == Blockly.PREVIOUS_STATEMENT) { + // Child block may need to square off its corners if it is in a stack. + // Rendering a child will render its parent. + childBlock.render(); + } else { + // Child block does not change shape. Rendering the parent node will + // move its connected children into position. + parentBlock.render(); + } + } +}; diff --git a/core/scrollbar.js b/core/scrollbar.js index e872900f00..6fb115aef1 100644 --- a/core/scrollbar.js +++ b/core/scrollbar.js @@ -136,8 +136,43 @@ Blockly.ScrollbarPair.prototype.resize = function() { * @param {number} y Vertical scroll value. */ Blockly.ScrollbarPair.prototype.set = function(x, y) { - this.hScroll.set(x); - this.vScroll.set(y); + // This function is equivalent to: + // this.hScroll.set(x); + // this.vScroll.set(y); + // However, that calls setMetrics twice which causes a chain of + // getAttribute->setAttribute->getAttribute resulting in an extra layout pass. + // Combining them speeds up rendering. + var xyRatio = {}; + + var hKnobValue = x * this.hScroll.ratio_; + var vKnobValue = y * this.vScroll.ratio_; + + var hBarLength = + parseFloat(this.hScroll.svgBackground_.getAttribute('width')); + var vBarLength = + parseFloat(this.vScroll.svgBackground_.getAttribute('height')); + + xyRatio.x = this.getRatio_(hKnobValue, hBarLength); + xyRatio.y = this.getRatio_(vKnobValue, vBarLength); + + this.workspace_.setMetrics(xyRatio); + this.hScroll.svgKnob_.setAttribute('x', hKnobValue); + this.vScroll.svgKnob_.setAttribute('y', vKnobValue); +}; + +/** + * Helper to calculate the ratio of knob value to bar length. + * @param {number} knobValue The value of the knob. + * @param {number} barLength The length of the scroll bar. + * @return {number} Ratio. + * @private + */ +Blockly.ScrollbarPair.prototype.getRatio_ = function(knobValue, barLength) { + var ratio = knobValue / barLength; + if (isNaN(ratio)) { + return 0; + } + return ratio; }; // -------------------------------------------------------------------- @@ -148,7 +183,7 @@ Blockly.ScrollbarPair.prototype.set = function(x, y) { * look or behave like the system's scrollbars. * @param {!Blockly.Workspace} workspace Workspace to bind the scrollbar to. * @param {boolean} horizontal True if horizontal, false if vertical. - * @param {boolean=} opt_pair True if the scrollbar is part of a horiz/vert pair. + * @param {boolean=} opt_pair True if scrollbar is part of a horiz/vert pair. * @constructor */ Blockly.Scrollbar = function(workspace, horizontal, opt_pair) { @@ -235,69 +270,89 @@ Blockly.Scrollbar.prototype.resize = function(opt_metrics) { * .absoluteLeft: Left-edge of view. */ if (this.horizontal_) { - var outerLength = hostMetrics.viewWidth - 1; - if (this.pair_) { - // Shorten the scrollbar to make room for the corner square. - outerLength -= Blockly.Scrollbar.scrollbarThickness; - } else { - // Only show the scrollbar if needed. - // Ideally this would also apply to scrollbar pairs, but that's a bigger - // headache (due to interactions with the corner square). - this.setVisible(outerLength < hostMetrics.contentHeight); - } - this.ratio_ = outerLength / hostMetrics.contentWidth; - if (this.ratio_ === -Infinity || this.ratio_ === Infinity || - isNaN(this.ratio_)) { - this.ratio_ = 0; - } - var innerLength = hostMetrics.viewWidth * this.ratio_; - var innerOffset = (hostMetrics.viewLeft - hostMetrics.contentLeft) * - this.ratio_; - this.svgKnob_.setAttribute('width', Math.max(0, innerLength)); - this.xCoordinate = hostMetrics.absoluteLeft + 0.5; - if (this.pair_ && this.workspace_.RTL) { - this.xCoordinate += hostMetrics.absoluteLeft + - Blockly.Scrollbar.scrollbarThickness; - } - this.yCoordinate = hostMetrics.absoluteTop + hostMetrics.viewHeight - - Blockly.Scrollbar.scrollbarThickness - 0.5; - this.svgGroup_.setAttribute('transform', - 'translate(' + this.xCoordinate + ',' + this.yCoordinate + ')'); - this.svgBackground_.setAttribute('width', Math.max(0, outerLength)); - this.svgKnob_.setAttribute('x', this.constrainKnob_(innerOffset)); + this.resizeHorizontal_(hostMetrics); } else { - var outerLength = hostMetrics.viewHeight - 1; - if (this.pair_) { - // Shorten the scrollbar to make room for the corner square. - outerLength -= Blockly.Scrollbar.scrollbarThickness; - } else { - // Only show the scrollbar if needed. - this.setVisible(outerLength < hostMetrics.contentHeight); - } - this.ratio_ = outerLength / hostMetrics.contentHeight; - if (this.ratio_ === -Infinity || this.ratio_ === Infinity || - isNaN(this.ratio_)) { - this.ratio_ = 0; - } - var innerLength = hostMetrics.viewHeight * this.ratio_; - var innerOffset = (hostMetrics.viewTop - hostMetrics.contentTop) * - this.ratio_; - this.svgKnob_.setAttribute('height', Math.max(0, innerLength)); - this.xCoordinate = hostMetrics.absoluteLeft + 0.5; - if (!this.workspace_.RTL) { - this.xCoordinate += hostMetrics.viewWidth - - Blockly.Scrollbar.scrollbarThickness - 1; - } - this.yCoordinate = hostMetrics.absoluteTop + 0.5; - this.svgGroup_.setAttribute('transform', - 'translate(' + this.xCoordinate + ',' + this.yCoordinate + ')'); - this.svgBackground_.setAttribute('height', Math.max(0, outerLength)); - this.svgKnob_.setAttribute('y', this.constrainKnob_(innerOffset)); + this.resizeVertical_(hostMetrics); } // Resizing may have caused some scrolling. this.onScroll_(); }; +/** + * Recalculate a horizontal scrollbar's location and length. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + * @private + */ +Blockly.Scrollbar.prototype.resizeHorizontal_ = function(hostMetrics) { + var outerLength = hostMetrics.viewWidth - 1; + if (this.pair_) { + // Shorten the scrollbar to make room for the corner square. + outerLength -= Blockly.Scrollbar.scrollbarThickness; + } else { + // Only show the scrollbar if needed. + // Ideally this would also apply to scrollbar pairs, but that's a bigger + // headache (due to interactions with the corner square). + this.setVisible(outerLength < hostMetrics.contentWidth); + } + this.ratio_ = outerLength / hostMetrics.contentWidth; + if (this.ratio_ === -Infinity || this.ratio_ === Infinity || + isNaN(this.ratio_)) { + this.ratio_ = 0; + } + var innerLength = hostMetrics.viewWidth * this.ratio_; + var innerOffset = (hostMetrics.viewLeft - hostMetrics.contentLeft) * + this.ratio_; + this.svgKnob_.setAttribute('width', Math.max(0, innerLength)); + this.xCoordinate = hostMetrics.absoluteLeft + 0.5; + if (this.pair_ && this.workspace_.RTL) { + this.xCoordinate += hostMetrics.absoluteLeft + + Blockly.Scrollbar.scrollbarThickness; + } + this.yCoordinate = hostMetrics.absoluteTop + hostMetrics.viewHeight - + Blockly.Scrollbar.scrollbarThickness - 0.5; + this.svgGroup_.setAttribute('transform', + 'translate(' + this.xCoordinate + ',' + this.yCoordinate + ')'); + this.svgBackground_.setAttribute('width', Math.max(0, outerLength)); + this.svgKnob_.setAttribute('x', this.constrainKnob_(innerOffset)); +}; + +/** + * Recalculate a vertical scrollbar's location and length. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + * @private + */ +Blockly.Scrollbar.prototype.resizeVertical_ = function(hostMetrics) { + var outerLength = hostMetrics.viewHeight - 1; + if (this.pair_) { + // Shorten the scrollbar to make room for the corner square. + outerLength -= Blockly.Scrollbar.scrollbarThickness; + } else { + // Only show the scrollbar if needed. + this.setVisible(outerLength < hostMetrics.contentHeight); + } + this.ratio_ = outerLength / hostMetrics.contentHeight; + if (this.ratio_ === -Infinity || this.ratio_ === Infinity || + isNaN(this.ratio_)) { + this.ratio_ = 0; + } + var innerLength = hostMetrics.viewHeight * this.ratio_; + var innerOffset = (hostMetrics.viewTop - hostMetrics.contentTop) * + this.ratio_; + this.svgKnob_.setAttribute('height', Math.max(0, innerLength)); + this.xCoordinate = hostMetrics.absoluteLeft + 0.5; + if (!this.workspace_.RTL) { + this.xCoordinate += hostMetrics.viewWidth - + Blockly.Scrollbar.scrollbarThickness - 1; + } + this.yCoordinate = hostMetrics.absoluteTop + 0.5; + this.svgGroup_.setAttribute('transform', + 'translate(' + this.xCoordinate + ',' + this.yCoordinate + ')'); + this.svgBackground_.setAttribute('height', Math.max(0, outerLength)); + this.svgKnob_.setAttribute('y', this.constrainKnob_(innerOffset)); +}; + /** * Create all the DOM elements required for a scrollbar. * The resulting widget is not sized. @@ -389,8 +444,13 @@ Blockly.Scrollbar.prototype.onMouseDownBar_ = function(e) { } this.svgKnob_.setAttribute(this.horizontal_ ? 'x' : 'y', this.constrainKnob_(knobValue)); + // When the scrollbars are clicked, hide the WidgetDiv/DropDownDiv without animation + // in anticipation of a workspace move. + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); this.onScroll_(); e.stopPropagation(); + e.preventDefault(); }; /** @@ -416,7 +476,12 @@ Blockly.Scrollbar.prototype.onMouseDownKnob_ = function(e) { 'mouseup', this, this.onMouseUpKnob_); Blockly.Scrollbar.onMouseMoveWrapper_ = Blockly.bindEvent_(document, 'mousemove', this, this.onMouseMoveKnob_); + // When the scrollbars are clicked, hide the WidgetDiv/DropDownDiv without animation + // in anticipation of a workspace move. + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); e.stopPropagation(); + e.preventDefault(); }; /** @@ -439,7 +504,6 @@ Blockly.Scrollbar.prototype.onMouseMoveKnob_ = function(e) { * @private */ Blockly.Scrollbar.prototype.onMouseUpKnob_ = function() { - Blockly.removeAllRanges(); Blockly.hideChaff(true); if (Blockly.Scrollbar.onMouseUpWrapper_) { Blockly.unbindEvent_(Blockly.Scrollbar.onMouseUpWrapper_); @@ -480,7 +544,7 @@ Blockly.Scrollbar.prototype.onScroll_ = function() { var barLength = parseFloat( this.svgBackground_.getAttribute(this.horizontal_ ? 'width' : 'height')); var ratio = knobValue / barLength; - if (isNaN(ratio)) { + if (isNaN(ratio) || !barLength) { ratio = 0; } var xyRatio = {}; @@ -497,8 +561,9 @@ Blockly.Scrollbar.prototype.onScroll_ = function() { * @param {number} value The distance from the top/left end of the bar. */ Blockly.Scrollbar.prototype.set = function(value) { + var constrainedValue = this.constrainKnob_(value * this.ratio_); // Move the scrollbar slider. - this.svgKnob_.setAttribute(this.horizontal_ ? 'x' : 'y', value * this.ratio_); + this.svgKnob_.setAttribute(this.horizontal_ ? 'x' : 'y', constrainedValue); this.onScroll_(); }; diff --git a/core/toolbox.js b/core/toolbox.js index 227e8e0c4d..9bf9f1738c 100644 --- a/core/toolbox.js +++ b/core/toolbox.js @@ -31,6 +31,7 @@ goog.require('goog.dom'); goog.require('goog.events'); goog.require('goog.events.BrowserFeature'); goog.require('goog.html.SafeHtml'); +goog.require('goog.html.SafeStyle'); goog.require('goog.math.Rect'); goog.require('goog.style'); goog.require('goog.ui.tree.TreeControl'); @@ -50,14 +51,85 @@ Blockly.Toolbox = function(workspace) { * @private */ this.workspace_ = workspace; + + /** + * Whether toolbox categories should be represented by icons instead of text. + * @type {boolean} + * @private + */ + this.iconic_ = false; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + this.RTL = workspace.options.RTL; + + /** + * Whether the toolbox should be laid out horizontally. + * @type {boolean} + * @private + */ + this.horizontalLayout_ = workspace.options.horizontalLayout; + + /** + * Position of the toolbox and flyout relative to the workspace. + * @type {number} + */ + this.toolboxPosition = workspace.options.toolboxPosition; + + /** + * Configuration constants for Closure's tree UI. + * @type {Object.} + * @private + */ + this.config_ = { + indentWidth: 19, + cssRoot: 'blocklyTreeRoot', + cssHideRoot: 'blocklyHidden', + cssItem: '', + cssTreeRow: 'blocklyTreeRow', + cssItemLabel: 'blocklyTreeLabel', + cssTreeIcon: 'blocklyTreeIcon', + cssExpandedFolderIcon: 'blocklyTreeIconOpen', + cssFileIcon: 'blocklyTreeIconNone', + cssSelectedRow: 'blocklyTreeSelected' + }; + + + /** + * Configuration constants for tree separator. + * @type {Object.} + * @private + */ + this.treeSeparatorConfig_ = { + cssTreeRow: 'blocklyTreeSeparator' + }; + + if (this.horizontalLayout_) { + this.config_['cssTreeRow'] = + this.config_['cssTreeRow'] + + (workspace.RTL ? ' blocklyHorizontalTreeRtl' : ' blocklyHorizontalTree'); + + this.treeSeparatorConfig_['cssTreeRow'] = + 'blocklyTreeSeparatorHorizontal' + + (workspace.RTL ? ' blocklyHorizontalTreeRtl' : ' blocklyHorizontalTree'); + this.config_['cssTreeIcon'] = ''; + } }; /** - * Width of the toolbox. + * Width of the toolbox, which only changes in vertical layout. * @type {number} */ Blockly.Toolbox.prototype.width = 0; +/** + * Height of the toolbox, which only changes in horizontal layout. + * @type {number} + */ +Blockly.Toolbox.prototype.height = 0; + /** * The SVG group currently selected. * @type {SVGGElement} @@ -72,25 +144,6 @@ Blockly.Toolbox.prototype.selectedOption_ = null; */ Blockly.Toolbox.prototype.lastCategory_ = null; -/** - * Configuration constants for Closure's tree UI. - * @type {Object.} - * @const - * @private - */ -Blockly.Toolbox.prototype.CONFIG_ = { - indentWidth: 19, - cssRoot: 'blocklyTreeRoot', - cssHideRoot: 'blocklyHidden', - cssItem: '', - cssTreeRow: 'blocklyTreeRow', - cssItemLabel: 'blocklyTreeLabel', - cssTreeIcon: 'blocklyTreeIcon', - cssExpandedFolderIcon: 'blocklyTreeIconOpen', - cssFileIcon: 'blocklyTreeIconNone', - cssSelectedRow: 'blocklyTreeSelected' -}; - /** * Initializes the toolbox. */ @@ -102,9 +155,10 @@ Blockly.Toolbox.prototype.init = function() { this.HtmlDiv.setAttribute('dir', workspace.RTL ? 'RTL' : 'LTR'); document.body.appendChild(this.HtmlDiv); - // Clicking on toolbar closes popups. + // Clicking on toolbox closes popups. Blockly.bindEvent_(this.HtmlDiv, 'mousedown', this, function(e) { + Blockly.DropDownDiv.hide(); if (Blockly.isRightButton(e) || e.target == this.HtmlDiv) { // Close flyout. Blockly.hideChaff(false); @@ -116,8 +170,11 @@ Blockly.Toolbox.prototype.init = function() { var workspaceOptions = { disabledPatternId: workspace.options.disabledPatternId, parentWorkspace: workspace, - RTL: workspace.RTL + RTL: workspace.RTL, + horizontalLayout: workspace.horizontalLayout, + toolboxPosition: workspace.options.toolboxPosition }; + /** * @type {!Blockly.Flyout} * @private @@ -125,11 +182,12 @@ Blockly.Toolbox.prototype.init = function() { this.flyout_ = new Blockly.Flyout(workspaceOptions); goog.dom.insertSiblingAfter(this.flyout_.createDom(), workspace.svgGroup_); this.flyout_.init(workspace); + this.flyout_.hide(); - this.CONFIG_['cleardotPath'] = workspace.options.pathToMedia + '1x1.gif'; - this.CONFIG_['cssCollapsedFolderIcon'] = - 'blocklyTreeIconClosed' + (workspace.RTL ? 'Rtl' : 'Ltr'); - var tree = new Blockly.Toolbox.TreeControl(this, this.CONFIG_); + this.config_['cleardotPath'] = workspace.options.pathToMedia + '1x1.gif'; + this.config_['cssCollapsedFolderIcon'] = + 'blocklyTreeIconClosed' + (this.RTL ? 'Rtl' : 'Ltr'); + var tree = new Blockly.Toolbox.TreeControl(this, this.config_); this.tree_ = tree; tree.setShowRootNode(false); tree.setShowLines(false); @@ -164,18 +222,33 @@ Blockly.Toolbox.prototype.position = function() { var svg = this.workspace_.getParentSvg(); var svgPosition = goog.style.getPageOffset(svg); var svgSize = Blockly.svgSize(svg); - if (this.workspace_.RTL) { - treeDiv.style.left = - (svgPosition.x + svgSize.width - treeDiv.offsetWidth) + 'px'; - } else { + if (this.horizontalLayout_) { treeDiv.style.left = svgPosition.x + 'px'; - } - treeDiv.style.height = svgSize.height + 'px'; - treeDiv.style.top = svgPosition.y + 'px'; - this.width = treeDiv.offsetWidth; - if (!this.workspace_.RTL) { - // For some reason the LTR toolbox now reports as 1px too wide. - this.width -= 1; + treeDiv.style.height = 'auto'; + treeDiv.style.width = svgSize.width + 'px'; + this.height = treeDiv.offsetHeight; + if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { // Top + treeDiv.style.top = svgPosition.y + 'px'; + this.flyout_.setVerticalOffset(treeDiv.offsetHeight); + } else { // Bottom + var topOfToolbox = svgPosition.y + svgSize.height; + treeDiv.style.top = topOfToolbox + 'px'; + this.flyout_.setVerticalOffset(topOfToolbox); + } + } else { + if (this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { // Right + treeDiv.style.left = + (svgPosition.x + svgSize.width - treeDiv.offsetWidth) + 'px'; + } else { // Left + treeDiv.style.left = svgPosition.x + 'px'; + } + treeDiv.style.height = svgSize.height + 'px'; + treeDiv.style.top = svgPosition.y + 'px'; + this.width = treeDiv.offsetWidth; + if (this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { + // For some reason the LTR toolbox now reports as 1px too wide. + this.width -= 1; + } } this.flyout_.position(); }; @@ -187,10 +260,12 @@ Blockly.Toolbox.prototype.position = function() { */ Blockly.Toolbox.prototype.populate_ = function(newTree) { var rootOut = this.tree_; + var that = this; rootOut.removeChildren(); // Delete any existing content. rootOut.blocks = []; var hasColours = false; - function syncTrees(treeIn, treeOut) { + function syncTrees(treeIn, treeOut, iconic, pathToMedia) { + var lastElement = null; for (var i = 0, childIn; childIn = treeIn.childNodes[i]; i++) { if (!childIn.tagName) { // Skip over text. @@ -198,15 +273,24 @@ Blockly.Toolbox.prototype.populate_ = function(newTree) { } switch (childIn.tagName.toUpperCase()) { case 'CATEGORY': - var childOut = rootOut.createNode(childIn.getAttribute('name')); + if (iconic && childIn.getAttribute('icon')) { + var childOut = rootOut.createNode(childIn.getAttribute('name'), + pathToMedia + childIn.getAttribute('icon')); + } else { + var childOut = rootOut.createNode(childIn.getAttribute('name'), null); + } childOut.blocks = []; - treeOut.add(childOut); + if (that.horizontalLayout_) { + treeOut.add(childOut); + } else { + treeOut.addChildAt(childOut, 0); + } var custom = childIn.getAttribute('custom'); if (custom) { // Variables and procedures are special dynamic categories. childOut.blocks = custom; } else { - syncTrees(childIn, childOut); + syncTrees(childIn, childOut, iconic, pathToMedia); } var colour = childIn.getAttribute('colour'); if (goog.isString(colour)) { @@ -227,18 +311,43 @@ Blockly.Toolbox.prototype.populate_ = function(newTree) { } else { childOut.setExpanded(false); } + lastElement = childIn; break; case 'SEP': - treeOut.add(new Blockly.Toolbox.TreeSeparator()); + if (lastElement) { + if (lastElement.tagName.toUpperCase() == 'CATEGORY') { + // Separator between two categories. + // + if (that.horizontalLayout_) { + treeOut.add(new Blockly.Toolbox.TreeSeparator(that.treeSeparatorConfig_)); + } else { + treeOut.addChildAt(new Blockly.Toolbox.TreeSeparator(that.treeSeparatorConfig_), + 0); + } + } else { + // Change the gap between two blocks. + // + // The default gap is 24, can be set larger or smaller. + // Note that a deprecated method is to add a gap to a block. + // + var newGap = parseFloat(childIn.getAttribute('gap')); + if (!isNaN(newGap)) { + var oldGap = parseFloat(lastElement.getAttribute('gap')); + var gap = isNaN(oldGap) ? newGap : oldGap + newGap; + lastElement.setAttribute('gap', gap); + } + } + } break; case 'BLOCK': case 'SHADOW': treeOut.blocks.push(childIn); + lastElement = childIn; break; } } } - syncTrees(newTree, this.tree_); + syncTrees(newTree, this.tree_, this.iconic_, this.workspace_.options.pathToMedia); this.hasColours_ = hasColours; if (rootOut.blocks.length) { @@ -246,7 +355,7 @@ Blockly.Toolbox.prototype.populate_ = function(newTree) { } // Fire a resize event since the toolbox may have changed width and height. - Blockly.fireUiEvent(window, 'resize'); + Blockly.asyncSvgResize(this.workspace_); }; /** @@ -266,7 +375,7 @@ Blockly.Toolbox.prototype.addColour_ = function(opt_tree) { } else { var border = 'none'; } - if (this.workspace_.RTL) { + if (this.RTL) { element.style.borderRight = border; } else { element.style.borderLeft = border; @@ -284,23 +393,32 @@ Blockly.Toolbox.prototype.clearSelection = function() { }; /** - * Return the deletion rectangle for this toolbar. + * Return the deletion rectangle for this toolbar in viewport coordinates.\ * @return {goog.math.Rect} Rectangle in which to delete. */ -Blockly.Toolbox.prototype.getRect = function() { +Blockly.Toolbox.prototype.getClientRect = function() { // BIG_NUM is offscreen padding so that blocks dragged beyond the toolbox // area are still deleted. Must be smaller than Infinity, but larger than // the largest screen size. var BIG_NUM = 10000000; + var toolboxRect = this.HtmlDiv.getBoundingClientRect(); + + var x = toolboxRect.left; + var y = toolboxRect.top; + var width = toolboxRect.width; + var height = toolboxRect.height; + // Assumes that the toolbox is on the SVG edge. If this changes // (e.g. toolboxes in mutators) then this code will need to be more complex. - if (this.workspace_.RTL) { - var svgSize = Blockly.svgSize(this.workspace_.getParentSvg()); - var x = svgSize.width - this.width; - } else { - var x = -BIG_NUM; + if (this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { + return new goog.math.Rect(-BIG_NUM, -BIG_NUM, BIG_NUM + width, 2 * BIG_NUM); + } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { + return new goog.math.Rect(x, -BIG_NUM, BIG_NUM + width, 2 * BIG_NUM); + } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { + return new goog.math.Rect(-BIG_NUM, -BIG_NUM, 2 * BIG_NUM, BIG_NUM + height); + } else { // Bottom + return new goog.math.Rect(0, y, 2 * BIG_NUM, BIG_NUM + width); } - return new goog.math.Rect(x, -BIG_NUM, BIG_NUM + this.width, 2 * BIG_NUM); }; // Extending Closure's Tree UI. @@ -353,12 +471,16 @@ Blockly.Toolbox.TreeControl.prototype.handleTouchEvent_ = function(e) { /** * Creates a new tree node using a custom tree node. * @param {string=} opt_html The HTML content of the node label. + * @param {string} icon The path to the icon for this category. * @return {!goog.ui.tree.TreeNode} The new item. * @override */ -Blockly.Toolbox.TreeControl.prototype.createNode = function(opt_html) { - return new Blockly.Toolbox.TreeNode(this.toolbox_, opt_html ? - goog.html.SafeHtml.htmlEscape(opt_html) : goog.html.SafeHtml.EMPTY, +Blockly.Toolbox.TreeControl.prototype.createNode = function(opt_html, icon) { + var icon_html = '\"''; + var safe_opt_html = opt_html ? + goog.html.SafeHtml.htmlEscape(opt_html) : goog.html.SafeHtml.EMPTY; + var label_html = icon ? icon_html + ' ' + opt_html : safe_opt_html; + return new Blockly.Toolbox.TreeNode(this.toolbox_, label_html, this.getConfig(), this.getDomHelper()); }; @@ -368,7 +490,6 @@ Blockly.Toolbox.TreeControl.prototype.createNode = function(opt_html) { * @override */ Blockly.Toolbox.TreeControl.prototype.setSelectedItem = function(node) { - Blockly.removeAllRanges(); var toolbox = this.toolbox_; if (node == this.selectedItem_ || node == toolbox.tree_) { return; @@ -383,17 +504,24 @@ Blockly.Toolbox.TreeControl.prototype.setSelectedItem = function(node) { // not rendered. toolbox.addColour_(node); } + var oldNode = this.getSelectedItem(); goog.ui.tree.TreeControl.prototype.setSelectedItem.call(this, node); if (node && node.blocks && node.blocks.length) { toolbox.flyout_.show(node.blocks); - // Scroll the flyout to the top if the category has changed. + // Scroll the flyout to the start if the category has changed. if (toolbox.lastCategory_ != node) { - toolbox.flyout_.scrollToTop(); + toolbox.flyout_.scrollToStart(); } } else { // Hide the flyout. toolbox.flyout_.hide(); } + if (oldNode != node && oldNode != this) { + var event = new Blockly.Events.Ui(null, 'category', + oldNode && oldNode.getHtml(), node && node.getHtml()); + event.workspaceId = toolbox.workspace_.id; + Blockly.Events.fire(event); + } if (node) { toolbox.lastCategory_ = node; } @@ -414,13 +542,15 @@ Blockly.Toolbox.TreeNode = function(toolbox, html, opt_config, opt_domHelper) { goog.ui.tree.TreeNode.call(this, html, opt_config, opt_domHelper); if (toolbox) { var resize = function() { - Blockly.fireUiEvent(window, 'resize'); + Blockly.asyncSvgResize(toolbox.workspace_); }; // Fire a resize event since the toolbox may have changed width. goog.events.listen(toolbox.tree_, goog.ui.tree.BaseNode.EventType.EXPAND, resize); goog.events.listen(toolbox.tree_, goog.ui.tree.BaseNode.EventType.COLLAPSE, resize); + + this.toolbox_ = toolbox; } }; goog.inherits(Blockly.Toolbox.TreeNode, goog.ui.tree.TreeNode); @@ -467,18 +597,7 @@ Blockly.Toolbox.TreeNode.prototype.onDoubleClick_ = function(e) { * @constructor * @extends {Blockly.Toolbox.TreeNode} */ -Blockly.Toolbox.TreeSeparator = function() { - Blockly.Toolbox.TreeNode.call(this, null, '', - Blockly.Toolbox.TreeSeparator.CONFIG_); +Blockly.Toolbox.TreeSeparator = function(config) { + Blockly.Toolbox.TreeNode.call(this, null, '', config); }; goog.inherits(Blockly.Toolbox.TreeSeparator, Blockly.Toolbox.TreeNode); - -/** - * Configuration constants for tree separator. - * @type {Object.} - * @const - * @private - */ -Blockly.Toolbox.TreeSeparator.CONFIG_ = { - cssTreeRow: 'blocklyTreeSeparator' -}; diff --git a/core/tooltip.js b/core/tooltip.js index 4ac8049b94..6e520e65b2 100644 --- a/core/tooltip.js +++ b/core/tooltip.js @@ -99,7 +99,7 @@ Blockly.Tooltip.RADIUS_OK = 10; /** * Delay before tooltip appears. */ -Blockly.Tooltip.HOVER_MS = 1000; +Blockly.Tooltip.HOVER_MS = 750; /** * Horizontal padding between tooltip and screen edge. @@ -184,7 +184,7 @@ Blockly.Tooltip.onMouseMove_ = function(e) { if (!Blockly.Tooltip.element_ || !Blockly.Tooltip.element_.tooltip) { // No tooltip here to show. return; - } else if (Blockly.dragMode_ != 0) { + } else if (Blockly.dragMode_ != Blockly.DRAG_NONE) { // Don't display a tooltip during a drag. return; } else if (Blockly.WidgetDiv.isVisible()) { @@ -236,7 +236,7 @@ Blockly.Tooltip.show_ = function() { goog.dom.removeChildren(/** @type {!Element} */ (Blockly.Tooltip.DIV)); // Get the new text. var tip = Blockly.Tooltip.element_.tooltip; - if (goog.isFunction(tip)) { + while (goog.isFunction(tip)) { tip = tip(); } tip = Blockly.Tooltip.wrap_(tip, Blockly.Tooltip.LIMIT); diff --git a/core/trashcan.js b/core/trashcan.js index b7a0781d80..429d613c66 100644 --- a/core/trashcan.js +++ b/core/trashcan.js @@ -81,7 +81,7 @@ Blockly.Trashcan.prototype.MARGIN_SIDE_ = 20; * @type {number} * @private */ -Blockly.Trashcan.prototype.MARGIN_HOTSPOT_ = 25; +Blockly.Trashcan.prototype.MARGIN_HOTSPOT_ = 10; /** * Current open/close state of the lid. @@ -190,7 +190,7 @@ Blockly.Trashcan.prototype.createDom = function() { * @return {number} Distance from workspace bottom to the top of trashcan. */ Blockly.Trashcan.prototype.init = function(bottom) { - this.bottom_ = this.MARGIN_BOTTOM_ + bottom; + this.bottom_ = this.MARGIN_BOTTOM_ + bottom; this.setOpen_(false); return this.bottom_ + this.BODY_HEIGHT_ + this.LID_HEIGHT_; }; @@ -234,13 +234,13 @@ Blockly.Trashcan.prototype.position = function() { * Return the deletion rectangle for this trash can. * @return {goog.math.Rect} Rectangle in which to delete. */ -Blockly.Trashcan.prototype.getRect = function() { - var trashXY = Blockly.getSvgXY_(this.svgGroup_, this.workspace_); - return new goog.math.Rect( - trashXY.x - this.MARGIN_HOTSPOT_, - trashXY.y - this.MARGIN_HOTSPOT_, - this.WIDTH_ + 2 * this.MARGIN_HOTSPOT_, - this.BODY_HEIGHT_ + this.LID_HEIGHT_ + 2 * this.MARGIN_HOTSPOT_); +Blockly.Trashcan.prototype.getClientRect = function() { + var trashRect = this.svgGroup_.getBoundingClientRect(); + return new goog.math.Rect(trashRect.left - this.MARGIN_HOTSPOT_, + trashRect.top - this.MARGIN_HOTSPOT_, + trashRect.width + 2 * this.MARGIN_HOTSPOT_, + trashRect.height + 2 * this.MARGIN_HOTSPOT_); + }; /** diff --git a/core/utils.js b/core/utils.js index c8fc97c0f1..5e9ca5426c 100644 --- a/core/utils.js +++ b/core/utils.js @@ -34,6 +34,13 @@ goog.require('goog.math.Coordinate'); goog.require('goog.userAgent'); +/** + * Cached value for whether 3D is supported + * @type {boolean} + * @private + */ +Blockly.cache3dSupported_ = null; + /** * Add a CSS class to a element. * Similar to Closure's goog.dom.classes.add, except it handles SVG elements. @@ -163,66 +170,6 @@ Blockly.unbindEvent_ = function(bindData) { return func; }; -/** - * Fire a synthetic event synchronously. - * @param {!EventTarget} node The event's target node. - * @param {string} eventName Name of event (e.g. 'click'). - */ -Blockly.fireUiEventNow = function(node, eventName) { - // Remove the event from the anti-duplicate database. - var list = Blockly.fireUiEvent.DB_[eventName]; - if (list) { - var i = list.indexOf(node); - if (i != -1) { - list.splice(i, 1); - } - } - // Fire the event in a browser-compatible way. - if (document.createEvent) { - // W3 - var evt = document.createEvent('UIEvents'); - evt.initEvent(eventName, true, true); // event type, bubbling, cancelable - node.dispatchEvent(evt); - } else if (document.createEventObject) { - // MSIE - var evt = document.createEventObject(); - node.fireEvent('on' + eventName, evt); - } else { - throw 'FireEvent: No event creation mechanism.'; - } -}; - -/** - * Fire a synthetic event asynchronously. Groups of simultaneous events (e.g. - * a tree of blocks being deleted) are merged into one event. - * @param {!EventTarget} node The event's target node. - * @param {string} eventName Name of event (e.g. 'click'). - */ -Blockly.fireUiEvent = function(node, eventName) { - var list = Blockly.fireUiEvent.DB_[eventName]; - if (list) { - if (list.indexOf(node) != -1) { - // This event is already scheduled to fire. - return; - } - list.push(node); - } else { - Blockly.fireUiEvent.DB_[eventName] = [node]; - } - var fire = function() { - Blockly.fireUiEventNow(node, eventName); - }; - setTimeout(fire, 0); -}; - -/** - * Database of upcoming firing event types. - * Used to fire only one event after multiple changes. - * @type {!Object} - * @private - */ -Blockly.fireUiEvent.DB_ = {}; - /** * Don't do anything for this event, just halt propagation. * @param {!Event} e An event. @@ -267,13 +214,28 @@ Blockly.getRelativeXY_ = function(element) { } // Second, check for transform="translate(...)" attribute. var transform = element.getAttribute('transform'); - var r = transform && transform.match(Blockly.getRelativeXY_.XY_REGEXP_); - if (r) { - xy.x += parseFloat(r[1]); - if (r[3]) { - xy.y += parseFloat(r[3]); + if (transform) { + var transformComponents = transform.match(Blockly.getRelativeXY_.XY_REGEXP_); + if (transformComponents) { + xy.x += parseFloat(transformComponents[1]); + if (transformComponents[3]) { + xy.y += parseFloat(transformComponents[3]); + } } } + + // Third, check for style="transform: translate3d(...)". + var style = element.getAttribute('style'); + if (style && style.indexOf('translate3d') > -1) { + var styleComponents = style.match(Blockly.getRelativeXY_.XY_3D_REGEXP_); + if (styleComponents) { + xy.x += parseFloat(styleComponents[1]); + if (styleComponents[3]) { + xy.y += parseFloat(styleComponents[3]); + } + } + } + return xy; }; @@ -289,6 +251,15 @@ Blockly.getRelativeXY_ = function(element) { Blockly.getRelativeXY_.XY_REGEXP_ = /translate\(\s*([-+\d.e]+)([ ,]\s*([-+\d.e]+)\s*\))?/; +/** + * Static regex to pull the x,y,z values out of a translate3d() style property. + * Accounts for same exceptions as XY_REGEXP_. + * @type {!RegExp} + * @private + */ +Blockly.getRelativeXY_.XY_3D_REGEXP_ = + /transform:\s*translate3d\(\s*([-+\d.e]+)px([ ,]\s*([-+\d.e]+)\s*)px([ ,]\s*([-+\d.e]+)\s*)px\)?/; + /** * Return the absolute coordinates of the top-left corner of this element, * scales that after canvas SVG element, if it's a descendant. @@ -322,6 +293,46 @@ Blockly.getSvgXY_ = function(element, workspace) { return new goog.math.Coordinate(x, y); }; +/** + * Check if 3D transforms are supported by adding an element + * and attempting to set the property. + * @return {boolean} true if 3D transforms are supported + */ +Blockly.is3dSupported = function() { + if (Blockly.cache3dSupported_ !== null) { + return Blockly.cache3dSupported_; + } + // CC-BY-SA Lorenzo Polidori + // https://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support + if (!window.getComputedStyle) { + return false; + } + + var el = document.createElement('p'), + has3d, + transforms = { + 'webkitTransform':'-webkit-transform', + 'OTransform':'-o-transform', + 'msTransform':'-ms-transform', + 'MozTransform':'-moz-transform', + 'transform':'transform' + }; + + // Add it to the body to get the computed style. + document.body.insertBefore(el, null); + + for (var t in transforms) { + if (el.style[t] !== undefined) { + el.style[t] = "translate3d(1px,1px,1px)"; + has3d = window.getComputedStyle(el).getPropertyValue(transforms[t]); + } + } + + document.body.removeChild(el); + Blockly.cache3dSupported_ = (has3d !== undefined && has3d.length > 0 && has3d !== "none"); + return Blockly.cache3dSupported_; +}; + /** * Helper method for creating SVG elements. * @param {string} name Element's tag name. @@ -349,26 +360,6 @@ Blockly.createSvgElement = function(name, attrs, parent, opt_workspace) { return e; }; -/** - * Deselect any selections on the webpage. - * Chrome will select text outside the SVG when double-clicking. - * Deselect this text, so that it doesn't mess up any subsequent drag. - */ -Blockly.removeAllRanges = function() { - if (window.getSelection) { - setTimeout(function() { - try { - var selection = window.getSelection(); - if (!selection.isCollapsed) { - selection.removeAllRanges(); - } - } catch (e) { - // MSIE throws 'error 800a025e' here. - } - }, 0); - } -}; - /** * Is this event a right-click? * @param {!Event} e Mouse event. @@ -554,40 +545,39 @@ Blockly.tokenizeInterpolation = function(message) { /** * Generate a unique ID. This should be globally unique. - * 88 characters ^ 20 length ≈ 129 bits (one bit better than a UUID). - * @return {string} + * 87 characters ^ 20 length > 128 bits (better than a UUID). + * @return {string} A globally unique ID string. */ Blockly.genUid = function() { var length = 20; var soupLength = Blockly.genUid.soup_.length; var id = []; - if (Blockly.genUid.crypto_) { - // Cryptographically strong randomness is supported. - var array = new Uint32Array(length); - Blockly.genUid.crypto_.getRandomValues(array); - for (var i = 0; i < length; i++) { - id[i] = Blockly.genUid.soup_.charAt(array[i] % soupLength); - } - } else { - // Fall back to Math.random for IE 10. - for (var i = 0; i < length; i++) { - id[i] = Blockly.genUid.soup_.charAt(Math.random() * soupLength); - } + for (var i = 0; i < length; i++) { + id[i] = Blockly.genUid.soup_.charAt(Math.random() * soupLength); } return id.join(''); }; -/** - * Determine if window.crypto or global.crypto exists. - * @type {=RandomSource} - * @private - */ -Blockly.genUid.crypto_ = this.crypto; - /** * Legal characters for the unique ID. * Should be all on a US keyboard. No XML special characters or control codes. + * Removed $ due to issue 251. * @private */ -Blockly.genUid.soup_ = '!#$%()*+,-./:;=?@[]^_`{|}~' + +Blockly.genUid.soup_ = '!#%()*+,-./:;=?@[]^_`{|}~' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + +/** + * Measure some text using a canvas in-memory. + * @param {string} fontSize E.g., '10pt' + * @param {string} fontFamily E.g., 'Arial' + * @param {string} fontWeight E.g., '600' + * @param {string} text The actual text to measure + * @return {number} Width of the text in px. + */ +Blockly.measureText = function(fontSize, fontFamily, fontWeight, text) { + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + context.font = fontWeight + ' ' + fontSize + ' ' + fontFamily; + return context.measureText(text).width; +}; diff --git a/core/variables.js b/core/variables.js index db506fb9cf..12b8eeb06e 100644 --- a/core/variables.js +++ b/core/variables.js @@ -56,14 +56,12 @@ Blockly.Variables.allVariables = function(root) { var variableHash = Object.create(null); // Iterate through every block and add each variable to the hash. for (var x = 0; x < blocks.length; x++) { - if (blocks[x].getVars) { - var blockVariables = blocks[x].getVars(); - for (var y = 0; y < blockVariables.length; y++) { - var varName = blockVariables[y]; - // Variable name may be null if the block is only half-built. - if (varName) { - variableHash[varName.toLowerCase()] = varName; - } + var blockVariables = blocks[x].getVars(); + for (var y = 0; y < blockVariables.length; y++) { + var varName = blockVariables[y]; + // Variable name may be null if the block is only half-built. + if (varName) { + variableHash[varName.toLowerCase()] = varName; } } } @@ -82,13 +80,13 @@ Blockly.Variables.allVariables = function(root) { * @param {!Blockly.Workspace} workspace Workspace rename variables in. */ Blockly.Variables.renameVariable = function(oldName, newName, workspace) { + Blockly.Events.setGroup(true); var blocks = workspace.getAllBlocks(); // Iterate through every block. for (var i = 0; i < blocks.length; i++) { - if (blocks[i].renameVar) { - blocks[i].renameVar(oldName, newName); - } + blocks[i].renameVar(oldName, newName); } + Blockly.Events.setGroup(false); }; /** diff --git a/core/warning.js b/core/warning.js index 8d990b1d28..bffbf06df0 100644 --- a/core/warning.js +++ b/core/warning.js @@ -105,13 +105,14 @@ Blockly.Warning.prototype.setVisible = function(visible) { // No change. return; } + Blockly.Events.fire( + new Blockly.Events.Ui(this.block_, 'warningOpen', !visible, visible)); if (visible) { // Create the bubble to display all warnings. var paragraph = Blockly.Warning.textToDom_(this.getText()); this.bubble_ = new Blockly.Bubble( - /** @type {!Blockly.Workspace} */ (this.block_.workspace), - paragraph, this.block_.svgPath_, - this.iconX_, this.iconY_, null, null); + /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), + paragraph, this.block_.svgPath_, this.iconXY_, null, null); if (this.block_.RTL) { // Right-align the paragraph. // This cannot be done until the bubble is rendered on screen. diff --git a/core/widgetdiv.js b/core/widgetdiv.js index 3342aa3654..5b81f4efe2 100644 --- a/core/widgetdiv.js +++ b/core/widgetdiv.js @@ -48,11 +48,36 @@ Blockly.WidgetDiv.owner_ = null; /** * Optional cleanup function set by whichever object uses the widget. + * This is called as soon as a dispose is desired. If the dispose should + * be animated, the animation should start on the call of dispose_. * @type {Function} * @private */ Blockly.WidgetDiv.dispose_ = null; +/** + * Optional function called at the end of a dispose animation. + * Set by whichever object is using the widget. + * @type {Function} + * @private + */ +Blockly.WidgetDiv.disposeAnimationFinished_ = null; + +/** + * Timer ID for the dispose animation. + * @type {number} + * @private + */ +Blockly.WidgetDiv.disposeAnimationTimer_ = null; + +/** + * Length of time in seconds for the dispose animation. + * @type {number} + * @private + */ +Blockly.WidgetDiv.disposeAnimationTimerLength_ = 0; + + /** * Create the widget div and inject it onto the page. */ @@ -69,13 +94,20 @@ Blockly.WidgetDiv.createDom = function() { * Initialize and display the widget div. Close the old one if needed. * @param {!Object} newOwner The object that will be using this container. * @param {boolean} rtl Right-to-left (true) or left-to-right (false). - * @param {Function} dispose Optional cleanup function to be run when the widget - * is closed. + * @param {Function=} opt_dispose Optional cleanup function to be run when the widget + * is closed. If the dispose is animated, this function must start the animation. + * @param {Function=} opt_disposeAnimationFinished Optional cleanup function to be run + * when the widget is done animating and must disappear. + * @param {number=} opt_disposeAnimationTimerLength Length of animation time in seconds + if a dispose animation is provided. */ -Blockly.WidgetDiv.show = function(newOwner, rtl, dispose) { +Blockly.WidgetDiv.show = function(newOwner, rtl, opt_dispose, + opt_disposeAnimationFinished, opt_disposeAnimationTimerLength) { Blockly.WidgetDiv.hide(); Blockly.WidgetDiv.owner_ = newOwner; - Blockly.WidgetDiv.dispose_ = dispose; + Blockly.WidgetDiv.dispose_ = opt_dispose; + Blockly.WidgetDiv.disposeAnimationFinished_ = opt_disposeAnimationFinished; + Blockly.WidgetDiv.disposeAnimationTimerLength_ = opt_disposeAnimationTimerLength; // Temporarily move the widget to the top of the screen so that it does not // cause a scrollbar jump in Firefox when displayed. var xy = goog.style.getViewportPageOffset(document); @@ -86,20 +118,54 @@ Blockly.WidgetDiv.show = function(newOwner, rtl, dispose) { /** * Destroy the widget and hide the div. + * @param {boolean=} opt_noAnimate If set, animation will not be run for the hide. */ -Blockly.WidgetDiv.hide = function() { - if (Blockly.WidgetDiv.owner_) { - Blockly.WidgetDiv.DIV.style.display = 'none'; - Blockly.WidgetDiv.DIV.style.left = ''; - Blockly.WidgetDiv.DIV.style.top = ''; - Blockly.WidgetDiv.DIV.style.height = ''; - Blockly.WidgetDiv.dispose_ && Blockly.WidgetDiv.dispose_(); +Blockly.WidgetDiv.hide = function(opt_noAnimate) { + if (Blockly.WidgetDiv.disposeAnimationTimer_) { + // An animation timer is set already. + // This happens when a previous widget was animating out, + // but Blockly is hiding the widget to create a new one. + // So, short-circuit the animation and clear the timer. + window.clearTimeout(Blockly.WidgetDiv.disposeAnimationTimer_); + Blockly.WidgetDiv.disposeAnimationFinished_ && Blockly.WidgetDiv.disposeAnimationFinished_(); + Blockly.WidgetDiv.disposeAnimationFinished_ = null; + Blockly.WidgetDiv.disposeAnimationTimer_ = null; Blockly.WidgetDiv.owner_ = null; + Blockly.WidgetDiv.hideAndClearDom_(); + } else if (Blockly.WidgetDiv.isVisible()) { + // No animation timer set, but the widget is visible + // Start animation out (or immediately hide) + Blockly.WidgetDiv.dispose_ && Blockly.WidgetDiv.dispose_(); Blockly.WidgetDiv.dispose_ = null; - goog.dom.removeChildren(Blockly.WidgetDiv.DIV); + // If we want to animate out, set the appropriate timer for final dispose. + if (Blockly.WidgetDiv.disposeAnimationFinished_ && !opt_noAnimate) { + Blockly.WidgetDiv.disposeAnimationTimer_ = window.setTimeout( + Blockly.WidgetDiv.hide, // Come back to hide and take the first branch. + Blockly.WidgetDiv.disposeAnimationTimerLength_ * 1000 + ); + } else { + // No timer provided (or no animation desired) - auto-hide the DOM now. + Blockly.WidgetDiv.disposeAnimationFinished_ && Blockly.WidgetDiv.disposeAnimationFinished_(); + Blockly.WidgetDiv.disposeAnimationFinished_ = null; + Blockly.WidgetDiv.owner_ = null; + Blockly.WidgetDiv.hideAndClearDom_(); + } + Blockly.Events.setGroup(false); } }; +/** + * Hide all DOM for the WidgetDiv, and clear its children. + * @private + */ +Blockly.WidgetDiv.hideAndClearDom_ = function() { + Blockly.WidgetDiv.DIV.style.display = 'none'; + Blockly.WidgetDiv.DIV.style.left = ''; + Blockly.WidgetDiv.DIV.style.top = ''; + Blockly.WidgetDiv.DIV.style.height = ''; + goog.dom.removeChildren(Blockly.WidgetDiv.DIV); +}; + /** * Is the container visible? * @return {boolean} True if visible. diff --git a/core/workspace.js b/core/workspace.js index 400412a314..e6564fc510 100644 --- a/core/workspace.js +++ b/core/workspace.js @@ -32,19 +32,51 @@ goog.require('goog.math'); /** * Class for a workspace. This is a data structure that contains blocks. * There is no UI, and can be created headlessly. - * @param {Object=} opt_options Dictionary of options. + * @param {Blockly.Options} opt_options Dictionary of options. * @constructor */ Blockly.Workspace = function(opt_options) { /** @type {string} */ this.id = Blockly.genUid(); Blockly.Workspace.WorkspaceDB_[this.id] = this; - /** @type {!Object} */ + /** @type {!Blockly.Options} */ this.options = opt_options || {}; /** @type {boolean} */ this.RTL = !!this.options.RTL; - /** @type {!Array.} */ + /** @type {boolean} */ + this.horizontalLayout = !!this.options.horizontalLayout; + + /** + * @type {!Array.} + * @private + */ this.topBlocks_ = []; + /** + * @type {!Array.} + * @private + */ + this.listeners_ = []; + + /** @type {!Array.} */ + this.tapListeners_ = []; + + /** + * @type {!Array.} + * @private + */ + this.undoStack_ = []; + + /** + * @type {!Array.} + * @private + */ + this.redoStack_ = []; + + /** + * @type {!Object} + * @private + */ + this.blockDB_ = Object.create(null); }; /** @@ -53,11 +85,18 @@ Blockly.Workspace = function(opt_options) { */ Blockly.Workspace.prototype.rendered = false; +/** + * Maximum number of undo events in stack. + * @type {number} 0 to turn off undo, Infinity for unlimited. + */ +Blockly.Workspace.prototype.MAX_UNDO = 1024; + /** * Dispose of this workspace. * Unlink from all DOM elements to prevent memory leaks. */ Blockly.Workspace.prototype.dispose = function() { + this.listeners_.length = 0; this.clear(); // Remove from workspace database. delete Blockly.Workspace.WorkspaceDB_[this.id]; @@ -77,7 +116,6 @@ Blockly.Workspace.SCAN_ANGLE = 3; */ Blockly.Workspace.prototype.addTopBlock = function(block) { this.topBlocks_.push(block); - this.fireChangeEvent(); }; /** @@ -96,7 +134,6 @@ Blockly.Workspace.prototype.removeTopBlock = function(block) { if (!found) { throw 'Block not present in workspace\'s list of top-most blocks.'; } - this.fireChangeEvent(); }; /** @@ -138,9 +175,16 @@ Blockly.Workspace.prototype.getAllBlocks = function() { * Dispose of all blocks in workspace. */ Blockly.Workspace.prototype.clear = function() { + var existingGroup = Blockly.Events.getGroup(); + if (!existingGroup) { + Blockly.Events.setGroup(true); + } while (this.topBlocks_.length) { this.topBlocks_[0].dispose(); } + if (!existingGroup) { + Blockly.Events.setGroup(false); + } }; /** @@ -165,22 +209,6 @@ Blockly.Workspace.prototype.newBlock = function(prototypeName, opt_id) { return new Blockly.Block(this, prototypeName, opt_id); }; -/** - * Finds the block with the specified ID in this workspace. - * @param {string} id ID of block to find. - * @return {Blockly.Block} The matching block, or null if not found. - */ -Blockly.Workspace.prototype.getBlockById = function(id) { - // If this O(n) function fails to scale well, maintain a hash table of IDs. - var blocks = this.getAllBlocks(); - for (var i = 0, block; block = blocks[i]; i++) { - if (block.id == id) { - return block; - } - } - return null; -}; - /** * The number of blocks that may be added to the workspace before reaching * the maxBlocks. @@ -194,10 +222,124 @@ Blockly.Workspace.prototype.remainingCapacity = function() { }; /** - * Something on this workspace has changed. + * Undo or redo the previous action. + * @param {boolean} redo False if undo, true if redo. + */ +Blockly.Workspace.prototype.undo = function(redo) { + var inputStack = redo ? this.redoStack_ : this.undoStack_; + var outputStack = redo ? this.undoStack_ : this.redoStack_; + var inputEvent = inputStack.pop(); + if (!inputEvent) { + return; + } + var events = [inputEvent]; + // Do another undo/redo if the next one is of the same group. + while (inputStack.length && inputEvent.group && + inputEvent.group == inputStack[inputStack.length - 1].group) { + events.push(inputStack.pop()); + } + // Push these popped events on the opposite stack. + for (var i = 0, event; event = events[i]; i++) { + outputStack.push(event); + } + events = Blockly.Events.filter(events, redo); + Blockly.Events.recordUndo = false; + for (var i = 0, event; event = events[i]; i++) { + event.run(redo); + } + Blockly.Events.recordUndo = true; +}; + +/** + * Clear the undo/redo stacks. + */ +Blockly.Workspace.prototype.clearUndo = function() { + this.undoStack_.length = 0; + this.redoStack_.length = 0; + // Stop any events already in the firing queue from being undoable. + Blockly.Events.clearPendingUndo(); +}; + +/** + * When something in this workspace changes, call a function. + * @param {!Function} func Function to call. + * @return {!Function} Function that can be passed to + * removeChangeListener. */ -Blockly.Workspace.prototype.fireChangeEvent = function() { - // NOP. +Blockly.Workspace.prototype.addChangeListener = function(func) { + this.listeners_.push(func); + return func; +}; + +/** + * Stop listening for this workspace's changes. + * @param {Function} func Function to stop calling. + */ +Blockly.Workspace.prototype.removeChangeListener = function(func) { + var i = this.listeners_.indexOf(func); + if (i != -1) { + this.listeners_.splice(i, 1); + } +}; + +/** + * Fire a change event. + * @param {!Blockly.Events.Abstract} event Event to fire. + */ +Blockly.Workspace.prototype.fireChangeListener = function(event) { + if (event.recordUndo) { + this.undoStack_.push(event); + this.redoStack_.length = 0; + if (this.undoStack_.length > this.MAX_UNDO) { + this.undoStack_.unshift(); + } + } + for (var i = 0, func; func = this.listeners_[i]; i++) { + func(event); + } +}; + +/** + * When a block in the workspace is tapped, call a function with the + * blockId and root blockId. + * @param {!Function} func Function to call. + * @return {!Function} Function that can be passed to + * removeTapListener. + */ +Blockly.Workspace.prototype.addTapListener = function(func) { + this.tapListeners_.push(func); + return func; +}; + +/** + * Stop listening for this workspace's taps. + * @param {Function} func Function to stop calling. + */ +Blockly.Workspace.prototype.removeTapListener = function(func) { + var i = this.tapListeners_.indexOf(func); + if (i != -1) { + this.tapListeners_.splice(i, 1); + } +}; + +/** + * Fire a tap event. + * @param {string} blockId ID of block that was tapped + * @param {string} rootBlockId ID of root block in tree that was tapped + */ +Blockly.Workspace.prototype.fireTapListener = function(blockId, rootBlockId) { + for (var i = 0, func; func = this.tapListeners_[i]; i++) { + func(blockId, rootBlockId); + } +}; + +/** + * Find the block on this workspace with the specified ID. + * @param {string} id ID of block to find. + * @return {Blockly.Block} The sought after block or null if not found. + */ +Blockly.Workspace.prototype.getBlockById = function(id) { + return this.blockDB_[id] || null; }; /** @@ -217,3 +359,9 @@ Blockly.Workspace.getById = function(id) { // Export symbols that would otherwise be renamed by Closure compiler. Blockly.Workspace.prototype['clear'] = Blockly.Workspace.prototype.clear; +Blockly.Workspace.prototype['clearUndo'] = + Blockly.Workspace.prototype.clearUndo; +Blockly.Workspace.prototype['addChangeListener'] = + Blockly.Workspace.prototype.addChangeListener; +Blockly.Workspace.prototype['removeChangeListener'] = + Blockly.Workspace.prototype.removeChangeListener; diff --git a/core/workspace_svg.js b/core/workspace_svg.js index 185255a541..ba96540b47 100644 --- a/core/workspace_svg.js +++ b/core/workspace_svg.js @@ -28,11 +28,14 @@ goog.provide('Blockly.WorkspaceSvg'); // TODO(scr): Fix circular dependencies // goog.require('Blockly.Block'); +goog.require('Blockly.ConnectionDB'); +goog.require('Blockly.Events'); +goog.require('Blockly.Options'); goog.require('Blockly.ScrollbarPair'); goog.require('Blockly.Trashcan'); -goog.require('Blockly.ZoomControls'); goog.require('Blockly.Workspace'); goog.require('Blockly.Xml'); +goog.require('Blockly.ZoomControls'); goog.require('goog.dom'); goog.require('goog.math.Coordinate'); @@ -42,30 +45,29 @@ goog.require('goog.userAgent'); /** * Class for a workspace. This is an onscreen area with optional trashcan, * scrollbars, bubbles, and dragging. - * @param {!Object} options Dictionary of options. + * @param {!Blockly.Options} options Dictionary of options. + * @param {Blockly.DragSurfaceSvg=} opt_dragSurface Drag surface for the workspace. * @extends {Blockly.Workspace} * @constructor */ -Blockly.WorkspaceSvg = function(options) { +Blockly.WorkspaceSvg = function(options, opt_dragSurface) { Blockly.WorkspaceSvg.superClass_.constructor.call(this, options); this.getMetrics = options.getMetrics; this.setMetrics = options.setMetrics; Blockly.ConnectionDB.init(this); + if (opt_dragSurface) { + this.dragSurface = opt_dragSurface; + } + + Blockly.ConnectionDB.init(this); /** * Database of pre-loaded sounds. * @private * @const */ this.SOUNDS_ = Object.create(null); - - /** - * Opaque data that can be passed to Blockly.unbindEvent_. - * @type {!Array.} - * @private - */ - this.eventWrappers_ = []; }; goog.inherits(Blockly.WorkspaceSvg, Blockly.Workspace); @@ -112,18 +114,11 @@ Blockly.WorkspaceSvg.prototype.startScrollX = 0; Blockly.WorkspaceSvg.prototype.startScrollY = 0; /** - * Horizontal distance from mouse to object being dragged. - * @type {number} - * @private - */ -Blockly.WorkspaceSvg.prototype.dragDeltaX_ = 0; - -/** - * Vertical distance from mouse to object being dragged. - * @type {number} + * Distance from mouse to object being dragged. + * @type {goog.math.Coordinate} * @private */ -Blockly.WorkspaceSvg.prototype.dragDeltaY_ = 0; +Blockly.WorkspaceSvg.prototype.dragDeltaXY_ = null; /** * Current scale. @@ -143,6 +138,12 @@ Blockly.WorkspaceSvg.prototype.trashcan = null; */ Blockly.WorkspaceSvg.prototype.scrollbar = null; +/** + * This workspace's drag surface, if it exists. + * @type {Blockly.DragSurfaceSvg} + */ +Blockly.WorkspaceSvg.prototype.dragSurface = null; + /** * Create the workspace DOM elements. * @param {string=} opt_backgroundClass Either 'blocklyMainBackground' or @@ -212,7 +213,6 @@ Blockly.WorkspaceSvg.prototype.createDom = function(opt_backgroundClass) { Blockly.WorkspaceSvg.prototype.dispose = function() { // Stop rerendering. this.rendered = false; - Blockly.unbindEvent_(this.eventWrappers_); Blockly.WorkspaceSvg.superClass_.dispose.call(this); if (this.svgGroup_) { goog.dom.removeNode(this.svgGroup_); @@ -250,7 +250,7 @@ Blockly.WorkspaceSvg.prototype.dispose = function() { * Obtain a newly created block. * @param {?string} prototypeName Name of the language object containing * type-specific functions for this block. - * @param {=string} opt_id Optional ID. Use this ID if provided, otherwise + * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise * create a new id. * @return {!Blockly.BlockSvg} The created block. */ @@ -294,7 +294,9 @@ Blockly.WorkspaceSvg.prototype.addFlyout_ = function() { var workspaceOptions = { disabledPatternId: this.options.disabledPatternId, parentWorkspace: this, - RTL: this.RTL + RTL: this.RTL, + horizontalLayout: this.horizontalLayout, + toolboxPosition: this.options.toolboxPosition }; /** @type {Blockly.Flyout} */ this.flyout_ = new Blockly.Flyout(workspaceOptions); @@ -369,6 +371,9 @@ Blockly.WorkspaceSvg.prototype.translate = function(x, y) { 'scale(' + this.scale + ')'; this.svgBlockCanvas_.setAttribute('transform', translation); this.svgBubbleCanvas_.setAttribute('transform', translation); + if (this.dragSurface) { + this.dragSurface.translateAndScaleGroup(x, y, this.scale); + } }; /** @@ -377,7 +382,8 @@ Blockly.WorkspaceSvg.prototype.translate = function(x, y) { * @return {number} Width. */ Blockly.WorkspaceSvg.prototype.getWidth = function() { - return this.getMetrics().viewWidth; + var metrics = this.getMetrics(); + return metrics ? metrics.viewWidth / this.scale : 0; }; /** @@ -398,6 +404,7 @@ Blockly.WorkspaceSvg.prototype.setVisible = function(isVisible) { } } else { Blockly.hideChaff(true); + Blockly.DropDownDiv.hideWithoutAnimation(); } }; @@ -425,7 +432,7 @@ Blockly.WorkspaceSvg.prototype.traceOn = function(armed) { } if (armed) { this.traceWrapper_ = Blockly.bindEvent_(this.svgBlockCanvas_, - 'blocklySelectChange', this, function() {this.traceOn_ = false}); + 'blocklySelectChange', this, function() {this.traceOn_ = false; }); } }; @@ -434,7 +441,7 @@ Blockly.WorkspaceSvg.prototype.traceOn = function(armed) { * @param {?string} id ID of block to find. */ Blockly.WorkspaceSvg.prototype.highlightBlock = function(id) { - if (this.traceOn_ && Blockly.dragMode_ != 0) { + if (this.traceOn_ && Blockly.dragMode_ != Blockly.DRAG_NONE) { // The blocklySelectChange event normally prevents this, but sometimes // there is a race condition on fast-executing apps. this.traceOn(false); @@ -444,7 +451,7 @@ Blockly.WorkspaceSvg.prototype.highlightBlock = function(id) { } var block = null; if (id) { - block = Blockly.Block.getById(id); + block = this.getBlockById(id); if (!block) { return; } @@ -464,16 +471,35 @@ Blockly.WorkspaceSvg.prototype.highlightBlock = function(id) { }; /** - * Fire a change event for this workspace. Changes include new block, dropdown - * edits, mutations, connections, etc. Groups of simultaneous changes (e.g. - * a tree of blocks being deleted) are merged into one event. - * Applications may hook workspace changes by listening for - * 'blocklyWorkspaceChange' on workspace.getCanvas(). + * Glow/unglow a block in the workspace. + * @param {?string} id ID of block to find. + * @param {boolean} isGlowingBlock Whether to glow the block. */ -Blockly.WorkspaceSvg.prototype.fireChangeEvent = function() { - if (this.rendered && this.svgBlockCanvas_) { - Blockly.fireUiEvent(this.svgBlockCanvas_, 'blocklyWorkspaceChange'); +Blockly.WorkspaceSvg.prototype.glowBlock = function(id, isGlowingBlock) { + var block = null; + if (id) { + block = this.getBlockById(id); + if (!block) { + throw 'Tried to glow block that does not exist.'; + } } + block.setGlowBlock(isGlowingBlock); +}; + +/** + * Glow/unglow a stack in the workspace. + * @param {?string} id ID of block which starts the stack. + * @param {boolean} isGlowingStack Whether to glow the stack. + */ +Blockly.WorkspaceSvg.prototype.glowStack = function(id, isGlowingStack) { + var block = null; + if (id) { + block = this.getBlockById(id); + if (!block) { + throw 'Tried to glow stack on block that does not exist.'; + } + } + block.setGlowStack(isGlowingStack); }; /** @@ -486,7 +512,8 @@ Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { return; } Blockly.terminateDrag_(); // Dragging while pasting? No. - var block = Blockly.Xml.domToBlock(this, xmlBlock); + Blockly.Events.disable(); + var block = Blockly.Xml.domToBlock(xmlBlock, this); // Move the duplicate to original position. var blockX = parseInt(xmlBlock.getAttribute('x'), 10); var blockY = parseInt(xmlBlock.getAttribute('y'), 10); @@ -511,8 +538,8 @@ Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { // Check for blocks in snap range to any of its connections. var connections = block.getConnections_(false); for (var i = 0, connection; connection = connections[i]; i++) { - var neighbour = - connection.closest(Blockly.SNAP_RADIUS, blockX, blockY); + var neighbour = connection.closest(Blockly.SNAP_RADIUS, + new goog.math.Coordinate(blockX, blockY)); if (neighbour.connection) { collide = true; break; @@ -530,6 +557,10 @@ Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { } while (collide); block.moveBy(blockX, blockY); } + Blockly.Events.enable(); + if (Blockly.Events.isEnabled() && !block.isShadow()) { + Blockly.Events.fire(new Blockly.Events.Create(block)); + } block.select(); }; @@ -538,29 +569,27 @@ Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { */ Blockly.WorkspaceSvg.prototype.recordDeleteAreas = function() { if (this.trashcan) { - this.deleteAreaTrash_ = this.trashcan.getRect(); + this.deleteAreaTrash_ = this.trashcan.getClientRect(); } else { this.deleteAreaTrash_ = null; } if (this.flyout_) { - this.deleteAreaToolbox_ = this.flyout_.getRect(); + this.deleteAreaToolbox_ = this.flyout_.getClientRect(); } else if (this.toolbox_) { - this.deleteAreaToolbox_ = this.toolbox_.getRect(); + this.deleteAreaToolbox_ = this.toolbox_.getClientRect(); } else { this.deleteAreaToolbox_ = null; } }; /** - * Is the mouse event over a delete area (toolbar or non-closing flyout)? + * Is the mouse event over a delete area (toolbox or non-closing flyout)? * Opens or closes the trashcan and sets the cursor as a side effect. * @param {!Event} e Mouse move event. * @return {boolean} True if event is in a delete area. */ Blockly.WorkspaceSvg.prototype.isDeleteArea = function(e) { - var isDelete = false; - var mouseXY = Blockly.mouseToSvg(e, Blockly.mainWorkspace.getParentSvg()); - var xy = new goog.math.Coordinate(mouseXY.x, mouseXY.y); + var xy = new goog.math.Coordinate(e.clientX, e.clientY); if (this.deleteAreaTrash_) { if (this.deleteAreaTrash_.contains(xy)) { this.trashcan.setOpen_(true); @@ -592,6 +621,7 @@ Blockly.WorkspaceSvg.prototype.onMouseDown_ = function(e) { Blockly.svgResize(this); Blockly.terminateDrag_(); // In case mouse-up event was lost. Blockly.hideChaff(); + Blockly.DropDownDiv.hide(); var isTargetWorkspace = e.target && e.target.nodeName && (e.target.nodeName.toLowerCase() == 'svg' || e.target == this.svgBackground_); @@ -603,7 +633,6 @@ Blockly.WorkspaceSvg.prototype.onMouseDown_ = function(e) { // Right-click. this.showContextMenu_(e); } else if (this.scrollbar) { - Blockly.removeAllRanges(); // If the workspace is editable, only allow scrolling when gripping empty // space. Otherwise, allow scrolling when gripping anywhere. this.isScrolling = true; @@ -619,30 +648,31 @@ Blockly.WorkspaceSvg.prototype.onMouseDown_ = function(e) { // See comment in inject.js Blockly.init_ as to why mouseup events are // bound to the document instead of the SVG's surface. if ('mouseup' in Blockly.bindEvent_.TOUCH_MAP) { - Blockly.onTouchUpWrapper_ = - Blockly.bindEvent_(document, 'mouseup', null, Blockly.onMouseUp_); + Blockly.onTouchUpWrapper_ = Blockly.onTouchUpWrapper_ || []; + Blockly.onTouchUpWrapper_ = Blockly.onTouchUpWrapper_.concat( + Blockly.bindEvent_(document, 'mouseup', null, Blockly.onMouseUp_)); } - Blockly.onMouseMoveWrapper_ = - Blockly.bindEvent_(document, 'mousemove', null, Blockly.onMouseMove_); + Blockly.onMouseMoveWrapper_ = Blockly.onMouseMoveWrapper_ || []; + Blockly.onMouseMoveWrapper_ = Blockly.onMouseMoveWrapper_.concat( + Blockly.bindEvent_(document, 'mousemove', null, Blockly.onMouseMove_)); } // This event has been handled. No need to bubble up to the document. e.stopPropagation(); + e.preventDefault(); }; /** * Start tracking a drag of an object on this workspace. * @param {!Event} e Mouse down event. - * @param {number} x Starting horizontal location of object. - * @param {number} y Starting vertical location of object. + * @param {!goog.math.Coordinate} xy Starting location of object. */ -Blockly.WorkspaceSvg.prototype.startDrag = function(e, x, y) { +Blockly.WorkspaceSvg.prototype.startDrag = function(e, xy) { // Record the starting offset between the bubble's location and the mouse. var point = Blockly.mouseToSvg(e, this.getParentSvg()); // Fix scale of mouse event. point.x /= this.scale; point.y /= this.scale; - this.dragDeltaX_ = x - point.x; - this.dragDeltaY_ = y - point.y; + this.dragDeltaXY_ = goog.math.Coordinate.difference(xy, point); }; /** @@ -655,9 +685,7 @@ Blockly.WorkspaceSvg.prototype.moveDrag = function(e) { // Fix scale of mouse event. point.x /= this.scale; point.y /= this.scale; - var x = this.dragDeltaX_ + point.x; - var y = this.dragDeltaY_ + point.y; - return new goog.math.Coordinate(x, y); + return goog.math.Coordinate.sum(this.dragDeltaXY_, point); }; /** @@ -667,18 +695,72 @@ Blockly.WorkspaceSvg.prototype.moveDrag = function(e) { */ Blockly.WorkspaceSvg.prototype.onMouseWheel_ = function(e) { // TODO: Remove terminateDrag and compensate for coordinate skew during zoom. - Blockly.terminateDrag_(); - var delta = e.deltaY > 0 ? -1 : 1; - var position = Blockly.mouseToSvg(e, this.getParentSvg()); - this.zoom(position.x, position.y, delta); + if (e.ctrlKey) { + // Pinch-to-zoom in Chrome only + Blockly.terminateDrag_(); + var delta = e.deltaY > 0 ? -1 : 1; + var position = Blockly.mouseToSvg(e, this.getParentSvg()); + this.zoom(position.x, position.y, delta); + } else { + // This is a regular mouse wheel event - scroll the workspace + // First hide the WidgetDiv without animation + // (mouse scroll makes field out of place with div) + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); + var x = this.scrollX - e.deltaX; + var y = this.scrollY - e.deltaY; + this.startDragMetrics = this.getMetrics(); + this.scroll(x, y); + } e.preventDefault(); }; +/** + * Calculate the bounding box for the blocks on the workspace. + * + * @return {Object} Contains the position and size of the bounding box + * containing the blocks on the workspace. + */ +Blockly.WorkspaceSvg.prototype.getBlocksBoundingBox = function() { + var topBlocks = this.getTopBlocks(); + // There are no blocks, return empty rectangle. + if (!topBlocks.length) { + return {x: 0, y: 0, width: 0, height: 0}; + } + + // Initialize boundary using the first block. + var boundary = topBlocks[0].getBoundingRectangle(); + + // Start at 1 since the 0th block was used for initialization + for (var i = 1; i < topBlocks.length; i++) { + var blockBoundary = topBlocks[i].getBoundingRectangle(); + if (blockBoundary.topLeft.x < boundary.topLeft.x) { + boundary.topLeft.x = blockBoundary.topLeft.x; + } + if (blockBoundary.bottomRight.x > boundary.bottomRight.x) { + boundary.bottomRight.x = blockBoundary.bottomRight.x; + } + if (blockBoundary.topLeft.y < boundary.topLeft.y) { + boundary.topLeft.y = blockBoundary.topLeft.y; + } + if (blockBoundary.bottomRight.y > boundary.bottomRight.y) { + boundary.bottomRight.y = blockBoundary.bottomRight.y; + } + } + return { + x: boundary.topLeft.x, + y: boundary.topLeft.y, + width: boundary.bottomRight.x - boundary.topLeft.x, + height: boundary.bottomRight.y - boundary.topLeft.y + }; +}; + /** * Clean up the workspace by ordering all the blocks in a column. * @private */ Blockly.WorkspaceSvg.prototype.cleanUp_ = function() { + Blockly.Events.setGroup(true); var topBlocks = this.getTopBlocks(true); var cursorY = 0; for (var i = 0, block; block = topBlocks[i]; i++) { @@ -688,9 +770,9 @@ Blockly.WorkspaceSvg.prototype.cleanUp_ = function() { cursorY = block.getRelativeToSurfaceXY().y + block.getHeightWidth().height + Blockly.BlockSvg.MIN_BLOCK_Y; } + Blockly.Events.setGroup(false); // Fire an event to allow scrollbars to resize. - Blockly.fireUiEvent(window, 'resize'); - this.fireChangeEvent(); + Blockly.asyncSvgResize(this); }; /** @@ -704,12 +786,28 @@ Blockly.WorkspaceSvg.prototype.showContextMenu_ = function(e) { } var menuOptions = []; var topBlocks = this.getTopBlocks(true); + var eventGroup = Blockly.genUid(); + + // Options to undo/redo previous action. + var undoOption = {}; + undoOption.text = Blockly.Msg.UNDO; + undoOption.enabled = this.undoStack_.length > 0; + undoOption.callback = this.undo.bind(this, false); + menuOptions.push(undoOption); + var redoOption = {}; + redoOption.text = Blockly.Msg.REDO; + redoOption.enabled = this.redoStack_.length > 0; + redoOption.callback = this.undo.bind(this, true); + menuOptions.push(redoOption); + // Option to clean up blocks. - var cleanOption = {}; - cleanOption.text = Blockly.Msg.CLEAN_UP; - cleanOption.enabled = topBlocks.length > 1; - cleanOption.callback = this.cleanUp_.bind(this); - menuOptions.push(cleanOption); + if (this.scrollbar) { + var cleanOption = {}; + cleanOption.text = Blockly.Msg.CLEAN_UP; + cleanOption.enabled = topBlocks.length > 1; + cleanOption.callback = this.cleanUp_.bind(this); + menuOptions.push(cleanOption); + } // Add a little animation to collapsing and expanding. var DELAY = 10; @@ -779,7 +877,7 @@ Blockly.WorkspaceSvg.prototype.showContextMenu_ = function(e) { addDeletableBlocks(topBlocks[i]); } var deleteOption = { - text: deleteList.length <= 1 ? Blockly.Msg.DELETE_BLOCK : + text: deleteList.length == 1 ? Blockly.Msg.DELETE_BLOCK : Blockly.Msg.DELETE_X_BLOCKS.replace('%1', String(deleteList.length)), enabled: deleteList.length > 0, callback: function() { @@ -791,6 +889,7 @@ Blockly.WorkspaceSvg.prototype.showContextMenu_ = function(e) { } }; function deleteNext() { + Blockly.Events.setGroup(eventGroup); var block = deleteList.shift(); if (block) { if (block.workspace) { @@ -800,6 +899,7 @@ Blockly.WorkspaceSvg.prototype.showContextMenu_ = function(e) { deleteNext(); } } + Blockly.Events.setGroup(false); } menuOptions.push(deleteOption); @@ -865,6 +965,10 @@ Blockly.WorkspaceSvg.prototype.preloadAudio_ = function() { * @param {number=} opt_volume Volume of sound (0-1). */ Blockly.WorkspaceSvg.prototype.playAudio = function(name, opt_volume) { + // Send a UI event in case we wish to play the sound externally + var event = new Blockly.Events.Ui(null, 'sound', null, name); + event.workspaceId = this.id; + Blockly.Events.fire(event); var sound = this.SOUNDS_[name]; if (sound) { var mySound; @@ -891,18 +995,17 @@ Blockly.WorkspaceSvg.prototype.playAudio = function(name, opt_volume) { * @param {Node|string} tree DOM tree of blocks, or text representation of same. */ Blockly.WorkspaceSvg.prototype.updateToolbox = function(tree) { - tree = Blockly.parseToolboxTree_(tree); + tree = Blockly.Options.parseToolboxTree(tree); if (!tree) { if (this.options.languageTree) { throw 'Can\'t nullify an existing toolbox.'; } - // No change (null to null). - return; + return; // No change (null to null). } if (!this.options.languageTree) { throw 'Existing toolbox is null. Can\'t create new toolbox.'; } - if (this.options.hasCategories) { + if (tree.getElementsByTagName('category').length) { if (!this.toolbox_) { throw 'Existing toolbox has no categories. Can\'t change mode.'; } @@ -918,31 +1021,6 @@ Blockly.WorkspaceSvg.prototype.updateToolbox = function(tree) { } }; -/** - * When something in this workspace changes, call a function. - * @param {!Function} func Function to call. - * @return {!Array.} Opaque data that can be passed to - * removeChangeListener. - */ -Blockly.WorkspaceSvg.prototype.addChangeListener = function(func) { - var wrapper = Blockly.bindEvent_(this.getCanvas(), - 'blocklyWorkspaceChange', null, func); - Array.prototype.push.apply(this.eventWrappers_, wrapper); - return wrapper; -}; - -/** - * Stop listening for this workspace's changes. - * @param {!Array.} bindData Opaque data from addChangeListener. - */ -Blockly.WorkspaceSvg.prototype.removeChangeListener = function(bindData) { - Blockly.unbindEvent_(bindData); - var i = this.eventWrappers_.indexOf(bindData); - if (i != -1) { - this.eventWrappers_.splice(i, 1); - } -}; - /** * Mark this workspace as the currently focused main workspace. */ @@ -979,27 +1057,21 @@ Blockly.WorkspaceSvg.prototype.zoom = function(x, y, type) { } else if (newScale < this.options.zoomOptions.minScale) { scaleChange = this.options.zoomOptions.minScale / this.scale; } - var matrix = canvas.getCTM() - .translate(x * (1 - scaleChange), y * (1 - scaleChange)) - .scale(scaleChange); - // newScale and matrix.a should be identical (within a rounding error). - if (this.scale == matrix.a) { + if (this.scale == newScale) { return; // No change in zoom. } - this.scale = matrix.a; - this.scrollX = matrix.e - metrics.absoluteLeft; - this.scrollY = matrix.f - metrics.absoluteTop; - this.updateGridPattern_(); if (this.scrollbar) { - this.scrollbar.resize(); - } else { - this.translate(0, 0); - } - Blockly.hideChaff(false); - if (this.flyout_) { - // No toolbox, resize flyout. - this.flyout_.reflow(); - } + var matrix = canvas.getCTM() + .translate(x * (1 - scaleChange), y * (1 - scaleChange)) + .scale(scaleChange); + // newScale and matrix.a should be identical (within a rounding error). + this.scrollX = matrix.e - metrics.absoluteLeft; + this.scrollY = matrix.f - metrics.absoluteTop; + } + this.setScale(newScale); + // Hide the WidgetDiv without animation (zoom makes field out of place with div) + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); }; /** @@ -1014,31 +1086,103 @@ Blockly.WorkspaceSvg.prototype.zoomCenter = function(type) { }; /** - * Reset zooming and dragging. - * @param {!Event} e Mouse down event. + * Zoom the blocks to fit in the workspace if possible. */ -Blockly.WorkspaceSvg.prototype.zoomReset = function(e) { - this.scale = 1; - this.updateGridPattern_(); - Blockly.hideChaff(false); +Blockly.WorkspaceSvg.prototype.zoomToFit = function() { + var metrics = this.getMetrics(); + var blocksBox = this.getBlocksBoundingBox(); + var blocksWidth = blocksBox.width; + var blocksHeight = blocksBox.height; + if (!blocksWidth) { + return; // Prevents zooming to infinity. + } + var workspaceWidth = metrics.viewWidth; + var workspaceHeight = metrics.viewHeight; if (this.flyout_) { - // No toolbox, resize flyout. - this.flyout_.reflow(); + workspaceWidth -= this.flyout_.width_; } - // Zoom level has changed, update the scrollbars. - if (this.scrollbar) { - this.scrollbar.resize(); + if (!this.scrollbar) { + // Orgin point of 0,0 is fixed, blocks will not scroll to center. + blocksWidth += metrics.contentLeft; + blocksHeight += metrics.contentTop; + } + var ratioX = workspaceWidth / blocksWidth; + var ratioY = workspaceHeight / blocksHeight; + this.setScale(Math.min(ratioX, ratioY)); + this.scrollCenter(); +}; + +/** + * Center the workspace. + */ +Blockly.WorkspaceSvg.prototype.scrollCenter = function() { + if (!this.scrollbar) { + // Can't center a non-scrolling workspace. + return; } - // Center the workspace. + // Hide the WidgetDiv without animation (zoom makes field out of place with div) + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); + Blockly.hideChaff(false); var metrics = this.getMetrics(); + var x = (metrics.contentWidth - metrics.viewWidth) / 2; + if (this.flyout_) { + x -= this.flyout_.width_ / 2; + } + var y = (metrics.contentHeight - metrics.viewHeight) / 2; + this.scrollbar.set(x, y); +}; + +/** + * Set the workspace's zoom factor. + * @param {number} newScale Zoom factor. + */ +Blockly.WorkspaceSvg.prototype.setScale = function(newScale) { + if (this.options.zoomOptions.maxScale && + newScale > this.options.zoomOptions.maxScale) { + newScale = this.options.zoomOptions.maxScale; + } else if (this.options.zoomOptions.minScale && + newScale < this.options.zoomOptions.minScale) { + newScale = this.options.zoomOptions.minScale; + } + this.scale = newScale; + this.updateGridPattern_(); + // Hide the WidgetDiv without animation (zoom makes field out of place with div) + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); if (this.scrollbar) { - this.scrollbar.set((metrics.contentWidth - metrics.viewWidth) / 2, - (metrics.contentHeight - metrics.viewHeight) / 2); + this.scrollbar.resize(); } else { - this.translate(0, 0); + this.translate(this.scrollX, this.scrollY); } - // This event has been handled. Don't start a workspace drag. - e.stopPropagation(); + Blockly.hideChaff(false); + if (this.flyout_) { + // No toolbox, resize flyout. + this.flyout_.reflow(); + } +}; + +/** + * Scroll the workspace by a specified amount, keeping in the bounds. + * Be sure to set this.startDragMetrics with cached metrics before calling. + * @param {number} x Target X to scroll to + * @param {number} y Target Y to scroll to + */ +Blockly.WorkspaceSvg.prototype.scroll = function(x, y) { + var metrics = this.startDragMetrics; // Cached values + x = Math.min(x, -metrics.contentLeft); + y = Math.min(y, -metrics.contentTop); + x = Math.max(x, metrics.viewWidth - metrics.contentLeft - + metrics.contentWidth); + y = Math.max(y, metrics.viewHeight - metrics.contentTop - + metrics.contentHeight); + // When the workspace starts scrolling, hide the WidgetDiv without animation. + // This is to prevent a dispoal animation from happening in the wrong location. + Blockly.WidgetDiv.hide(true); + Blockly.DropDownDiv.hideWithoutAnimation(); + // Move the scrollbars and the page will scroll automatically. + this.scrollbar.set(-x - metrics.contentLeft, + -y - metrics.contentTop); }; /** @@ -1080,7 +1224,3 @@ Blockly.WorkspaceSvg.prototype.updateGridPattern_ = function() { // Export symbols that would otherwise be renamed by Closure compiler. Blockly.WorkspaceSvg.prototype['setVisible'] = Blockly.WorkspaceSvg.prototype.setVisible; -Blockly.WorkspaceSvg.prototype['addChangeListener'] = - Blockly.WorkspaceSvg.prototype.addChangeListener; -Blockly.WorkspaceSvg.prototype['removeChangeListener'] = - Blockly.WorkspaceSvg.prototype.removeChangeListener; diff --git a/core/xml.js b/core/xml.js index fc696d7255..88837d0df5 100644 --- a/core/xml.js +++ b/core/xml.js @@ -37,35 +37,41 @@ goog.require('goog.dom'); * @return {!Element} XML document. */ Blockly.Xml.workspaceToDom = function(workspace) { - var width; // Not used in LTR. - if (workspace.RTL) { - width = workspace.getWidth(); - } var xml = goog.dom.createDom('xml'); var blocks = workspace.getTopBlocks(true); for (var i = 0, block; block = blocks[i]; i++) { - var element = Blockly.Xml.blockToDom_(block); - var xy = block.getRelativeToSurfaceXY(); - element.setAttribute('x', Math.round(workspace.RTL ? width - xy.x : xy.x)); - element.setAttribute('y', Math.round(xy.y)); - xml.appendChild(element); + xml.appendChild(Blockly.Xml.blockToDomWithXY(block)); } return xml; }; +/** + * Encode a block subtree as XML with XY coordinates. + * @param {!Blockly.Block} block The root block to encode. + * @return {!Element} Tree of XML elements. + */ +Blockly.Xml.blockToDomWithXY = function(block) { + var width; // Not used in LTR. + if (block.workspace.RTL) { + width = block.workspace.getWidth(); + } + var element = Blockly.Xml.blockToDom(block); + var xy = block.getRelativeToSurfaceXY(); + element.setAttribute('x', + Math.round(block.workspace.RTL ? width - xy.x : xy.x)); + element.setAttribute('y', Math.round(xy.y)); + return element; +}; + /** * Encode a block subtree as XML. * @param {!Blockly.Block} block The root block to encode. * @return {!Element} Tree of XML elements. - * @private */ -Blockly.Xml.blockToDom_ = function(block) { +Blockly.Xml.blockToDom = function(block) { var element = goog.dom.createDom(block.isShadow() ? 'shadow' : 'block'); element.setAttribute('type', block.type); - if (false) { - // Only used by realtime. - element.setAttribute('id', block.id); - } + element.setAttribute('id', block.id); if (block.mutationToDom) { // Custom data for an advanced block. var mutation = block.mutationToDom(); @@ -120,7 +126,7 @@ Blockly.Xml.blockToDom_ = function(block) { container.appendChild(Blockly.Xml.cloneShadow_(shadow)); } if (childBlock) { - container.appendChild(Blockly.Xml.blockToDom_(childBlock)); + container.appendChild(Blockly.Xml.blockToDom(childBlock)); empty = false; } } @@ -151,7 +157,7 @@ Blockly.Xml.blockToDom_ = function(block) { var nextBlock = block.getNextBlock(); if (nextBlock) { var container = goog.dom.createDom('next', null, - Blockly.Xml.blockToDom_(nextBlock)); + Blockly.Xml.blockToDom(nextBlock)); element.appendChild(container); } var shadow = block.nextConnection && block.nextConnection.getShadowDom(); @@ -262,10 +268,17 @@ Blockly.Xml.textToDom = function(text) { /** * Decode an XML DOM and create blocks on the workspace. - * @param {!Blockly.Workspace} workspace The workspace. * @param {!Element} xml XML DOM. + * @param {!Blockly.Workspace} workspace The workspace. */ -Blockly.Xml.domToWorkspace = function(workspace, xml) { +Blockly.Xml.domToWorkspace = function(xml, workspace) { + if (xml instanceof Blockly.Workspace) { + var swap = xml; + xml = workspace; + workspace = swap; + console.warn('Deprecated call to Blockly.Xml.domToWorkspace, ' + + 'swap the arguments.'); + } var width; // Not used in LTR. if (workspace.RTL) { width = workspace.getWidth(); @@ -275,11 +288,15 @@ Blockly.Xml.domToWorkspace = function(workspace, xml) { // children beyond the lists' length. Trust the length, do not use the // looping pattern of checking the index for an object. var childCount = xml.childNodes.length; + var existingGroup = Blockly.Events.getGroup(); + if (!existingGroup) { + Blockly.Events.setGroup(true); + } for (var i = 0; i < childCount; i++) { var xmlChild = xml.childNodes[i]; var name = xmlChild.nodeName.toLowerCase(); if (name == 'block' || name == 'shadow') { - var block = Blockly.Xml.domToBlock(workspace, xmlChild); + var block = Blockly.Xml.domToBlock(xmlChild, workspace); var blockX = parseInt(xmlChild.getAttribute('x'), 10); var blockY = parseInt(xmlChild.getAttribute('y'), 10); if (!isNaN(blockX) && !isNaN(blockY)) { @@ -287,19 +304,30 @@ Blockly.Xml.domToWorkspace = function(workspace, xml) { } } } + if (!existingGroup) { + Blockly.Events.setGroup(false); + } Blockly.Field.stopCache(); }; /** * Decode an XML block tag and create a block (and possibly sub blocks) on the * workspace. - * @param {!Blockly.Workspace} workspace The workspace. * @param {!Element} xmlBlock XML block element. + * @param {!Blockly.Workspace} workspace The workspace. * @return {!Blockly.Block} The root block created. */ -Blockly.Xml.domToBlock = function(workspace, xmlBlock) { +Blockly.Xml.domToBlock = function(xmlBlock, workspace) { + if (xmlBlock instanceof Blockly.Workspace) { + var swap = xmlBlock; + xmlBlock = workspace; + workspace = swap; + console.warn('Deprecated call to Blockly.Xml.domToBlock, ' + + 'swap the arguments.'); + } // Create top-level block. - var topBlock = Blockly.Xml.domToBlockHeadless_(workspace, xmlBlock); + Blockly.Events.disable(); + var topBlock = Blockly.Xml.domToBlockHeadless_(xmlBlock, workspace); if (workspace.rendered) { // Hide connections to speed up assembly. topBlock.setConnectionsHidden(true); @@ -313,15 +341,23 @@ Blockly.Xml.domToBlock = function(workspace, xmlBlock) { blocks[i].render(false); } // Populating the connection database may be defered until after the blocks - // have renderend. - setTimeout(function() { - if (topBlock.workspace) { // Check that the block hasn't been deleted. - topBlock.setConnectionsHidden(false); - } - }, 1); + // have rendered. + if (!workspace.isFlyout) { + setTimeout(function() { + if (topBlock.workspace) { // Check that the block hasn't been deleted. + topBlock.setConnectionsHidden(false); + } + }, 1); + } topBlock.updateDisabled(); // Fire an event to allow scrollbars to resize. - Blockly.fireUiEvent(window, 'resize'); + if (!workspace.isFlyout) { + Blockly.asyncSvgResize(workspace); + } + } + Blockly.Events.enable(); + if (Blockly.Events.isEnabled()) { + Blockly.Events.fire(new Blockly.Events.Create(topBlock)); } return topBlock; }; @@ -329,12 +365,12 @@ Blockly.Xml.domToBlock = function(workspace, xmlBlock) { /** * Decode an XML block tag and create a block (and possibly sub blocks) on the * workspace. - * @param {!Blockly.Workspace} workspace The workspace. * @param {!Element} xmlBlock XML block element. + * @param {!Blockly.Workspace} workspace The workspace. * @return {!Blockly.Block} The root block created. * @private */ -Blockly.Xml.domToBlockHeadless_ = function(workspace, xmlBlock) { +Blockly.Xml.domToBlockHeadless_ = function(xmlBlock, workspace) { var block = null; var prototypeName = xmlBlock.getAttribute('type'); if (!prototypeName) { @@ -354,7 +390,6 @@ Blockly.Xml.domToBlockHeadless_ = function(workspace, xmlBlock) { // Find any enclosed blocks or shadows in this tag. var childBlockNode = null; var childShadowNode = null; - var shadowActive = false; for (var j = 0, grandchildNode; grandchildNode = xmlChild.childNodes[j]; j++) { if (grandchildNode.nodeType == 1) { @@ -368,7 +403,6 @@ Blockly.Xml.domToBlockHeadless_ = function(workspace, xmlBlock) { // Use the shadow block if there is no child block. if (!childBlockNode && childShadowNode) { childBlockNode = childShadowNode; - shadowActive = true; } var name = xmlChild.getAttribute('name'); @@ -429,8 +463,8 @@ Blockly.Xml.domToBlockHeadless_ = function(workspace, xmlBlock) { input.connection.setShadowDom(childShadowNode); } if (childBlockNode) { - blockChild = Blockly.Xml.domToBlockHeadless_(workspace, - childBlockNode); + blockChild = Blockly.Xml.domToBlockHeadless_(childBlockNode, + workspace); if (blockChild.outputConnection) { input.connection.connect(blockChild.outputConnection); } else if (blockChild.previousConnection) { @@ -447,12 +481,12 @@ Blockly.Xml.domToBlockHeadless_ = function(workspace, xmlBlock) { if (childBlockNode) { if (!block.nextConnection) { throw 'Next statement does not exist.'; - } else if (block.nextConnection.targetConnection) { + } else if (block.nextConnection.isConnected()) { // This could happen if there is more than one XML 'next' tag. throw 'Next statement is already connected.'; } - blockChild = Blockly.Xml.domToBlockHeadless_(workspace, - childBlockNode); + blockChild = Blockly.Xml.domToBlockHeadless_(childBlockNode, + workspace); if (!blockChild.previousConnection) { throw 'Next block does not have previous statement.'; } diff --git a/core/zoom_controls.js b/core/zoom_controls.js index a4b674ac76..d50110829e 100644 --- a/core/zoom_controls.js +++ b/core/zoom_controls.js @@ -98,17 +98,17 @@ Blockly.ZoomControls.prototype.createDom = function() { - + - + - + */ @@ -162,14 +162,21 @@ Blockly.ZoomControls.prototype.createDom = function() { workspace.options.pathToMedia + Blockly.SPRITE.url); // Attach event listeners. - Blockly.bindEvent_(zoomresetSvg, 'mousedown', workspace, workspace.zoomReset); + Blockly.bindEvent_(zoomresetSvg, 'mousedown', null, function(e) { + workspace.setScale(1); + workspace.scrollCenter(); + e.stopPropagation(); // Don't start a workspace scroll. + e.preventDefault(); // Stop double-clicking from selecting text. + }); Blockly.bindEvent_(zoominSvg, 'mousedown', null, function(e) { workspace.zoomCenter(1); e.stopPropagation(); // Don't start a workspace scroll. + e.preventDefault(); // Stop double-clicking from selecting text. }); Blockly.bindEvent_(zoomoutSvg, 'mousedown', null, function(e) { workspace.zoomCenter(-1); e.stopPropagation(); // Don't start a workspace scroll. + e.preventDefault(); // Stop double-clicking from selecting text. }); return this.svgGroup_; diff --git a/dart_compressed.js b/dart_compressed.js deleted file mode 100644 index 7e5976da6e..0000000000 --- a/dart_compressed.js +++ /dev/null @@ -1,82 +0,0 @@ -// Do not edit this file; automatically generated by build.py. -'use strict'; - - -// Copyright 2014 Google Inc. Apache License 2.0 -Blockly.Dart=new Blockly.Generator("Dart");Blockly.Dart.addReservedWords("assert,break,case,catch,class,const,continue,default,do,else,enum,extends,false,final,finally,for,if,in,is,new,null,rethrow,return,super,switch,this,throw,true,try,var,void,while,with,print,identityHashCode,identical,BidirectionalIterator,Comparable,double,Function,int,Invocation,Iterable,Iterator,List,Map,Match,num,Pattern,RegExp,Set,StackTrace,String,StringSink,Type,bool,DateTime,Deprecated,Duration,Expando,Null,Object,RuneIterator,Runes,Stopwatch,StringBuffer,Symbol,Uri,Comparator,AbstractClassInstantiationError,ArgumentError,AssertionError,CastError,ConcurrentModificationError,CyclicInitializationError,Error,Exception,FallThroughError,FormatException,IntegerDivisionByZeroException,NoSuchMethodError,NullThrownError,OutOfMemoryError,RangeError,StackOverflowError,StateError,TypeError,UnimplementedError,UnsupportedError"); -Blockly.Dart.ORDER_ATOMIC=0;Blockly.Dart.ORDER_UNARY_POSTFIX=1;Blockly.Dart.ORDER_UNARY_PREFIX=2;Blockly.Dart.ORDER_MULTIPLICATIVE=3;Blockly.Dart.ORDER_ADDITIVE=4;Blockly.Dart.ORDER_SHIFT=5;Blockly.Dart.ORDER_BITWISE_AND=6;Blockly.Dart.ORDER_BITWISE_XOR=7;Blockly.Dart.ORDER_BITWISE_OR=8;Blockly.Dart.ORDER_RELATIONAL=9;Blockly.Dart.ORDER_EQUALITY=10;Blockly.Dart.ORDER_LOGICAL_AND=11;Blockly.Dart.ORDER_LOGICAL_OR=12;Blockly.Dart.ORDER_CONDITIONAL=13;Blockly.Dart.ORDER_CASCADE=14; -Blockly.Dart.ORDER_ASSIGNMENT=15;Blockly.Dart.ORDER_NONE=99; -Blockly.Dart.init=function(a){Blockly.Dart.definitions_=Object.create(null);Blockly.Dart.functionNames_=Object.create(null);Blockly.Dart.variableDB_?Blockly.Dart.variableDB_.reset():Blockly.Dart.variableDB_=new Blockly.Names(Blockly.Dart.RESERVED_WORDS_);var b=[];a=Blockly.Variables.allVariables(a);for(var c=0;c",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.Dart.ORDER_EQUALITY:Blockly.Dart.ORDER_RELATIONAL,d=Blockly.Dart.valueToCode(a,"A",c)||"0";a=Blockly.Dart.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -Blockly.Dart.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.Dart.ORDER_LOGICAL_AND:Blockly.Dart.ORDER_LOGICAL_OR,d=Blockly.Dart.valueToCode(a,"A",c);a=Blockly.Dart.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.Dart.logic_negate=function(a){var b=Blockly.Dart.ORDER_UNARY_PREFIX;return["!"+(Blockly.Dart.valueToCode(a,"BOOL",b)||"true"),b]}; -Blockly.Dart.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.logic_null=function(a){return["null",Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.logic_ternary=function(a){var b=Blockly.Dart.valueToCode(a,"IF",Blockly.Dart.ORDER_CONDITIONAL)||"false",c=Blockly.Dart.valueToCode(a,"THEN",Blockly.Dart.ORDER_CONDITIONAL)||"null";a=Blockly.Dart.valueToCode(a,"ELSE",Blockly.Dart.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.Dart.ORDER_CONDITIONAL]};Blockly.Dart.loops={}; -Blockly.Dart.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):Blockly.Dart.valueToCode(a,"TIMES",Blockly.Dart.ORDER_ASSIGNMENT)||"0",c=Blockly.Dart.statementToCode(a,"DO"),c=Blockly.Dart.addLoopTrap(c,a.id);a="";var d=Blockly.Dart.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE),e=b;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.Dart.variableDB_.getDistinctName("repeat_end",Blockly.Variables.NAME_TYPE),a+="var "+e+" = "+b+";\n"); -return a+("for (int "+d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};Blockly.Dart.controls_repeat=Blockly.Dart.controls_repeat_ext;Blockly.Dart.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.Dart.valueToCode(a,"BOOL",b?Blockly.Dart.ORDER_UNARY_PREFIX:Blockly.Dart.ORDER_NONE)||"false",d=Blockly.Dart.statementToCode(a,"DO"),d=Blockly.Dart.addLoopTrap(d,a.id);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; -Blockly.Dart.controls_for=function(a){var b=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Dart.valueToCode(a,"FROM",Blockly.Dart.ORDER_ASSIGNMENT)||"0",d=Blockly.Dart.valueToCode(a,"TO",Blockly.Dart.ORDER_ASSIGNMENT)||"0",e=Blockly.Dart.valueToCode(a,"BY",Blockly.Dart.ORDER_ASSIGNMENT)||"1",f=Blockly.Dart.statementToCode(a,"DO"),f=Blockly.Dart.addLoopTrap(f,a.id);if(Blockly.isNumber(c)&&Blockly.isNumber(d)&&Blockly.isNumber(e)){var g=parseFloat(c)<= -parseFloat(d);a="for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(parseFloat(e));a=(1==b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b))+(") {\n"+f+"}\n")}else a="",g=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(g=Blockly.Dart.variableDB_.getDistinctName(b+"_start",Blockly.Variables.NAME_TYPE),a+="var "+g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.Dart.variableDB_.getDistinctName(b+"_end",Blockly.Variables.NAME_TYPE),a+="var "+c+" = "+d+";\n"),d=Blockly.Dart.variableDB_.getDistinctName(b+ -"_inc",Blockly.Variables.NAME_TYPE),a+="num "+d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("("+e+").abs();\n"),a+="if ("+g+" > "+c+") {\n",a+=Blockly.Dart.INDENT+d+" = -"+d+";\n",a+="}\n",a+="for ("+b+" = "+g+";\n "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+";\n "+b+" += "+d+") {\n"+f+"}\n";return a}; -Blockly.Dart.controls_forEach=function(a){var b=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_ASSIGNMENT)||"[]",d=Blockly.Dart.statementToCode(a,"DO"),d=Blockly.Dart.addLoopTrap(d,a.id);return"for (var "+b+" in "+c+") {\n"+d+"}\n"}; -Blockly.Dart.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.Dart.math={};Blockly.Dart.addReservedWords("Math");Blockly.Dart.math_number=function(a){a=parseFloat(a.getFieldValue("NUM"));var b;Infinity==a?(a="double.INFINITY",b=Blockly.Dart.ORDER_UNARY_POSTFIX):-Infinity==a?(a="-double.INFINITY",b=Blockly.Dart.ORDER_UNARY_PREFIX):b=0>a?Blockly.Dart.ORDER_UNARY_PREFIX:Blockly.Dart.ORDER_ATOMIC;return[a,b]}; -Blockly.Dart.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Dart.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Dart.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Dart.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Dart.ORDER_MULTIPLICATIVE],POWER:[null,Blockly.Dart.ORDER_NONE]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.Dart.valueToCode(a,"A",b)||"0";a=Blockly.Dart.valueToCode(a,"B",b)||"0";return c?[d+c+a,b]:(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",["Math.pow("+d+", "+a+ -")",Blockly.Dart.ORDER_UNARY_POSTFIX])}; -Blockly.Dart.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_UNARY_PREFIX)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.Dart.ORDER_UNARY_PREFIX];Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";a="ABS"==b||"ROUND"==b.substring(0,5)?Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_UNARY_POSTFIX)||"0":"SIN"==b||"COS"==b||"TAN"==b?Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_MULTIPLICATIVE)|| -"0":Blockly.Dart.valueToCode(a,"NUM",Blockly.Dart.ORDER_NONE)||"0";switch(b){case "ABS":c=a+".abs()";break;case "ROOT":c="Math.sqrt("+a+")";break;case "LN":c="Math.log("+a+")";break;case "EXP":c="Math.exp("+a+")";break;case "POW10":c="Math.pow(10,"+a+")";break;case "ROUND":c=a+".round()";break;case "ROUNDUP":c=a+".ceil()";break;case "ROUNDDOWN":c=a+".floor()";break;case "SIN":c="Math.sin("+a+" / 180 * Math.PI)";break;case "COS":c="Math.cos("+a+" / 180 * Math.PI)";break;case "TAN":c="Math.tan("+a+ -" / 180 * Math.PI)"}if(c)return[c,Blockly.Dart.ORDER_UNARY_POSTFIX];switch(b){case "LOG10":c="Math.log("+a+") / Math.log(10)";break;case "ASIN":c="Math.asin("+a+") / Math.PI * 180";break;case "ACOS":c="Math.acos("+a+") / Math.PI * 180";break;case "ATAN":c="Math.atan("+a+") / Math.PI * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.Dart.ORDER_MULTIPLICATIVE]}; -Blockly.Dart.math_constant=function(a){var b={PI:["Math.PI",Blockly.Dart.ORDER_UNARY_POSTFIX],E:["Math.E",Blockly.Dart.ORDER_UNARY_POSTFIX],GOLDEN_RATIO:["(1 + Math.sqrt(5)) / 2",Blockly.Dart.ORDER_MULTIPLICATIVE],SQRT2:["Math.SQRT2",Blockly.Dart.ORDER_UNARY_POSTFIX],SQRT1_2:["Math.SQRT1_2",Blockly.Dart.ORDER_UNARY_POSTFIX],INFINITY:["double.INFINITY",Blockly.Dart.ORDER_ATOMIC]};a=a.getFieldValue("CONSTANT");"INFINITY"!=a&&(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;"); -return b[a]}; -Blockly.Dart.math_number_property=function(a){var b=Blockly.Dart.valueToCode(a,"NUMBER_TO_CHECK",Blockly.Dart.ORDER_MULTIPLICATIVE);if(!b)return["false",Blockly.Python.ORDER_ATOMIC];var c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",d=Blockly.Dart.provideFunction_("math_isPrime",["bool "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if (n == 2 || n == 3) {"," return true;", -" }"," // False if n is null, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3."," if (n == null || n <= 1 || n % 1 != 0 || n % 2 == 0 || n % 3 == 0) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {"," if (n % (x - 1) == 0 || n % (x + 1) == 0) {"," return false;"," }"," }"," return true;","}"])+"("+b+")",[d,Blockly.Dart.ORDER_UNARY_POSTFIX];switch(c){case "EVEN":d= -b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d=b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.Dart.valueToCode(a,"DIVISOR",Blockly.Dart.ORDER_MULTIPLICATIVE);if(!a)return["false",Blockly.Python.ORDER_ATOMIC];d=b+" % "+a+" == 0"}return[d,Blockly.Dart.ORDER_EQUALITY]}; -Blockly.Dart.math_change=function(a){var b=Blockly.Dart.valueToCode(a,"DELTA",Blockly.Dart.ORDER_ADDITIVE)||"0";a=Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = ("+a+" is num ? "+a+" : 0) + "+b+";\n"};Blockly.Dart.math_round=Blockly.Dart.math_single;Blockly.Dart.math_trig=Blockly.Dart.math_single; -Blockly.Dart.math_on_list=function(a){var b=a.getFieldValue("OP");a=Blockly.Dart.valueToCode(a,"LIST",Blockly.Dart.ORDER_NONE)||"[]";switch(b){case "SUM":b=Blockly.Dart.provideFunction_("math_sum",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," num sumVal = 0;"," myList.forEach((num entry) {sumVal += entry;});"," return sumVal;","}"]);b=b+"("+a+")";break;case "MIN":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_min", -["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," if (myList.isEmpty) return null;"," num minVal = myList[0];"," myList.forEach((num entry) {minVal = Math.min(minVal, entry);});"," return minVal;","}"]);b=b+"("+a+")";break;case "MAX":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_max",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," if (myList.isEmpty) return null;"," num maxVal = myList[0];", -" myList.forEach((num entry) {maxVal = Math.max(maxVal, entry);});"," return maxVal;","}"]);b=b+"("+a+")";break;case "AVERAGE":b=Blockly.Dart.provideFunction_("math_average",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List localList = new List.from(myList);"," localList.removeMatching((a) => a is! num);"," if (localList.isEmpty) return null;"," num sumVal = 0;"," localList.forEach((num entry) {sumVal += entry;});"," return sumVal / localList.length;", -"}"]);b=b+"("+a+")";break;case "MEDIAN":b=Blockly.Dart.provideFunction_("math_median",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only, then sort, then return middle value"," // or the average of two middle values if list has an even number of elements."," List localList = new List.from(myList);"," localList.removeMatching((a) => a is! num);"," if (localList.isEmpty) return null;"," localList.sort((a, b) => (a - b));"," int index = localList.length ~/ 2;", -" if (localList.length % 2 == 1) {"," return localList[index];"," } else {"," return (localList[index - 1] + localList[index]) / 2;"," }","}"]);b=b+"("+a+")";break;case "MODE":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_modes",["List "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List values) {"," List modes = [];"," List counts = [];"," int maxCount = 0;"," for (int i = 0; i < values.length; i++) {"," var value = values[i];", -" bool found = false;"," int thisCount;"," for (int j = 0; j < counts.length; j++) {"," if (counts[j][0] == value) {"," thisCount = ++counts[j][1];"," found = true;"," break;"," }"," }"," if (!found) {"," counts.add([value, 1]);"," thisCount = 1;"," }"," maxCount = Math.max(thisCount, maxCount);"," }"," for (int j = 0; j < counts.length; j++) {"," if (counts[j][1] == maxCount) {"," modes.add(counts[j][0]);"," }"," }"," return modes;", -"}"]);b=b+"("+a+")";break;case "STD_DEV":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_standard_deviation",["num "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," // First filter list for numbers only."," List numbers = new List.from(myList);"," numbers.removeMatching((a) => a is! num);"," if (numbers.isEmpty) return null;"," num n = numbers.length;"," num sum = 0;"," numbers.forEach((x) => sum += x);"," num mean = sum / n;", -" num sumSquare = 0;"," numbers.forEach((x) => sumSquare += Math.pow(x - mean, 2));"," return Math.sqrt(sumSquare / n);","}"]);b=b+"("+a+")";break;case "RANDOM":Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";b=Blockly.Dart.provideFunction_("math_random_item",["dynamic "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(List myList) {"," int x = new Math.Random().nextInt(myList.length);"," return myList[x];","}"]);b=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[b, -Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.math_modulo=function(a){var b=Blockly.Dart.valueToCode(a,"DIVIDEND",Blockly.Dart.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Dart.valueToCode(a,"DIVISOR",Blockly.Dart.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Dart.ORDER_MULTIPLICATIVE]}; -Blockly.Dart.math_constrain=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";var b=Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_NONE)||"0",c=Blockly.Dart.valueToCode(a,"LOW",Blockly.Dart.ORDER_NONE)||"0";a=Blockly.Dart.valueToCode(a,"HIGH",Blockly.Dart.ORDER_NONE)||"double.INFINITY";return["Math.min(Math.max("+b+", "+c+"), "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]}; -Blockly.Dart.math_random_int=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";var b=Blockly.Dart.valueToCode(a,"FROM",Blockly.Dart.ORDER_NONE)||"0";a=Blockly.Dart.valueToCode(a,"TO",Blockly.Dart.ORDER_NONE)||"0";return[Blockly.Dart.provideFunction_("math_random_int",["int "+Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_+"(num a, num b) {"," if (a > b) {"," // Swap a and b to ensure a is smaller."," num c = a;"," a = b;"," b = c;"," }"," return new Math.Random().nextInt(b - a + 1) + a;", -"}"])+"("+b+", "+a+")",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.math_random_float=function(a){Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;";return["new Math.Random().nextDouble()",Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.procedures={}; -Blockly.Dart.procedures_defreturn=function(a){var b=Blockly.Dart.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE),c=Blockly.Dart.statementToCode(a,"STACK");Blockly.Dart.STATEMENT_PREFIX&&(c=Blockly.Dart.prefixLines(Blockly.Dart.STATEMENT_PREFIX.replace(/%1/g,"'"+a.id+"'"),Blockly.Dart.INDENT)+c);Blockly.Dart.INFINITE_LOOP_TRAP&&(c=Blockly.Dart.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+c);var d=Blockly.Dart.valueToCode(a,"RETURN",Blockly.Dart.ORDER_NONE)||"";d&&(d=" return "+ -d+";\n");for(var e=d?"dynamic":"void",f=[],g=0;g list = str.split(exp);"," final title = new StringBuffer();"," for (String part in list) {"," if (part.length > 0) {", -" title.write(part[0].toUpperCase());"," if (part.length > 0) {"," title.write(part.substring(1).toLowerCase());"," }"," }"," }"," return title.toString();","}"]),a=Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''",a=b+"("+a+")");return[a,Blockly.Dart.ORDER_UNARY_POSTFIX]}; -Blockly.Dart.text_trim=function(a){var b={LEFT:".replaceFirst(new RegExp(r'^\\s+'), '')",RIGHT:".replaceFirst(new RegExp(r'\\s+$'), '')",BOTH:".trim()"}[a.getFieldValue("MODE")];return[(Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_UNARY_POSTFIX)||"''")+b,Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.text_print=function(a){return"print("+(Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''")+");\n"}; -Blockly.Dart.text_prompt_ext=function(a){Blockly.Dart.definitions_.import_dart_html="import 'dart:html' as Html;";var b="Html.window.prompt("+(a.getField("TEXT")?Blockly.Dart.quote_(a.getFieldValue("TEXT")):Blockly.Dart.valueToCode(a,"TEXT",Blockly.Dart.ORDER_NONE)||"''")+", '')";"NUMBER"==a.getFieldValue("TYPE")&&(Blockly.Dart.definitions_.import_dart_math="import 'dart:math' as Math;",b="Math.parseDouble("+b+")");return[b,Blockly.Dart.ORDER_UNARY_POSTFIX]};Blockly.Dart.text_prompt=Blockly.Dart.text_prompt_ext;Blockly.Dart.variables={};Blockly.Dart.variables_get=function(a){return[Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),Blockly.Dart.ORDER_ATOMIC]};Blockly.Dart.variables_set=function(a){var b=Blockly.Dart.valueToCode(a,"VALUE",Blockly.Dart.ORDER_ASSIGNMENT)||"0";return Blockly.Dart.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" = "+b+";\n"}; \ No newline at end of file diff --git a/demos/blockfactory/blocks.js b/demos/blockfactory/blocks.js deleted file mode 100644 index 52172f5db6..0000000000 --- a/demos/blockfactory/blocks.js +++ /dev/null @@ -1,751 +0,0 @@ -/** - * Blockly Demos: Block Factory Blocks - * - * 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 Blocks for Blockly's Block Factory application. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Blocks['factory_base'] = { - // Base of new block. - init: function() { - this.setColour(120); - this.appendDummyInput() - .appendField('name') - .appendField(new Blockly.FieldTextInput('math_foo'), 'NAME'); - this.appendStatementInput('INPUTS') - .setCheck('Input') - .appendField('inputs'); - var dropdown = new Blockly.FieldDropdown([ - ['automatic inputs', 'AUTO'], - ['external inputs', 'EXT'], - ['inline inputs', 'INT']]); - this.appendDummyInput() - .appendField(dropdown, 'INLINE'); - dropdown = new Blockly.FieldDropdown([ - ['no connections', 'NONE'], - ['← left output', 'LEFT'], - ['↕ top+bottom connections', 'BOTH'], - ['↑ top connection', 'TOP'], - ['↓ bottom connection', 'BOTTOM']], - function(option) { - this.sourceBlock_.updateShape_(option); - }); - this.appendDummyInput() - .appendField(dropdown, 'CONNECTIONS'); - this.appendValueInput('COLOUR') - .setCheck('Colour') - .appendField('colour'); - /* - this.appendValueInput('TOOLTIP') - .setCheck('String') - .appendField('tooltip'); - this.appendValueInput('HELP') - .setCheck('String') - .appendField('help url'); - */ - this.setTooltip('Build a custom block by plugging\n' + - 'fields, inputs and other blocks here.'); - this.setHelpUrl( - 'https://developers.google.com/blockly/custom-blocks/block-factory'); - }, - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('connections', this.getFieldValue('CONNECTIONS')); - return container; - }, - domToMutation: function(xmlElement) { - var connections = xmlElement.getAttribute('connections'); - this.updateShape_(connections); - }, - updateShape_: function(option) { - var outputExists = this.getInput('OUTPUTTYPE'); - var topExists = this.getInput('TOPTYPE'); - var bottomExists = this.getInput('BOTTOMTYPE'); - if (option == 'LEFT') { - if (!outputExists) { - this.appendValueInput('OUTPUTTYPE') - .setCheck('Type') - .appendField('output type'); - this.moveInputBefore('OUTPUTTYPE', 'COLOUR'); - } - } else if (outputExists) { - this.removeInput('OUTPUTTYPE'); - } - if (option == 'TOP' || option == 'BOTH') { - if (!topExists) { - this.appendValueInput('TOPTYPE') - .setCheck('Type') - .appendField('top type'); - this.moveInputBefore('TOPTYPE', 'COLOUR'); - } - } else if (topExists) { - this.removeInput('TOPTYPE'); - } - if (option == 'BOTTOM' || option == 'BOTH') { - if (!bottomExists) { - this.appendValueInput('BOTTOMTYPE') - .setCheck('Type') - .appendField('bottom type'); - this.moveInputBefore('BOTTOMTYPE', 'COLOUR'); - } - } else if (bottomExists) { - this.removeInput('BOTTOMTYPE'); - } - } -}; - -var ALIGNMENT_OPTIONS = - [['left', 'LEFT'], ['right', 'RIGHT'], ['centre', 'CENTRE']]; - -Blockly.Blocks['input_value'] = { - // Value input. - init: function() { - this.setColour(210); - this.appendDummyInput() - .appendField('value input') - .appendField(new Blockly.FieldTextInput('NAME'), 'INPUTNAME'); - this.appendStatementInput('FIELDS') - .setCheck('Field') - .appendField('fields') - .appendField(new Blockly.FieldDropdown(ALIGNMENT_OPTIONS), 'ALIGN'); - this.appendValueInput('TYPE') - .setCheck('Type') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField('type'); - this.setPreviousStatement(true, 'Input'); - this.setNextStatement(true, 'Input'); - this.setTooltip('A value socket for horizontal connections.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=71'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - inputNameCheck(this); - } -}; - -Blockly.Blocks['input_statement'] = { - // Statement input. - init: function() { - this.setColour(210); - this.appendDummyInput() - .appendField('statement input') - .appendField(new Blockly.FieldTextInput('NAME'), 'INPUTNAME'); - this.appendStatementInput('FIELDS') - .setCheck('Field') - .appendField('fields') - .appendField(new Blockly.FieldDropdown(ALIGNMENT_OPTIONS), 'ALIGN'); - this.appendValueInput('TYPE') - .setCheck('Type') - .setAlign(Blockly.ALIGN_RIGHT) - .appendField('type'); - this.setPreviousStatement(true, 'Input'); - this.setNextStatement(true, 'Input'); - this.setTooltip('A statement socket for enclosed vertical stacks.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=246'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - inputNameCheck(this); - } -}; - -Blockly.Blocks['input_dummy'] = { - // Dummy input. - init: function() { - this.setColour(210); - this.appendDummyInput() - .appendField('dummy input'); - this.appendStatementInput('FIELDS') - .setCheck('Field') - .appendField('fields') - .appendField(new Blockly.FieldDropdown(ALIGNMENT_OPTIONS), 'ALIGN'); - this.setPreviousStatement(true, 'Input'); - this.setNextStatement(true, 'Input'); - this.setTooltip('For adding fields on a separate row with no ' + - 'connections. Alignment options (left, right, centre) ' + - 'apply only to multi-line fields.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=293'); - } -}; - -Blockly.Blocks['field_static'] = { - // Text value. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('text') - .appendField(new Blockly.FieldTextInput(''), 'TEXT'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Static text that serves as a label.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=88'); - } -}; - -Blockly.Blocks['field_input'] = { - // Text input. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('text input') - .appendField(new Blockly.FieldTextInput('default'), 'TEXT') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('An input field for the user to enter text.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=319'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_angle'] = { - // Angle input. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('angle input') - .appendField(new Blockly.FieldAngle('90'), 'ANGLE') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('An input field for the user to enter an angle.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=372'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_dropdown'] = { - // Dropdown menu. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('dropdown') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.appendDummyInput('OPTION0') - .appendField(new Blockly.FieldTextInput('option'), 'USER0') - .appendField(',') - .appendField(new Blockly.FieldTextInput('OPTIONNAME'), 'CPU0'); - this.appendDummyInput('OPTION1') - .appendField(new Blockly.FieldTextInput('option'), 'USER1') - .appendField(',') - .appendField(new Blockly.FieldTextInput('OPTIONNAME'), 'CPU1'); - this.appendDummyInput('OPTION2') - .appendField(new Blockly.FieldTextInput('option'), 'USER2') - .appendField(',') - .appendField(new Blockly.FieldTextInput('OPTIONNAME'), 'CPU2'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setMutator(new Blockly.Mutator(['field_dropdown_option'])); - this.setTooltip('Dropdown menu with a list of options.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=386'); - this.optionCount_ = 3; - }, - mutationToDom: function(workspace) { - var container = document.createElement('mutation'); - container.setAttribute('options', this.optionCount_); - return container; - }, - domToMutation: function(container) { - for (var x = 0; x < this.optionCount_; x++) { - this.removeInput('OPTION' + x); - } - this.optionCount_ = parseInt(container.getAttribute('options'), 10); - for (var x = 0; x < this.optionCount_; x++) { - var input = this.appendDummyInput('OPTION' + x); - input.appendField(new Blockly.FieldTextInput('option'), 'USER' + x); - input.appendField(','); - input.appendField(new Blockly.FieldTextInput('OPTIONNAME'), 'CPU' + x); - } - }, - decompose: function(workspace) { - var containerBlock = workspace.newBlock('field_dropdown_container'); - containerBlock.initSvg(); - var connection = containerBlock.getInput('STACK').connection; - for (var x = 0; x < this.optionCount_; x++) { - var optionBlock = workspace.newBlock('field_dropdown_option'); - optionBlock.initSvg(); - connection.connect(optionBlock.previousConnection); - connection = optionBlock.nextConnection; - } - return containerBlock; - }, - compose: function(containerBlock) { - // Disconnect all input blocks and remove all inputs. - for (var x = this.optionCount_ - 1; x >= 0; x--) { - this.removeInput('OPTION' + x); - } - this.optionCount_ = 0; - // Rebuild the block's inputs. - var optionBlock = containerBlock.getInputTargetBlock('STACK'); - while (optionBlock) { - this.appendDummyInput('OPTION' + this.optionCount_) - .appendField(new Blockly.FieldTextInput( - optionBlock.userData_ || 'option'), 'USER' + this.optionCount_) - .appendField(',') - .appendField(new Blockly.FieldTextInput( - optionBlock.cpuData_ || 'OPTIONNAME'), 'CPU' + this.optionCount_); - this.optionCount_++; - optionBlock = optionBlock.nextConnection && - optionBlock.nextConnection.targetBlock(); - } - }, - saveConnections: function(containerBlock) { - // Store names and values for each option. - var optionBlock = containerBlock.getInputTargetBlock('STACK'); - var x = 0; - while (optionBlock) { - optionBlock.userData_ = this.getFieldValue('USER' + x); - optionBlock.cpuData_ = this.getFieldValue('CPU' + x); - x++; - optionBlock = optionBlock.nextConnection && - optionBlock.nextConnection.targetBlock(); - } - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - if (this.optionCount_ < 1) { - this.setWarningText('Drop down menu must\nhave at least one option.'); - } else { - fieldNameCheck(this); - } - } -}; - -Blockly.Blocks['field_dropdown_container'] = { - // Container. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('add options'); - this.appendStatementInput('STACK'); - this.setTooltip('Add, remove, or reorder options\n' + - 'to reconfigure this dropdown menu.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=386'); - this.contextMenu = false; - } -}; - -Blockly.Blocks['field_dropdown_option'] = { - // Add option. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('option'); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip('Add a new option to the dropdown menu.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=386'); - this.contextMenu = false; - } -}; - -Blockly.Blocks['field_checkbox'] = { - // Checkbox. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('checkbox') - .appendField(new Blockly.FieldCheckbox('TRUE'), 'CHECKED') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Checkbox field.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=485'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_colour'] = { - // Colour input. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('colour') - .appendField(new Blockly.FieldColour('#ff0000'), 'COLOUR') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Colour input field.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=495'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_date'] = { - // Date input. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('date') - .appendField(new Blockly.FieldDate(), 'DATE') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Date input field.'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_variable'] = { - // Dropdown for variables. - init: function() { - this.setColour(160); - this.appendDummyInput() - .appendField('variable') - .appendField(new Blockly.FieldTextInput('item'), 'TEXT') - .appendField(',') - .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Dropdown menu for variable names.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=510'); - }, - onchange: function() { - if (!this.workspace) { - // Block has been deleted. - return; - } - fieldNameCheck(this); - } -}; - -Blockly.Blocks['field_image'] = { - // Image. - init: function() { - this.setColour(160); - var src = 'https://www.gstatic.com/codesite/ph/images/star_on.gif'; - this.appendDummyInput() - .appendField('image') - .appendField(new Blockly.FieldTextInput(src), 'SRC'); - this.appendDummyInput() - .appendField('width') - .appendField(new Blockly.FieldTextInput('15', - Blockly.FieldTextInput.numberValidator), 'WIDTH') - .appendField('height') - .appendField(new Blockly.FieldTextInput('15', - Blockly.FieldTextInput.numberValidator), 'HEIGHT') - .appendField('alt text') - .appendField(new Blockly.FieldTextInput('*'), 'ALT'); - this.setPreviousStatement(true, 'Field'); - this.setNextStatement(true, 'Field'); - this.setTooltip('Static image (JPEG, PNG, GIF, SVG, BMP).\n' + - 'Retains aspect ratio regardless of height and width.\n' + - 'Alt text is for when collapsed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=567'); - } -}; - -Blockly.Blocks['type_group'] = { - // Group of types. - init: function() { - this.setColour(230); - this.appendValueInput('TYPE0') - .setCheck('Type') - .appendField('any of'); - this.appendValueInput('TYPE1') - .setCheck('Type'); - this.setOutput(true, 'Type'); - this.setMutator(new Blockly.Mutator(['type_group_item'])); - this.setTooltip('Allows more than one type to be accepted.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=677'); - this.typeCount_ = 2; - }, - mutationToDom: function(workspace) { - var container = document.createElement('mutation'); - container.setAttribute('types', this.typeCount_); - return container; - }, - domToMutation: function(container) { - for (var x = 0; x < this.typeCount_; x++) { - this.removeInput('TYPE' + x); - } - this.typeCount_ = parseInt(container.getAttribute('types'), 10); - for (var x = 0; x < this.typeCount_; x++) { - var input = this.appendValueInput('TYPE' + x) - .setCheck('Type'); - if (x == 0) { - input.appendField('any of'); - } - } - }, - decompose: function(workspace) { - var containerBlock = workspace.newBlock('type_group_container'); - containerBlock.initSvg(); - var connection = containerBlock.getInput('STACK').connection; - for (var x = 0; x < this.typeCount_; x++) { - var typeBlock = workspace.newBlock('type_group_item'); - typeBlock.initSvg(); - connection.connect(typeBlock.previousConnection); - connection = typeBlock.nextConnection; - } - return containerBlock; - }, - compose: function(containerBlock) { - // Disconnect all input blocks and remove all inputs. - for (var x = this.typeCount_ - 1; x >= 0; x--) { - this.removeInput('TYPE' + x); - } - this.typeCount_ = 0; - // Rebuild the block's inputs. - var typeBlock = containerBlock.getInputTargetBlock('STACK'); - while (typeBlock) { - var input = this.appendValueInput('TYPE' + this.typeCount_) - .setCheck('Type'); - if (this.typeCount_ == 0) { - input.appendField('any of'); - } - // Reconnect any child blocks. - if (typeBlock.valueConnection_) { - input.connection.connect(typeBlock.valueConnection_); - } - this.typeCount_++; - typeBlock = typeBlock.nextConnection && - typeBlock.nextConnection.targetBlock(); - } - }, - saveConnections: function(containerBlock) { - // Store a pointer to any connected child blocks. - var typeBlock = containerBlock.getInputTargetBlock('STACK'); - var x = 0; - while (typeBlock) { - var input = this.getInput('TYPE' + x); - typeBlock.valueConnection_ = input && input.connection.targetConnection; - x++; - typeBlock = typeBlock.nextConnection && - typeBlock.nextConnection.targetBlock(); - } - } -}; - -Blockly.Blocks['type_group_container'] = { - // Container. - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('add types'); - this.appendStatementInput('STACK'); - this.setTooltip('Add, or remove allowed type.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=677'); - this.contextMenu = false; - } -}; - -Blockly.Blocks['type_group_item'] = { - // Add type. - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('type'); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip('Add a new allowed type.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=677'); - this.contextMenu = false; - } -}; - -Blockly.Blocks['type_null'] = { - // Null type. - valueType: null, - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('any'); - this.setOutput(true, 'Type'); - this.setTooltip('Any type is allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_boolean'] = { - // Boolean type. - valueType: 'Boolean', - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('boolean'); - this.setOutput(true, 'Type'); - this.setTooltip('Booleans (true/false) are allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_number'] = { - // Number type. - valueType: 'Number', - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('number'); - this.setOutput(true, 'Type'); - this.setTooltip('Numbers (int/float) are allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_string'] = { - // String type. - valueType: 'String', - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('string'); - this.setOutput(true, 'Type'); - this.setTooltip('Strings (text) are allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_list'] = { - // List type. - valueType: 'Array', - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('list'); - this.setOutput(true, 'Type'); - this.setTooltip('Arrays (lists) are allowed.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602'); - } -}; - -Blockly.Blocks['type_other'] = { - // Other type. - init: function() { - this.setColour(230); - this.appendDummyInput() - .appendField('other') - .appendField(new Blockly.FieldTextInput(''), 'TYPE'); - this.setOutput(true, 'Type'); - this.setTooltip('Custom type to allow.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=702'); - } -}; - -Blockly.Blocks['colour_hue'] = { - // Set the colour of the block. - init: function() { - this.appendDummyInput() - .appendField('hue:') - .appendField(new Blockly.FieldAngle('0', this.validator), 'HUE'); - this.setOutput(true, 'Colour'); - this.setTooltip('Paint the block with this colour.'); - this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=55'); - }, - validator: function(text) { - // Update the current block's colour to match. - this.sourceBlock_.setColour(text); - }, - mutationToDom: function(workspace) { - var container = document.createElement('mutation'); - container.setAttribute('colour', this.getColour()); - return container; - }, - domToMutation: function(container) { - this.setColour(container.getAttribute('colour')); - } -}; - -/** - * Check to see if more than one field has this name. - * Highly inefficient (On^2), but n is small. - * @param {!Blockly.Block} referenceBlock Block to check. - */ -function fieldNameCheck(referenceBlock) { - var name = referenceBlock.getFieldValue('FIELDNAME').toLowerCase(); - var count = 0; - var blocks = referenceBlock.workspace.getAllBlocks(); - for (var x = 0, block; block = blocks[x]; x++) { - var otherName = block.getFieldValue('FIELDNAME'); - if (!block.disabled && !block.getInheritedDisabled() && - otherName && otherName.toLowerCase() == name) { - count++; - } - } - var msg = (count > 1) ? - 'There are ' + count + ' field blocks\n with this name.' : null; - referenceBlock.setWarningText(msg); -} - -/** - * Check to see if more than one input has this name. - * Highly inefficient (On^2), but n is small. - * @param {!Blockly.Block} referenceBlock Block to check. - */ -function inputNameCheck(referenceBlock) { - var name = referenceBlock.getFieldValue('INPUTNAME').toLowerCase(); - var count = 0; - var blocks = referenceBlock.workspace.getAllBlocks(); - for (var x = 0, block; block = blocks[x]; x++) { - var otherName = block.getFieldValue('INPUTNAME'); - if (!block.disabled && !block.getInheritedDisabled() && - otherName && otherName.toLowerCase() == name) { - count++; - } - } - var msg = (count > 1) ? - 'There are ' + count + ' input blocks\n with this name.' : null; - referenceBlock.setWarningText(msg); -} diff --git a/demos/blockfactory/factory.js b/demos/blockfactory/factory.js deleted file mode 100644 index 6256c13dc2..0000000000 --- a/demos/blockfactory/factory.js +++ /dev/null @@ -1,790 +0,0 @@ -/** - * Blockly Demos: Block Factory - * - * 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 JavaScript for Blockly's Block Factory application. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * Workspace for user to build block. - * @type {Blockly.Workspace} - */ -var mainWorkspace = null; - -/** - * Workspace for preview of block. - * @type {Blockly.Workspace} - */ -var previewWorkspace = null; - -/** - * Name of block if not named. - */ -var UNNAMED = 'unnamed'; - -/** - * Change the language code format. - */ -function formatChange() { - var mask = document.getElementById('blocklyMask'); - var languagePre = document.getElementById('languagePre'); - var languageTA = document.getElementById('languageTA'); - if (document.getElementById('format').value == 'Manual') { - Blockly.hideChaff(); - mask.style.display = 'block'; - languagePre.style.display = 'none'; - languageTA.style.display = 'block'; - var code = languagePre.textContent.trim(); - languageTA.value = code; - languageTA.focus(); - updatePreview(); - } else { - mask.style.display = 'none'; - languageTA.style.display = 'none'; - languagePre.style.display = 'block'; - updateLanguage(); - } - disableEnableLink(); -} - -/** - * Update the language code based on constructs made in Blockly. - */ -function updateLanguage() { - var rootBlock = getRootBlock(); - if (!rootBlock) { - return; - } - var blockType = rootBlock.getFieldValue('NAME').trim().toLowerCase(); - if (!blockType) { - blockType = UNNAMED; - } - blockType = blockType.replace(/\W/g, '_').replace(/^(\d)/, '_\\1'); - switch (document.getElementById('format').value) { - case 'JSON': - var code = formatJson_(blockType, rootBlock); - break; - case 'JavaScript': - var code = formatJavaScript_(blockType, rootBlock); - break; - } - injectCode(code, 'languagePre'); - updatePreview(); -} - -/** - * Update the language code as JSON. - * @param {string} blockType Name of block. - * @param {!Blockly.Block} rootBlock Factory_base block. - * @return {string} Generanted language code. - * @private - */ -function formatJson_(blockType, rootBlock) { - var JS = {}; - // ID is not used by Blockly, but may be used by a loader. - JS.id = blockType; - // Generate inputs. - var message = []; - var args = []; - var contentsBlock = rootBlock.getInputTargetBlock('INPUTS'); - var lastInput = null; - while (contentsBlock) { - if (!contentsBlock.disabled && !contentsBlock.getInheritedDisabled()) { - var fields = getFieldsJson_(contentsBlock.getInputTargetBlock('FIELDS')); - for (var i = 0; i < fields.length; i++) { - if (typeof fields[i] == 'string') { - message.push(fields[i].replace(/%/g, '%%')); - } else { - args.push(fields[i]); - message.push('%' + args.length); - } - } - - var input = {type: contentsBlock.type}; - // Dummy inputs don't have names. Other inputs do. - if (contentsBlock.type != 'input_dummy') { - input.name = contentsBlock.getFieldValue('INPUTNAME'); - } - var check = JSON.parse(getOptTypesFrom(contentsBlock, 'TYPE') || 'null'); - if (check) { - input.check = check; - } - var align = contentsBlock.getFieldValue('ALIGN'); - if (align != 'LEFT') { - input.align = align; - } - args.push(input); - message.push('%' + args.length); - lastInput = contentsBlock; - } - contentsBlock = contentsBlock.nextConnection && - contentsBlock.nextConnection.targetBlock(); - } - // Remove last input if dummy and not empty. - if (lastInput && lastInput.type == 'input_dummy') { - var fields = lastInput.getInputTargetBlock('FIELDS'); - if (fields && getFieldsJson_(fields).join('').trim() != '') { - var align = lastInput.getFieldValue('ALIGN'); - if (align != 'LEFT') { - JS.lastDummyAlign0 = align; - } - args.pop(); - message.pop(); - } - } - JS.message0 = message.join(' '); - JS.args0 = args; - // Generate inline/external switch. - if (rootBlock.getFieldValue('INLINE') == 'EXT') { - JS.inputsInline = false; - } else if (rootBlock.getFieldValue('INLINE') == 'INT') { - JS.inputsInline = true; - } - // Generate output, or next/previous connections. - switch (rootBlock.getFieldValue('CONNECTIONS')) { - case 'LEFT': - JS.output = - JSON.parse(getOptTypesFrom(rootBlock, 'OUTPUTTYPE') || 'null'); - break; - case 'BOTH': - JS.previousStatement = - JSON.parse(getOptTypesFrom(rootBlock, 'TOPTYPE') || 'null'); - JS.nextStatement = - JSON.parse(getOptTypesFrom(rootBlock, 'BOTTOMTYPE') || 'null'); - break; - case 'TOP': - JS.previousStatement = - JSON.parse(getOptTypesFrom(rootBlock, 'TOPTYPE') || 'null'); - break; - case 'BOTTOM': - JS.nextStatement = - JSON.parse(getOptTypesFrom(rootBlock, 'BOTTOMTYPE') || 'null'); - break; - } - // Generate colour. - var colourBlock = rootBlock.getInputTargetBlock('COLOUR'); - if (colourBlock && !colourBlock.disabled) { - var hue = parseInt(colourBlock.getFieldValue('HUE'), 10); - JS.colour = hue; - } - JS.tooltip = ''; - JS.helpUrl = 'http://www.example.com/'; - return JSON.stringify(JS, null, ' '); -} - -/** - * Update the language code as JavaScript. - * @param {string} blockType Name of block. - * @param {!Blockly.Block} rootBlock Factory_base block. - * @return {string} Generanted language code. - * @private - */ -function formatJavaScript_(blockType, rootBlock) { - var code = []; - code.push("Blockly.Blocks['" + blockType + "'] = {"); - code.push(" init: function() {"); - // Generate inputs. - var TYPES = {'input_value': 'appendValueInput', - 'input_statement': 'appendStatementInput', - 'input_dummy': 'appendDummyInput'}; - var contentsBlock = rootBlock.getInputTargetBlock('INPUTS'); - while (contentsBlock) { - if (!contentsBlock.disabled && !contentsBlock.getInheritedDisabled()) { - var name = ''; - // Dummy inputs don't have names. Other inputs do. - if (contentsBlock.type != 'input_dummy') { - name = escapeString(contentsBlock.getFieldValue('INPUTNAME')); - } - code.push(' this.' + TYPES[contentsBlock.type] + '(' + name + ')'); - var check = getOptTypesFrom(contentsBlock, 'TYPE'); - if (check) { - code.push(' .setCheck(' + check + ')'); - } - var align = contentsBlock.getFieldValue('ALIGN'); - if (align != 'LEFT') { - code.push(' .setAlign(Blockly.ALIGN_' + align + ')'); - } - var fields = getFieldsJs_(contentsBlock.getInputTargetBlock('FIELDS')); - for (var i = 0; i < fields.length; i++) { - code.push(' .appendField(' + fields[i] + ')'); - } - // Add semicolon to last line to finish the statement. - code[code.length - 1] += ';'; - } - contentsBlock = contentsBlock.nextConnection && - contentsBlock.nextConnection.targetBlock(); - } - // Generate inline/external switch. - if (rootBlock.getFieldValue('INLINE') == 'EXT') { - code.push(' this.setInputsInline(false);'); - } else if (rootBlock.getFieldValue('INLINE') == 'INT') { - code.push(' this.setInputsInline(true);'); - } - // Generate output, or next/previous connections. - switch (rootBlock.getFieldValue('CONNECTIONS')) { - case 'LEFT': - code.push(connectionLineJs_('setOutput', 'OUTPUTTYPE')); - break; - case 'BOTH': - code.push(connectionLineJs_('setPreviousStatement', 'TOPTYPE')); - code.push(connectionLineJs_('setNextStatement', 'BOTTOMTYPE')); - break; - case 'TOP': - code.push(connectionLineJs_('setPreviousStatement', 'TOPTYPE')); - break; - case 'BOTTOM': - code.push(connectionLineJs_('setNextStatement', 'BOTTOMTYPE')); - break; - } - // Generate colour. - var colourBlock = rootBlock.getInputTargetBlock('COLOUR'); - if (colourBlock && !colourBlock.disabled) { - var hue = parseInt(colourBlock.getFieldValue('HUE'), 10); - code.push(' this.setColour(' + hue + ');'); - } - code.push(" this.setTooltip('');"); - code.push(" this.setHelpUrl('http://www.example.com/');"); - code.push(' }'); - code.push('};'); - return code.join('\n'); -} - -/** - * Create JS code required to create a top, bottom, or value connection. - * @param {string} functionName JavaScript function name. - * @param {string} typeName Name of type input. - * @return {string} Line of JavaScript code to create connection. - * @private - */ -function connectionLineJs_(functionName, typeName) { - var type = getOptTypesFrom(getRootBlock(), typeName); - if (type) { - type = ', ' + type; - } else { - type = ''; - } - return ' this.' + functionName + '(true' + type + ');'; -} - -/** - * Returns field strings and any config. - * @param {!Blockly.Block} block Input block. - * @return {!Array.} Field strings. - * @private - */ -function getFieldsJs_(block) { - var fields = []; - while (block) { - if (!block.disabled && !block.getInheritedDisabled()) { - switch (block.type) { - case 'field_static': - // Result: 'hello' - fields.push(escapeString(block.getFieldValue('TEXT'))); - break; - case 'field_input': - // Result: new Blockly.FieldTextInput('Hello'), 'GREET' - fields.push('new Blockly.FieldTextInput(' + - escapeString(block.getFieldValue('TEXT')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_angle': - // Result: new Blockly.FieldAngle(90), 'ANGLE' - fields.push('new Blockly.FieldAngle(' + - parseFloat(block.getFieldValue('ANGLE')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_checkbox': - // Result: new Blockly.FieldCheckbox('TRUE'), 'CHECK' - fields.push('new Blockly.FieldCheckbox(' + - escapeString(block.getFieldValue('CHECKED')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_colour': - // Result: new Blockly.FieldColour('#ff0000'), 'COLOUR' - fields.push('new Blockly.FieldColour(' + - escapeString(block.getFieldValue('COLOUR')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_date': - // Result: new Blockly.FieldDate('2015-02-04'), 'DATE' - fields.push('new Blockly.FieldDate(' + - escapeString(block.getFieldValue('DATE')) + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_variable': - // Result: new Blockly.FieldVariable('item'), 'VAR' - var varname = escapeString(block.getFieldValue('TEXT') || null); - fields.push('new Blockly.FieldVariable(' + varname + '), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - break; - case 'field_dropdown': - // Result: - // new Blockly.FieldDropdown([['yes', '1'], ['no', '0']]), 'TOGGLE' - var options = []; - for (var i = 0; i < block.optionCount_; i++) { - options[i] = '[' + escapeString(block.getFieldValue('USER' + i)) + - ', ' + escapeString(block.getFieldValue('CPU' + i)) + ']'; - } - if (options.length) { - fields.push('new Blockly.FieldDropdown([' + - options.join(', ') + ']), ' + - escapeString(block.getFieldValue('FIELDNAME'))); - } - break; - case 'field_image': - // Result: new Blockly.FieldImage('http://...', 80, 60) - var src = escapeString(block.getFieldValue('SRC')); - var width = Number(block.getFieldValue('WIDTH')); - var height = Number(block.getFieldValue('HEIGHT')); - var alt = escapeString(block.getFieldValue('ALT')); - fields.push('new Blockly.FieldImage(' + - src + ', ' + width + ', ' + height + ', ' + alt + ')'); - break; - } - } - block = block.nextConnection && block.nextConnection.targetBlock(); - } - return fields; -} - -/** - * Returns field strings and any config. - * @param {!Blockly.Block} block Input block. - * @return {!Array.} Array of static text and field configs. - * @private - */ -function getFieldsJson_(block) { - var fields = []; - while (block) { - if (!block.disabled && !block.getInheritedDisabled()) { - switch (block.type) { - case 'field_static': - // Result: 'hello' - fields.push(block.getFieldValue('TEXT')); - break; - case 'field_input': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - text: block.getFieldValue('TEXT') - }); - break; - case 'field_angle': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - angle: Number(block.getFieldValue('ANGLE')) - }); - break; - case 'field_checkbox': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - checked: block.getFieldValue('CHECKED') == 'TRUE' - }); - break; - case 'field_colour': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - colour: block.getFieldValue('COLOUR') - }); - break; - case 'field_date': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - date: block.getFieldValue('DATE') - }); - break; - case 'field_variable': - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - variable: block.getFieldValue('TEXT') || null - }); - break; - case 'field_dropdown': - var options = []; - for (var i = 0; i < block.optionCount_; i++) { - options[i] = [block.getFieldValue('USER' + i), - block.getFieldValue('CPU' + i)]; - } - if (options.length) { - fields.push({ - type: block.type, - name: block.getFieldValue('FIELDNAME'), - options: options - }); - } - break; - case 'field_image': - fields.push({ - type: block.type, - src: block.getFieldValue('SRC'), - width: Number(block.getFieldValue('WIDTH')), - height: Number(block.getFieldValue('HEIGHT')), - alt: block.getFieldValue('ALT') - }); - break; - } - } - block = block.nextConnection && block.nextConnection.targetBlock(); - } - return fields; -} - -/** - * Escape a string. - * @param {string} string String to escape. - * @return {string} Escaped string surrouned by quotes. - */ -function escapeString(string) { - return JSON.stringify(string); -} - -/** - * Fetch the type(s) defined in the given input. - * Format as a string for appending to the generated code. - * @param {!Blockly.Block} block Block with input. - * @param {string} name Name of the input. - * @return {?string} String defining the types. - */ -function getOptTypesFrom(block, name) { - var types = getTypesFrom_(block, name); - if (types.length == 0) { - return undefined; - } else if (types.indexOf('null') != -1) { - return 'null'; - } else if (types.length == 1) { - return types[0]; - } else { - return '[' + types.join(', ') + ']'; - } -} - -/** - * Fetch the type(s) defined in the given input. - * @param {!Blockly.Block} block Block with input. - * @param {string} name Name of the input. - * @return {!Array.} List of types. - * @private - */ -function getTypesFrom_(block, name) { - var typeBlock = block.getInputTargetBlock(name); - var types; - if (!typeBlock || typeBlock.disabled) { - types = []; - } else if (typeBlock.type == 'type_other') { - types = [escapeString(typeBlock.getFieldValue('TYPE'))]; - } else if (typeBlock.type == 'type_group') { - types = []; - for (var n = 0; n < typeBlock.typeCount_; n++) { - types = types.concat(getTypesFrom_(typeBlock, 'TYPE' + n)); - } - // Remove duplicates. - var hash = Object.create(null); - for (var n = types.length - 1; n >= 0; n--) { - if (hash[types[n]]) { - types.splice(n, 1); - } - hash[types[n]] = true; - } - } else { - types = [escapeString(typeBlock.valueType)]; - } - return types; -} - -/** - * Update the generator code. - * @param {!Blockly.Block} block Rendered block in preview workspace. - */ -function updateGenerator(block) { - function makeVar(root, name) { - name = name.toLowerCase().replace(/\W/g, '_'); - return ' var ' + root + '_' + name; - } - var language = document.getElementById('language').value; - var code = []; - code.push("Blockly." + language + "['" + block.type + - "'] = function(block) {"); - - // Generate getters for any fields or inputs. - for (var i = 0, input; input = block.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - var name = field.name; - if (!name) { - continue; - } - if (field instanceof Blockly.FieldVariable) { - // Subclass of Blockly.FieldDropdown, must test first. - code.push(makeVar('variable', name) + - " = Blockly." + language + - ".variableDB_.getName(block.getFieldValue('" + name + - "'), Blockly.Variables.NAME_TYPE);"); - } else if (field instanceof Blockly.FieldAngle) { - // Subclass of Blockly.FieldTextInput, must test first. - code.push(makeVar('angle', name) + - " = block.getFieldValue('" + name + "');"); - } else if (Blockly.FieldDate && field instanceof Blockly.FieldDate) { - // Blockly.FieldDate may not be compiled into Blockly. - code.push(makeVar('date', name) + - " = block.getFieldValue('" + name + "');"); - } else if (field instanceof Blockly.FieldColour) { - code.push(makeVar('colour', name) + - " = block.getFieldValue('" + name + "');"); - } else if (field instanceof Blockly.FieldCheckbox) { - code.push(makeVar('checkbox', name) + - " = block.getFieldValue('" + name + "') == 'TRUE';"); - } else if (field instanceof Blockly.FieldDropdown) { - code.push(makeVar('dropdown', name) + - " = block.getFieldValue('" + name + "');"); - } else if (field instanceof Blockly.FieldTextInput) { - code.push(makeVar('text', name) + - " = block.getFieldValue('" + name + "');"); - } - } - var name = input.name; - if (name) { - if (input.type == Blockly.INPUT_VALUE) { - code.push(makeVar('value', name) + - " = Blockly." + language + ".valueToCode(block, '" + name + - "', Blockly." + language + ".ORDER_ATOMIC);"); - } else if (input.type == Blockly.NEXT_STATEMENT) { - code.push(makeVar('statements', name) + - " = Blockly." + language + ".statementToCode(block, '" + - name + "');"); - } - } - } - code.push(" // TODO: Assemble " + language + " into code variable."); - code.push(" var code = \'...\';"); - if (block.outputConnection) { - code.push(" // TODO: Change ORDER_NONE to the correct strength."); - code.push(" return [code, Blockly." + language + ".ORDER_NONE];"); - } else { - code.push(" return code;"); - } - code.push("};"); - - injectCode(code.join('\n'), 'generatorPre'); -} - -/** - * Existing direction ('ltr' vs 'rtl') of preview. - */ -var oldDir = null; - -/** - * Update the preview display. - */ -function updatePreview() { - // Toggle between LTR/RTL if needed (also used in first display). - var newDir = document.getElementById('direction').value; - if (oldDir != newDir) { - if (previewWorkspace) { - previewWorkspace.dispose(); - } - var rtl = newDir == 'rtl'; - previewWorkspace = Blockly.inject('preview', - {rtl: rtl, - media: '../../media/', - scrollbars: true}); - oldDir = newDir; - } - previewWorkspace.clear(); - - // Fetch the code and determine its format (JSON or JavaScript). - var format = document.getElementById('format').value; - if (format == 'Manual') { - var code = document.getElementById('languageTA').value; - // If the code is JSON, it will parse, otherwise treat as JS. - try { - JSON.parse(code); - format = 'JSON'; - } catch (e) { - format = 'JavaScript'; - } - } else { - var code = document.getElementById('languagePre').textContent; - } - if (!code.trim()) { - // Nothing to render. Happens while cloud storage is loading. - return; - } - - // Backup Blockly.Blocks object so that main workspace and preview don't - // collide if user creates a 'factory_base' block, for instance. - var backupBlocks = Blockly.Blocks; - try { - // Make a shallow copy. - Blockly.Blocks = {}; - for (var prop in backupBlocks) { - Blockly.Blocks[prop] = backupBlocks[prop]; - } - - if (format == 'JSON') { - var json = JSON.parse(code); - Blockly.Blocks[json.id || UNNAMED] = { - init: function() { - this.jsonInit(json); - } - }; - } else if (format == 'JavaScript') { - eval(code); - } else { - throw 'Unknown format: ' + format; - } - - // Look for a block on Blockly.Blocks that does not match the backup. - var blockType = null; - for (var type in Blockly.Blocks) { - if (typeof Blockly.Blocks[type].init == 'function' && - Blockly.Blocks[type] != backupBlocks[type]) { - blockType = type; - break; - } - } - if (!blockType) { - return; - } - - // Create the preview block. - var previewBlock = previewWorkspace.newBlock(blockType); - previewBlock.initSvg(); - previewBlock.render(); - previewBlock.setMovable(false); - previewBlock.setDeletable(false); - previewBlock.moveBy(15, 10); - - updateGenerator(previewBlock); - } finally { - Blockly.Blocks = backupBlocks; - } -} - -/** - * Inject code into a pre tag, with syntax highlighting. - * Safe from HTML/script injection. - * @param {string} code Lines of code. - * @param {string} id ID of

 element to inject into.
- */
-function injectCode(code, id) {
-  Blockly.removeAllRanges();
-  var pre = document.getElementById(id);
-  pre.textContent = code;
-  code = pre.innerHTML;
-  code = prettyPrintOne(code, 'js');
-  pre.innerHTML = code;
-}
-
-/**
- * Return the uneditable container block that everything else attaches to.
- * @return {Blockly.Block}
- */
-function getRootBlock() {
-  var blocks = mainWorkspace.getTopBlocks(false);
-  for (var i = 0, block; block = blocks[i]; i++) {
-    if (block.type == 'factory_base') {
-      return block;
-    }
-  }
-  return null;
-}
-
-/**
- * Disable the link button if the format is 'Manual', enable otherwise.
- */
-function disableEnableLink() {
-  var linkButton = document.getElementById('linkButton');
-  linkButton.disabled = document.getElementById('format').value == 'Manual';
-}
-
-/**
- * Initialize Blockly and layout.  Called on page load.
- */
-function init() {
-  if ('BlocklyStorage' in window) {
-    BlocklyStorage.HTTPREQUEST_ERROR =
-        'There was a problem with the request.\n';
-    BlocklyStorage.LINK_ALERT =
-        'Share your blocks with this link:\n\n%1';
-    BlocklyStorage.HASH_ERROR =
-        'Sorry, "%1" doesn\'t correspond with any saved Blockly file.';
-    BlocklyStorage.XML_ERROR = 'Could not load your saved file.\n'+
-        'Perhaps it was created with a different version of Blockly?';
-    var linkButton = document.getElementById('linkButton');
-    linkButton.style.display = 'inline-block';
-    linkButton.addEventListener('click',
-        function() {BlocklyStorage.link(mainWorkspace);});
-    disableEnableLink();
-  }
-
-  document.getElementById('helpButton').addEventListener('click',
-    function() {
-      open('https://developers.google.com/blockly/custom-blocks/block-factory',
-           'BlockFactoryHelp');
-    });
-
-  var expandList = [
-    document.getElementById('blockly'),
-    document.getElementById('blocklyMask'),
-    document.getElementById('preview'),
-    document.getElementById('languagePre'),
-    document.getElementById('languageTA'),
-    document.getElementById('generatorPre')
-  ];
-  var onresize = function(e) {
-    for (var i = 0, expand; expand = expandList[i]; i++) {
-      expand.style.width = (expand.parentNode.offsetWidth - 2) + 'px';
-      expand.style.height = (expand.parentNode.offsetHeight - 2) + 'px';
-    }
-  };
-  onresize();
-  window.addEventListener('resize', onresize);
-
-  var toolbox = document.getElementById('toolbox');
-  mainWorkspace = Blockly.inject('blockly',
-      {toolbox: toolbox, media: '../../media/'});
-
-  // Create the root block.
-  if ('BlocklyStorage' in window && window.location.hash.length > 1) {
-    BlocklyStorage.retrieveXml(window.location.hash.substring(1),
-                               mainWorkspace);
-  } else {
-    var xml = '';
-    Blockly.Xml.domToWorkspace(mainWorkspace, Blockly.Xml.textToDom(xml));
-  }
-
-  mainWorkspace.addChangeListener(updateLanguage);
-  document.getElementById('direction')
-      .addEventListener('change', updatePreview);
-  document.getElementById('languageTA')
-      .addEventListener('change', updatePreview);
-  document.getElementById('languageTA')
-      .addEventListener('keyup', updatePreview);
-  document.getElementById('format')
-      .addEventListener('change', formatChange);
-  document.getElementById('language')
-      .addEventListener('change', updatePreview);
-}
-window.addEventListener('load', init);
diff --git a/demos/blockfactory/icon.png b/demos/blockfactory/icon.png
deleted file mode 100644
index d4d19b4576..0000000000
Binary files a/demos/blockfactory/icon.png and /dev/null differ
diff --git a/demos/blockfactory/index.html b/demos/blockfactory/index.html
deleted file mode 100644
index dfa98de784..0000000000
--- a/demos/blockfactory/index.html
+++ /dev/null
@@ -1,220 +0,0 @@
-
-
-
-  
-  
-  Blockly Demo: Block Factory
-  
-  
-  
-  
-  
-  
-  
-  
-
-
-  
-    
-      
-      
-    
-    
-      
-      
-    
-  
-

Blockly > - Demos > Block Factory

-
- - - - - -
-

Preview: - -

-
- - - -
-
-
-
-
- - - - - - - - - - - - - - - - -
-
-
-

Language code: - -

-
-

-              
-            
-

Generator stub: - -

-
-

-            
-
- - - diff --git a/demos/blockfactory/link.png b/demos/blockfactory/link.png deleted file mode 100644 index 11dfd82845..0000000000 Binary files a/demos/blockfactory/link.png and /dev/null differ diff --git a/demos/code/code.js b/demos/code/code.js deleted file mode 100644 index 66ca98a81b..0000000000 --- a/demos/code/code.js +++ /dev/null @@ -1,531 +0,0 @@ -/** - * Blockly Demos: Code - * - * 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 JavaScript for Blockly's Code demo. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * Create a namespace for the application. - */ -var Code = {}; - -/** - * Lookup for names of supported languages. Keys should be in ISO 639 format. - */ -Code.LANGUAGE_NAME = { - 'ar': 'العربية', - 'be-tarask': 'Taraškievica', - 'br': 'Brezhoneg', - 'ca': 'Català', - 'cs': 'Česky', - 'da': 'Dansk', - 'de': 'Deutsch', - 'el': 'Ελληνικά', - 'en': 'English', - 'es': 'Español', - 'fa': 'فارسی', - 'fr': 'Français', - 'he': 'עברית', - 'hrx': 'Hunsrik', - 'hu': 'Magyar', - 'ia': 'Interlingua', - 'is': 'Íslenska', - 'it': 'Italiano', - 'ja': '日本語', - 'ko': '한국어', - 'mk': 'Македонски', - 'ms': 'Bahasa Melayu', - 'nb': 'Norsk Bokmål', - 'nl': 'Nederlands, Vlaams', - 'oc': 'Lenga d\'òc', - 'pl': 'Polski', - 'pms': 'Piemontèis', - 'pt-br': 'Português Brasileiro', - 'ro': 'Română', - 'ru': 'Русский', - 'sc': 'Sardu', - 'sk': 'Slovenčina', - 'sr': 'Српски', - 'sv': 'Svenska', - 'ta': 'தமிழ்', - 'th': 'ภาษาไทย', - 'tlh': 'tlhIngan Hol', - 'tr': 'Türkçe', - 'uk': 'Українська', - 'vi': 'Tiếng Việt', - 'zh-hans': '簡體中文', - 'zh-hant': '正體中文' -}; - -/** - * List of RTL languages. - */ -Code.LANGUAGE_RTL = ['ar', 'fa', 'he', 'lki']; - -/** - * Blockly's main workspace. - * @type {Blockly.WorkspaceSvg} - */ -Code.workspace = null; - -/** - * Extracts a parameter from the URL. - * If the parameter is absent default_value is returned. - * @param {string} name The name of the parameter. - * @param {string} defaultValue Value to return if paramater not found. - * @return {string} The parameter value or the default value if not found. - */ -Code.getStringParamFromUrl = function(name, defaultValue) { - var val = location.search.match(new RegExp('[?&]' + name + '=([^&]+)')); - return val ? decodeURIComponent(val[1].replace(/\+/g, '%20')) : defaultValue; -}; - -/** - * Get the language of this user from the URL. - * @return {string} User's language. - */ -Code.getLang = function() { - var lang = Code.getStringParamFromUrl('lang', ''); - if (Code.LANGUAGE_NAME[lang] === undefined) { - // Default to English. - lang = 'en'; - } - return lang; -}; - -/** - * Is the current language (Code.LANG) an RTL language? - * @return {boolean} True if RTL, false if LTR. - */ -Code.isRtl = function() { - return Code.LANGUAGE_RTL.indexOf(Code.LANG) != -1; -}; - -/** - * Load blocks saved on App Engine Storage or in session/local storage. - * @param {string} defaultXml Text representation of default blocks. - */ -Code.loadBlocks = function(defaultXml) { - try { - var loadOnce = window.sessionStorage.loadOnceBlocks; - } catch(e) { - // Firefox sometimes throws a SecurityError when accessing sessionStorage. - // Restarting Firefox fixes this, so it looks like a bug. - var loadOnce = null; - } - if ('BlocklyStorage' in window && window.location.hash.length > 1) { - // An href with #key trigers an AJAX call to retrieve saved blocks. - BlocklyStorage.retrieveXml(window.location.hash.substring(1)); - } else if (loadOnce) { - // Language switching stores the blocks during the reload. - delete window.sessionStorage.loadOnceBlocks; - var xml = Blockly.Xml.textToDom(loadOnce); - Blockly.Xml.domToWorkspace(Code.workspace, xml); - } else if (defaultXml) { - // Load the editor with default starting blocks. - var xml = Blockly.Xml.textToDom(defaultXml); - Blockly.Xml.domToWorkspace(Code.workspace, xml); - } else if ('BlocklyStorage' in window) { - // Restore saved blocks in a separate thread so that subsequent - // initialization is not affected from a failed load. - window.setTimeout(BlocklyStorage.restoreBlocks, 0); - } -}; - -/** - * Save the blocks and reload with a different language. - */ -Code.changeLanguage = function() { - // Store the blocks for the duration of the reload. - // This should be skipped for the index page, which has no blocks and does - // not load Blockly. - // MSIE 11 does not support sessionStorage on file:// URLs. - if (typeof Blockly != 'undefined' && window.sessionStorage) { - var xml = Blockly.Xml.workspaceToDom(Code.workspace); - var text = Blockly.Xml.domToText(xml); - window.sessionStorage.loadOnceBlocks = text; - } - - var languageMenu = document.getElementById('languageMenu'); - var newLang = encodeURIComponent( - languageMenu.options[languageMenu.selectedIndex].value); - var search = window.location.search; - if (search.length <= 1) { - search = '?lang=' + newLang; - } else if (search.match(/[?&]lang=[^&]*/)) { - search = search.replace(/([?&]lang=)[^&]*/, '$1' + newLang); - } else { - search = search.replace(/\?/, '?lang=' + newLang + '&'); - } - - window.location = window.location.protocol + '//' + - window.location.host + window.location.pathname + search; -}; - -/** - * Bind a function to a button's click event. - * On touch enabled browsers, ontouchend is treated as equivalent to onclick. - * @param {!Element|string} el Button element or ID thereof. - * @param {!Function} func Event handler to bind. - */ -Code.bindClick = function(el, func) { - if (typeof el == 'string') { - el = document.getElementById(el); - } - el.addEventListener('click', func, true); - el.addEventListener('touchend', func, true); -}; - -/** - * Load the Prettify CSS and JavaScript. - */ -Code.importPrettify = function() { - // - // - var link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('href', '../prettify.css'); - document.head.appendChild(link); - var script = document.createElement('script'); - script.setAttribute('src', '../prettify.js'); - document.head.appendChild(script); -}; - -/** - * Compute the absolute coordinates and dimensions of an HTML element. - * @param {!Element} element Element to match. - * @return {!Object} Contains height, width, x, and y properties. - * @private - */ -Code.getBBox_ = function(element) { - var height = element.offsetHeight; - var width = element.offsetWidth; - var x = 0; - var y = 0; - do { - x += element.offsetLeft; - y += element.offsetTop; - element = element.offsetParent; - } while (element); - return { - height: height, - width: width, - x: x, - y: y - }; -}; - -/** - * User's language (e.g. "en"). - * @type {string} - */ -Code.LANG = Code.getLang(); - -/** - * List of tab names. - * @private - */ -Code.TABS_ = ['blocks', 'javascript', 'php', 'python', 'dart', 'xml']; - -Code.selected = 'blocks'; - -/** - * Switch the visible pane when a tab is clicked. - * @param {string} clickedName Name of tab clicked. - */ -Code.tabClick = function(clickedName) { - // If the XML tab was open, save and render the content. - if (document.getElementById('tab_xml').className == 'tabon') { - var xmlTextarea = document.getElementById('content_xml'); - var xmlText = xmlTextarea.value; - var xmlDom = null; - try { - xmlDom = Blockly.Xml.textToDom(xmlText); - } catch (e) { - var q = - window.confirm(MSG['badXml'].replace('%1', e)); - if (!q) { - // Leave the user on the XML tab. - return; - } - } - if (xmlDom) { - Code.workspace.clear(); - Blockly.Xml.domToWorkspace(Code.workspace, xmlDom); - } - } - - if (document.getElementById('tab_blocks').className == 'tabon') { - Code.workspace.setVisible(false); - } - // Deselect all tabs and hide all panes. - for (var i = 0; i < Code.TABS_.length; i++) { - var name = Code.TABS_[i]; - document.getElementById('tab_' + name).className = 'taboff'; - document.getElementById('content_' + name).style.visibility = 'hidden'; - } - - // Select the active tab. - Code.selected = clickedName; - document.getElementById('tab_' + clickedName).className = 'tabon'; - // Show the selected pane. - document.getElementById('content_' + clickedName).style.visibility = - 'visible'; - Code.renderContent(); - if (clickedName == 'blocks') { - Code.workspace.setVisible(true); - } - Blockly.fireUiEvent(window, 'resize'); -}; - -/** - * Populate the currently selected pane with content generated from the blocks. - */ -Code.renderContent = function() { - var content = document.getElementById('content_' + Code.selected); - // Initialize the pane. - if (content.id == 'content_xml') { - var xmlTextarea = document.getElementById('content_xml'); - var xmlDom = Blockly.Xml.workspaceToDom(Code.workspace); - var xmlText = Blockly.Xml.domToPrettyText(xmlDom); - xmlTextarea.value = xmlText; - xmlTextarea.focus(); - } else if (content.id == 'content_javascript') { - var code = Blockly.JavaScript.workspaceToCode(Code.workspace); - content.textContent = code; - if (typeof prettyPrintOne == 'function') { - code = content.innerHTML; - code = prettyPrintOne(code, 'js'); - content.innerHTML = code; - } - } else if (content.id == 'content_python') { - code = Blockly.Python.workspaceToCode(Code.workspace); - content.textContent = code; - if (typeof prettyPrintOne == 'function') { - code = content.innerHTML; - code = prettyPrintOne(code, 'py'); - content.innerHTML = code; - } - } else if (content.id == 'content_php') { - code = Blockly.PHP.workspaceToCode(Code.workspace); - content.textContent = code; - if (typeof prettyPrintOne == 'function') { - code = content.innerHTML; - code = prettyPrintOne(code, 'php'); - content.innerHTML = code; - } - } else if (content.id == 'content_dart') { - code = Blockly.Dart.workspaceToCode(Code.workspace); - content.textContent = code; - if (typeof prettyPrintOne == 'function') { - code = content.innerHTML; - code = prettyPrintOne(code, 'dart'); - content.innerHTML = code; - } - } -}; - -/** - * Initialize Blockly. Called on page load. - */ -Code.init = function() { - Code.initLanguage(); - - var rtl = Code.isRtl(); - var container = document.getElementById('content_area'); - var onresize = function(e) { - var bBox = Code.getBBox_(container); - for (var i = 0; i < Code.TABS_.length; i++) { - var el = document.getElementById('content_' + Code.TABS_[i]); - el.style.top = bBox.y + 'px'; - el.style.left = bBox.x + 'px'; - // Height and width need to be set, read back, then set again to - // compensate for scrollbars. - el.style.height = bBox.height + 'px'; - el.style.height = (2 * bBox.height - el.offsetHeight) + 'px'; - el.style.width = bBox.width + 'px'; - el.style.width = (2 * bBox.width - el.offsetWidth) + 'px'; - } - // Make the 'Blocks' tab line up with the toolbox. - if (Code.workspace && Code.workspace.toolbox_.width) { - document.getElementById('tab_blocks').style.minWidth = - (Code.workspace.toolbox_.width - 38) + 'px'; - // Account for the 19 pixel margin and on each side. - } - }; - onresize(); - window.addEventListener('resize', onresize, false); - - var toolbox = document.getElementById('toolbox'); - Code.workspace = Blockly.inject('content_blocks', - {grid: - {spacing: 25, - length: 3, - colour: '#ccc', - snap: true}, - media: '../../media/', - rtl: rtl, - toolbox: toolbox, - zoom: - {controls: true, - wheel: true} - }); - - // Add to reserved word list: Local variables in execution environment (runJS) - // and the infinite loop detection function. - Blockly.JavaScript.addReservedWords('code,timeouts,checkTimeout'); - - Code.loadBlocks(''); - - if ('BlocklyStorage' in window) { - // Hook a save function onto unload. - BlocklyStorage.backupOnUnload(Code.workspace); - } - - Code.tabClick(Code.selected); - - Code.bindClick('trashButton', - function() {Code.discard(); Code.renderContent();}); - Code.bindClick('runButton', Code.runJS); - // Disable the link button if page isn't backed by App Engine storage. - var linkButton = document.getElementById('linkButton'); - if ('BlocklyStorage' in window) { - BlocklyStorage['HTTPREQUEST_ERROR'] = MSG['httpRequestError']; - BlocklyStorage['LINK_ALERT'] = MSG['linkAlert']; - BlocklyStorage['HASH_ERROR'] = MSG['hashError']; - BlocklyStorage['XML_ERROR'] = MSG['xmlError']; - Code.bindClick(linkButton, - function() {BlocklyStorage.link(Code.workspace);}); - } else if (linkButton) { - linkButton.className = 'disabled'; - } - - for (var i = 0; i < Code.TABS_.length; i++) { - var name = Code.TABS_[i]; - Code.bindClick('tab_' + name, - function(name_) {return function() {Code.tabClick(name_);};}(name)); - } - - // Lazy-load the syntax-highlighting. - window.setTimeout(Code.importPrettify, 1); -}; - -/** - * Initialize the page language. - */ -Code.initLanguage = function() { - // Set the HTML's language and direction. - var rtl = Code.isRtl(); - document.dir = rtl ? 'rtl' : 'ltr'; - document.head.parentElement.setAttribute('lang', Code.LANG); - - // Sort languages alphabetically. - var languages = []; - for (var lang in Code.LANGUAGE_NAME) { - languages.push([Code.LANGUAGE_NAME[lang], lang]); - } - var comp = function(a, b) { - // Sort based on first argument ('English', 'Русский', '简体字', etc). - if (a[0] > b[0]) return 1; - if (a[0] < b[0]) return -1; - return 0; - }; - languages.sort(comp); - // Populate the language selection menu. - var languageMenu = document.getElementById('languageMenu'); - languageMenu.options.length = 0; - for (var i = 0; i < languages.length; i++) { - var tuple = languages[i]; - var lang = tuple[tuple.length - 1]; - var option = new Option(tuple[0], lang); - if (lang == Code.LANG) { - option.selected = true; - } - languageMenu.options.add(option); - } - languageMenu.addEventListener('change', Code.changeLanguage, true); - - // Inject language strings. - document.title += ' ' + MSG['title']; - document.getElementById('title').textContent = MSG['title']; - document.getElementById('tab_blocks').textContent = MSG['blocks']; - - document.getElementById('linkButton').title = MSG['linkTooltip']; - document.getElementById('runButton').title = MSG['runTooltip']; - document.getElementById('trashButton').title = MSG['trashTooltip']; - - var categories = ['catLogic', 'catLoops', 'catMath', 'catText', 'catLists', - 'catColour', 'catVariables', 'catFunctions']; - for (var i = 0, cat; cat = categories[i]; i++) { - document.getElementById(cat).setAttribute('name', MSG[cat]); - } - var textVars = document.getElementsByClassName('textVar'); - for (var i = 0, textVar; textVar = textVars[i]; i++) { - textVar.textContent = MSG['textVariable']; - } - var listVars = document.getElementsByClassName('listVar'); - for (var i = 0, listVar; listVar = listVars[i]; i++) { - listVar.textContent = MSG['listVariable']; - } -}; - -/** - * Execute the user's code. - * Just a quick and dirty eval. Catch infinite loops. - */ -Code.runJS = function() { - Blockly.JavaScript.INFINITE_LOOP_TRAP = ' checkTimeout();\n'; - var timeouts = 0; - var checkTimeout = function() { - if (timeouts++ > 1000000) { - throw MSG['timeout']; - } - }; - var code = Blockly.JavaScript.workspaceToCode(Code.workspace); - Blockly.JavaScript.INFINITE_LOOP_TRAP = null; - try { - eval(code); - } catch (e) { - alert(MSG['badCode'].replace('%1', e)); - } -}; - -/** - * Discard all blocks from the workspace. - */ -Code.discard = function() { - var count = Code.workspace.getAllBlocks().length; - if (count < 2 || - window.confirm(Blockly.Msg.DELETE_ALL_BLOCKS.replace('%1', count))) { - Code.workspace.clear(); - if (window.location.hash) { - window.location.hash = ''; - } - } -}; - -// Load the Code demo's language strings. -document.write('\n'); -// Load Blockly's language strings. -document.write('\n'); - -window.addEventListener('load', Code.init); diff --git a/demos/code/icon.png b/demos/code/icon.png deleted file mode 100644 index e2f23bd830..0000000000 Binary files a/demos/code/icon.png and /dev/null differ diff --git a/demos/code/icons.png b/demos/code/icons.png deleted file mode 100644 index 7cced7a7ea..0000000000 Binary files a/demos/code/icons.png and /dev/null differ diff --git a/demos/code/index.html b/demos/code/index.html deleted file mode 100644 index 747aaa2532..0000000000 --- a/demos/code/index.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - Blockly Demo: - - - - - - - - - - - - - - - - - - - - - - -
-

Blockly‏ > - Demos‏ > - ... -

-
- -
- - - - - - - - - - - - - - - -
... JavaScript Python PHP Dart XML - - - -
-
-
-
-

-  

-  

-  

-  
-
-  
-
-
-
diff --git a/demos/code/msg/ar.js b/demos/code/msg/ar.js
deleted file mode 100644
index 952198b21d..0000000000
--- a/demos/code/msg/ar.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "كود",
-  blocks: "البلوكات",
-  linkTooltip: "احفظ ووصلة إلى البلوكات.",
-  runTooltip: "شغل البرنامج المعرف بواسطة البلوكات في مساحة العمل.",
-  badCode: "خطأ في البرنامج:\n %1",
-  timeout: "تم تجاوز الحد الأقصى لتكرارات التنفيذ .",
-  trashTooltip: "تجاهل كل البلوكات.",
-  catLogic: "منطق",
-  catLoops: "الحلقات",
-  catMath: "رياضيات",
-  catText: "نص",
-  catLists: "قوائم",
-  catColour: "لون",
-  catVariables: "متغيرات",
-  catFunctions: "إجراءات",
-  listVariable: "قائمة",
-  textVariable: "نص",
-  httpRequestError: "كانت هناك مشكلة مع هذا الطلب.",
-  linkAlert: "مشاركة كود بلوكلي الخاص بك مع هذا الرابط:\n %1",
-  hashError: "عذراً،ال '%1' لا تتوافق مع أي برنامج تم حفظه.",
-  xmlError: "تعذر تحميل الملف المحفوظة الخاصة بك.  ربما تم إنشاؤه باستخدام إصدار مختلف من بلوكلي؟",
-  badXml: "خطأ في توزيع ال \"XML\":\n %1\n\nحدد 'موافق' للتخلي عن التغييرات أو 'إلغاء الأمر' لمواصلة تحرير ال\"XML\"."
-};
diff --git a/demos/code/msg/be-tarask.js b/demos/code/msg/be-tarask.js
deleted file mode 100644
index 5c8d72264a..0000000000
--- a/demos/code/msg/be-tarask.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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Абярыце \"ОК\", каб адмовіцца ад зьменаў ці \"Скасаваць\" для далейшага рэдагаваньня XML."
-};
diff --git a/demos/code/msg/br.js b/demos/code/msg/br.js
deleted file mode 100644
index 321e28e58d..0000000000
--- a/demos/code/msg/br.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kod",
-  blocks: "Bloc'hoù",
-  linkTooltip: "Enrollañ ha liammañ d'ar bloc'hadoù.",
-  runTooltip: "Lañsañ ar programm termenet gant ar bloc'hadoù en takad labour.",
-  badCode: "Fazi programm :\n%1",
-  timeout: "Tizhet eo bet an niver brasañ a iteradurioù seveniñ aotreet.",
-  trashTooltip: "Disteurel an holl vloc'hoù.",
-  catLogic: "Poell",
-  catLoops: "Boukloù",
-  catMath: "Matematik",
-  catText: "Testenn",
-  catLists: "Rolloù",
-  catColour: "Liv",
-  catVariables: "Argemmennoù",
-  catFunctions: "Arc'hwelioù",
-  listVariable: "roll",
-  textVariable: "testenn",
-  httpRequestError: "Ur gudenn zo gant ar reked.",
-  linkAlert: "Rannañ ho ploc'hoù gant al liamm-mañ :\n\n%1",
-  hashError: "Digarezit. \"%1\" ne glot gant programm enrollet ebet.",
-  xmlError: "Ne c'haller ket kargañ ho restr enrollet. Marteze e oa bet krouet gant ur stumm disheñvel eus Blockly ?",
-  badXml: "Fazi dielfennañ XML :\n%1\n\nDibabit \"Mat eo\" evit dilezel ar c'hemmoù-se pe \"Nullañ\" evit kemmañ an XML c'hoazh."
-};
diff --git a/demos/code/msg/ca.js b/demos/code/msg/ca.js
deleted file mode 100644
index 2b6d9738ee..0000000000
--- a/demos/code/msg/ca.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Codi",
-  blocks: "Blocs",
-  linkTooltip: "Desa i enllaça als blocs.",
-  runTooltip: "Executa el programa definit pels blocs de l'àrea de treball.",
-  badCode: "Error de programa:\n %1",
-  timeout: "S'ha superat el nombre màxim d'iteracions d'execució.",
-  trashTooltip: "Descarta tots els blocs.",
-  catLogic: "Lògica",
-  catLoops: "Bucles",
-  catMath: "Matemàtiques",
-  catText: "Text",
-  catLists: "Llistes",
-  catColour: "Color",
-  catVariables: "Variables",
-  catFunctions: "Procediments",
-  listVariable: "llista",
-  textVariable: "text",
-  httpRequestError: "Hi ha hagut un problema amb la sol·licitud.",
-  linkAlert: "Comparteix els teus blocs amb aquest enllaç: %1",
-  hashError: "Ho sentim, '%1' no es correspon amb cap fitxer desat de Blockly.",
-  xmlError: "No s'ha pogut carregar el teu fitxer desat.  Potser va ser creat amb una versió diferent de Blockly?",
-  badXml: "Error d'anàlisi XML:\n%1\n\nSeleccioneu 'Acceptar' per abandonar els vostres canvis, o 'Cancel·lar' per continuar editant l'XML."
-};
diff --git a/demos/code/msg/cs.js b/demos/code/msg/cs.js
deleted file mode 100644
index 1026511e3a..0000000000
--- a/demos/code/msg/cs.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kód",
-  blocks: "Bloky",
-  linkTooltip: "Ulož a spoj bloky..",
-  runTooltip: "",
-  badCode: "Chyba programu:\n%1",
-  timeout: "Maximum execution iterations exceeded.",
-  trashTooltip: "Zahodit všechny bloky.",
-  catLogic: "Logika",
-  catLoops: "Smyčky",
-  catMath: "Matematika",
-  catText: "Text",
-  catLists: "Seznamy",
-  catColour: "Barva",
-  catVariables: "Proměnné",
-  catFunctions: "Procedury",
-  listVariable: "seznam",
-  textVariable: "text",
-  httpRequestError: "Došlo k potížím s požadavkem.",
-  linkAlert: "Sdílej bloky tímto odkazem: \n\n%1",
-  hashError: "Omlouváme se, '%1' nesouhlasí s žádným z uložených souborů.",
-  xmlError: "Nepodařilo se uložit vás soubor.  Pravděpodobně byl vytvořen jinou verzí Blockly?",
-  badXml: "Chyba parsování XML:\n%1\n\nVybrat \"OK\" pro zahození vašich změn nebo 'Cancel' k dalšímu upravování XML."
-};
diff --git a/demos/code/msg/da.js b/demos/code/msg/da.js
deleted file mode 100644
index 089450b2db..0000000000
--- a/demos/code/msg/da.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kode",
-  blocks: "Blokke",
-  linkTooltip: "Gem og link til blokke.",
-  runTooltip: "Kør programmet, der er defineret af blokkene i arbejdsområdet.",
-  badCode: "Programfejl:\n%1",
-  timeout: "Maksimale antal udførelsesgentagelser overskredet.",
-  trashTooltip: "Kassér alle blokke.",
-  catLogic: "Logik",
-  catLoops: "Løkker",
-  catMath: "Matematik",
-  catText: "Tekst",
-  catLists: "Lister",
-  catColour: "Farve",
-  catVariables: "Variabler",
-  catFunctions: "Funktioner",
-  listVariable: "liste",
-  textVariable: "tekst",
-  httpRequestError: "Der var et problem med forespørgslen.",
-  linkAlert: "Del dine blokke med dette link:\n\n%1",
-  hashError: "Beklager, '%1' passer ikke med nogen gemt Blockly fil.",
-  xmlError: "Kunne ikke hente din gemte fil.  Måske er den lavet med en anden udgave af Blockly?",
-  badXml: "Fejl under fortolkningen af XML:\n%1\n\nVælg 'OK' for at opgive dine ændringer eller 'Afbryd' for at redigere XML-filen yderligere."
-};
diff --git a/demos/code/msg/de.js b/demos/code/msg/de.js
deleted file mode 100644
index 422f9187d1..0000000000
--- a/demos/code/msg/de.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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."
-};
diff --git a/demos/code/msg/el.js b/demos/code/msg/el.js
deleted file mode 100644
index c63b7a6851..0000000000
--- a/demos/code/msg/el.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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: "Δεν μπορώ να φορτώσω το αποθηκευμένο αρχείο σου.  Μήπως δημιουργήθηκε από μία παλιότερη έκδοση του Blockly;",
-  badXml: "Σφάλμα ανάλυσης XML:\n%1\n\nΕπίλεξε «Εντάξει» για να εγκαταλείψεις τις αλλαγές σου ή «Ακύρωση» για να επεξεργαστείς το XML κι άλλο."
-};
diff --git a/demos/code/msg/en.js b/demos/code/msg/en.js
deleted file mode 100644
index 8d52cf3330..0000000000
--- a/demos/code/msg/en.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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."
-};
diff --git a/demos/code/msg/es.js b/demos/code/msg/es.js
deleted file mode 100644
index 24358e368d..0000000000
--- a/demos/code/msg/es.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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."
-};
diff --git a/demos/code/msg/fa.js b/demos/code/msg/fa.js
deleted file mode 100644
index 96dd966b00..0000000000
--- a/demos/code/msg/fa.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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: "خطای تجزیهٔ اکس‌ام‌ال:\n%1\n\n«باشد» را برای ذخیره و «فسخ» را برای ویرایش بیشتر اکس‌ام‌ال انتخاب کنید."
-};
diff --git a/demos/code/msg/fr.js b/demos/code/msg/fr.js
deleted file mode 100644
index 60181131ad..0000000000
--- a/demos/code/msg/fr.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Code",
-  blocks: "Blocs",
-  linkTooltip: "Sauvegarder et lier aux blocs.",
-  runTooltip: "Lancer le programme défini par les blocs dans l’espace de travail.",
-  badCode: "Erreur du programme :\n%1",
-  timeout: "Nombre maximum d’itérations d’exé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 d’analyse du XML :\n%1\n\nSélectionner 'OK' pour abandonner vos modifications ou 'Annuler' pour continuer à modifier le XML."
-};
diff --git a/demos/code/msg/he.js b/demos/code/msg/he.js
deleted file mode 100644
index dc2826620d..0000000000
--- a/demos/code/msg/he.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "קוד",
-  blocks: "קטעי קוד",
-  linkTooltip: "שמירה וקישור לקטעי קוד.",
-  runTooltip: "הרצת התכנית שהוגדרה על ידי קטעי הקוד שבמרחב העבודה.",
-  badCode: "שגיאה בתכנית: %1",
-  timeout: "חריגה ממספר פעולות חוזרות אפשריות.",
-  trashTooltip: "השלך את כל קטעי הקוד.",
-  catLogic: "לוגיקה",
-  catLoops: "לולאות",
-  catMath: "מתמטיקה",
-  catText: "טקסט",
-  catLists: "רשימות",
-  catColour: "צבע",
-  catVariables: "משתנים",
-  catFunctions: "פונקציות",
-  listVariable: "רשימה",
-  textVariable: "טקסט",
-  httpRequestError: "הבקשה נכשלה.",
-  linkAlert: "ניתן לשתף את קטעי הקוד שלך באמצעות קישור זה:\n\n%1",
-  hashError: "לצערנו, '%1' איננו מתאים לאף אחת מהתוכניות השמורות",
-  xmlError: "נסיון הטעינה של הקובץ השמור שלך נכשל. האם ייתכן שהוא נוצר בגרסא שונה של בלוקלי?",
-  badXml: "תקלה בפענוח XML:\n\n%1\n\nנא לבחור 'אישור' כדי לנטוש את השינויים שלך או 'ביטול' כדי להמשיך ולערוך את ה־XML."
-};
diff --git a/demos/code/msg/hrx.js b/demos/code/msg/hrx.js
deleted file mode 100644
index ca0dea3fc3..0000000000
--- a/demos/code/msg/hrx.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Code",
-  blocks: "Bausten",
-  linkTooltip: "Speichre und auf Bausten verlinke.",
-  runTooltip: "Das Programm ausfüahre, das von den Bausten im Oorweitsbereich definiert ist.",
-  badCode: "Programmfehler:\n%1",
-  timeout: "Die maximale Ausführungswiederholunge woore üwerschritt.",
-  trashTooltip: "All Bausten verwerfe.",
-  catLogic: "Logik",
-  catLoops: "Schleife",
-  catMath: "Mathematik",
-  catText: "Text",
-  catLists: "Liste",
-  catColour: "Farreb",
-  catVariables: "Variable",
-  catFunctions: "Funktione",
-  listVariable: "List",
-  textVariable: "Text",
-  httpRequestError: "Mit der Oonfroch hots en Problem geb.",
-  linkAlert: "Tel von dein Bausten mit dem Link:\n\n%1",
-  hashError: "„%1“ stimmt leider mit kenem üweren gespeicherte Programm.",
-  xmlError: "Dein gespeicherte Datei könnt net gelood sin. Vielleicht woard se mit ener annre Version von Blockly erstellt.",
-  badXml: "Fehler beim Parse von XML:\n%1\n\nWähle 'OK' zum Verwerfe von deiner Ändrunge orrer 'Abbreche' zum XML weiter beoorbeite."
-};
diff --git a/demos/code/msg/hu.js b/demos/code/msg/hu.js
deleted file mode 100644
index eee1868634..0000000000
--- a/demos/code/msg/hu.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kódszerkesztő",
-  blocks: "Blokkok",
-  linkTooltip: "Hivatkozás létrehozása",
-  runTooltip: "Program futtatása.",
-  badCode: "Program hiba:\n%1",
-  timeout: "A program elérte a maximális végrehajtási időt.",
-  trashTooltip: "Összes blokk törlése.",
-  catLogic: "Logikai műveletek",
-  catLoops: "Ciklusok",
-  catMath: "Matematikai műveletek",
-  catText: "Sztring műveletek",
-  catLists: "Listakezelés",
-  catColour: "Színek",
-  catVariables: "Változók",
-  catFunctions: "Eljárások",
-  listVariable: "lista",
-  textVariable: "szöveg",
-  httpRequestError: "A kéréssel kapcsolatban probléma merült fel.",
-  linkAlert: "Ezzel a hivatkozással tudod megosztani a programodat:\n\n%1",
-  hashError: "Sajnos a '%1' hivatkozás nem tartozik egyetlen programhoz sem.",
-  xmlError: "A programodat nem lehet betölteni.  Elképzelhető, hogy a Blockly egy másik verziójában készült?",
-  badXml: "Hiba az XML feldolgozásakor:\n%1\n\nVáltozások elvetése?"
-};
diff --git a/demos/code/msg/ia.js b/demos/code/msg/ia.js
deleted file mode 100644
index 5938458bb9..0000000000
--- a/demos/code/msg/ia.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Codice",
-  blocks: "Blocos",
-  linkTooltip: "Salveguardar e ligar a blocos.",
-  runTooltip: "Executar le programma definite per le blocos in le spatio de travalio.",
-  badCode: "Error del programma:\n%1",
-  timeout: "Le numero de iterationes executate ha excedite le maximo.",
-  trashTooltip: "Abandonar tote le blocos.",
-  catLogic: "Logica",
-  catLoops: "Buclas",
-  catMath: "Mathematica",
-  catText: "Texto",
-  catLists: "Listas",
-  catColour: "Color",
-  catVariables: "Variabiles",
-  catFunctions: "Functiones",
-  listVariable: "lista",
-  textVariable: "texto",
-  httpRequestError: "Il habeva un problema con le requesta.",
-  linkAlert: "Divide tu blocos con iste ligamine:\n\n%1",
-  hashError: "Infelicemente, '%1' non corresponde a alcun programma salveguardate.",
-  xmlError: "Impossibile cargar le file salveguardate. Pote esser que illo ha essite create con un altere version de Blockly?",
-  badXml: "Error de analyse del XML:\n%1\n\nSelige 'OK' pro abandonar le modificationes o 'Cancellar' pro continuar a modificar le codice XML."
-};
diff --git a/demos/code/msg/is.js b/demos/code/msg/is.js
deleted file mode 100644
index fa5c40d80a..0000000000
--- a/demos/code/msg/is.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kóði",
-  blocks: "Kubbar",
-  linkTooltip: "Vista og tengja við kubba.",
-  runTooltip: "Keyra forritið sem kubbarnir á vinnusvæðinu mynda.",
-  badCode: "Villa í forriti:\n%1",
-  timeout: "Forritið hefur endurtekið sig of oft.",
-  trashTooltip: "Fleygja öllum kubbum.",
-  catLogic: "Rökvísi",
-  catLoops: "Lykkjur",
-  catMath: "Reikningur",
-  catText: "Texti",
-  catLists: "Listar",
-  catColour: "Litir",
-  catVariables: "Breytur",
-  catFunctions: "Stefjur",
-  listVariable: "listi",
-  textVariable: "texti",
-  httpRequestError: "Það kom upp vandamál með beiðnina.",
-  linkAlert: "Deildu kubbunum þínum með þessari krækju:",
-  hashError: "Því miður, '%1' passar ekki við neitt vistað forrit.",
-  xmlError: "Gat ekki hlaðið vistuðu skrána þína. Var hún kannske búin til í annarri útgáfu af Blockly?",
-  badXml: "Villa við úrvinnslu XML:\n%1\n\nVeldu 'Í lagi' til að sleppa breytingum eða 'Hætta við' til að halda áfram með XML."
-};
diff --git a/demos/code/msg/it.js b/demos/code/msg/it.js
deleted file mode 100644
index cd69b66b31..0000000000
--- a/demos/code/msg/it.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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."
-};
diff --git a/demos/code/msg/ja.js b/demos/code/msg/ja.js
deleted file mode 100644
index 6d50419825..0000000000
--- a/demos/code/msg/ja.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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\nXML の変更をやめるには「OK」、編集を続けるには「キャンセル」を選んでください。"
-};
diff --git a/demos/code/msg/ko.js b/demos/code/msg/ko.js
deleted file mode 100644
index 990cb6f236..0000000000
--- a/demos/code/msg/ko.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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바뀜을 포기하려면 '확인'을 선택하고 XML을 더 편집하려면 '취소'를 선택하세요."
-};
diff --git a/demos/code/msg/mk.js b/demos/code/msg/mk.js
deleted file mode 100644
index cc344a69ca..0000000000
--- a/demos/code/msg/mk.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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: "Не можев да ја вчитам зачуваната податотека. Да не сте ја создале со друга верзија на Blockly?",
-  badXml: "Грешка при расчленувањето на XML:\n%1\n\nСтиснете на „ОК“ за да ги напуштите промените или на „Откажи“ ако сакате уште да ја уредувате XML-податотеката."
-};
diff --git a/demos/code/msg/ms.js b/demos/code/msg/ms.js
deleted file mode 100644
index f3801cd0bb..0000000000
--- a/demos/code/msg/ms.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kod",
-  blocks: "Blok",
-  linkTooltip: "Simpan dan pautkan kepada blok.",
-  runTooltip: "Jalankan aturcara yang ditetapkan oleh blok-blok di dalam ruang kerja.",
-  badCode: "Ralat atur cara:\n%1",
-  timeout: "Takat maksimum lelaran pelaksanaan dicecah.",
-  trashTooltip: "Buang semua Blok.",
-  catLogic: "Logik",
-  catLoops: "Gelung",
-  catMath: "Matematik",
-  catText: "Teks",
-  catLists: "Senarai",
-  catColour: "Warna",
-  catVariables: "Pemboleh ubah",
-  catFunctions: "Fungsi",
-  listVariable: "senarai",
-  textVariable: "teks",
-  httpRequestError: "Permintaan itu terdapat masalah.",
-  linkAlert: "Kongsikan blok-blok anda dengan pautan ini:\n\n%1",
-  hashError: "Maaf, '%1' tidak berpadanan dengan sebarang aturcara yang disimpan.",
-  xmlError: "Fail simpanan anda tidak dapat dimuatkan. Jangan-jangan ia dicipta dengan versi Blockly yang berlainan?",
-  badXml: "Ralat ketika menghuraian XML:\n%1\n\nPilih 'OK' untuk melucutkan suntingan anda atau 'Batal' untuk bersambung menyunting XML-nya."
-};
diff --git a/demos/code/msg/nb.js b/demos/code/msg/nb.js
deleted file mode 100644
index 60ac0394d6..0000000000
--- a/demos/code/msg/nb.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kode",
-  blocks: "Blokker",
-  linkTooltip: "Lagre og lenke til blokker.",
-  runTooltip: "Kjør programmet definert av blokken i arbeidsområdet.",
-  badCode: "Programfeil:\n%1",
-  timeout: "Det maksimale antallet utførte looper er oversteget.",
-  trashTooltip: "Fjern alle blokker",
-  catLogic: "Logikk",
-  catLoops: "Looper",
-  catMath: "Matte",
-  catText: "Tekst",
-  catLists: "Lister",
-  catColour: "Farge",
-  catVariables: "Variabler",
-  catFunctions: "Funksjoner",
-  listVariable: "Liste",
-  textVariable: "Tekst",
-  httpRequestError: "Det oppsto et problem med forespørselen din",
-  linkAlert: "Del dine blokker med denne lenken:\n\n%1",
-  hashError: "Beklager, '%1' samsvarer ikke med noe lagret program.",
-  xmlError: "Kunne ikke laste inn filen. Kanskje den ble laget med en annen versjon av Blockly?",
-  badXml: "Feil ved parsering av XML:\n%1\n\nVelg 'OK' for å avbryte endringene eller 'Cancel' for å fortsette å redigere XML-koden."
-};
diff --git a/demos/code/msg/nl.js b/demos/code/msg/nl.js
deleted file mode 100644
index 339a5e8827..0000000000
--- a/demos/code/msg/nl.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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."
-};
diff --git a/demos/code/msg/oc.js b/demos/code/msg/oc.js
deleted file mode 100644
index c184ac8fb2..0000000000
--- a/demos/code/msg/oc.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Còde",
-  blocks: "Blòts",
-  linkTooltip: "Salva e liga als blòts.",
-  runTooltip: "Aviar lo programa definit pels blòts dins l’espaci de trabalh.",
-  badCode: "Error del programa :\n%1",
-  timeout: "Nombre maximum d’iteracions d’execucion depassat.",
-  trashTooltip: "Getar totes los blòts.",
-  catLogic: "Logic",
-  catLoops: "Boclas",
-  catMath: "Math",
-  catText: "Tèxte",
-  catLists: "Listas",
-  catColour: "Color",
-  catVariables: "Variablas",
-  catFunctions: "Foncions",
-  listVariable: "lista",
-  textVariable: "tèxte",
-  httpRequestError: "I a agut un problèma amb la demanda.",
-  linkAlert: "Partejatz vòstres blòts gràcia a aqueste ligam :\n\n%1",
-  hashError: "O planhèm, '%1' correspond pas a un fichièr Blockly salvament.",
-  xmlError: "Impossible de cargar lo fichièr de salvament.  Benlèu qu'es estat creat amb una autra version de Blockly ?",
-  badXml: "Error d’analisi del XML :\n%1\n\nSeleccionar 'D'acòrdi' per abandonar vòstras modificacions o 'Anullar' per modificar encara lo XML."
-};
diff --git a/demos/code/msg/pl.js b/demos/code/msg/pl.js
deleted file mode 100644
index 83bb05d2f9..0000000000
--- a/demos/code/msg/pl.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kod",
-  blocks: "Bloki",
-  linkTooltip: "Zapisz i podlinkuj do bloków",
-  runTooltip: "Uruchom program zdefinowany przez bloki w obszarze roboczym",
-  badCode: "Błąd programu:\n%1",
-  timeout: "Maksymalna liczba iteracji wykonywań przekroczona",
-  trashTooltip: "Odrzuć wszystkie bloki.",
-  catLogic: "Logika",
-  catLoops: "Pętle",
-  catMath: "Matematyka",
-  catText: "Tekst",
-  catLists: "Listy",
-  catColour: "Kolor",
-  catVariables: "Zmienne",
-  catFunctions: "Funkcje",
-  listVariable: "lista",
-  textVariable: "tekst",
-  httpRequestError: "Wystąpił problem z żądaniem.",
-  linkAlert: "Udpostępnij swoje bloki korzystając z poniższego linku : \n\n\n%1",
-  hashError: "Przepraszamy, \"%1\" nie odpowiada żadnemu zapisanemu programowi.",
-  xmlError: "Nie można załadować zapisanego pliku. Być może został utworzony za pomocą innej wersji Blockly?",
-  badXml: "Błąd parsowania XML : \n%1\n\nZaznacz 'OK' aby odrzucić twoje zmiany lub 'Cancel', żeby w przyszłości edytować XML."
-};
diff --git a/demos/code/msg/pms.js b/demos/code/msg/pms.js
deleted file mode 100644
index a7704f764d..0000000000
--- a/demos/code/msg/pms.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Còdes",
-  blocks: "Blòch",
-  linkTooltip: "Argistré e lijé ai blòch.",
-  runTooltip: "Fé andé ël programa definì dai blòch ant lë spassi ëd travaj.",
-  badCode: "Eror dël programa:\n%1",
-  timeout: "Nùmer màssim d'arpetission d'esecussion sorpassà.",
-  trashTooltip: "Scarté tuti ij blòch.",
-  catLogic: "Lògica",
-  catLoops: "Liasse",
-  catMath: "Matemàtica",
-  catText: "Test",
-  catLists: "Liste",
-  catColour: "Color",
-  catVariables: "Variàbij",
-  catFunctions: "Fonsion",
-  listVariable: "lista",
-  textVariable: "test",
-  httpRequestError: "A-i é staje un problema con l'arcesta.",
-  linkAlert: "Ch'a partagia ij sò blòch grassie a sta liura: %1",
-  hashError: "An dëspias, '%1 a corëspond a gnun programa salvà.",
-  xmlError: "A l'é nen podusse carié so archivi salvà. Miraco a l'é stàit creà con na version diferenta ëd Blockly?",
-  badXml: "Eror d'anàlisi dl'XML:\n%1\n\nSelessioné 'Va bin' për lassé perde toe modìfiche o 'Anulé' për modifiché ancora l'XML."
-};
diff --git a/demos/code/msg/pt-br.js b/demos/code/msg/pt-br.js
deleted file mode 100644
index 9b18d63600..0000000000
--- a/demos/code/msg/pt-br.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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."
-};
diff --git a/demos/code/msg/ro.js b/demos/code/msg/ro.js
deleted file mode 100644
index cd3de11d79..0000000000
--- a/demos/code/msg/ro.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Cod",
-  blocks: "Blocuri",
-  linkTooltip: "Salvează și adaugă la blocuri.",
-  runTooltip: "Execută programul definit de către blocuri în spațiul de lucru.",
-  badCode: "Eroare de program:\n%1",
-  timeout: "Numărul maxim de iterații a fost depășit.",
-  trashTooltip: "Șterge toate blocurile.",
-  catLogic: "Logic",
-  catLoops: "Bucle",
-  catMath: "Matematică",
-  catText: "Text",
-  catLists: "Liste",
-  catColour: "Culoare",
-  catVariables: "Variabile",
-  catFunctions: "Funcții",
-  listVariable: "listă",
-  textVariable: "text",
-  httpRequestError: "A apărut o problemă la solicitare.",
-  linkAlert: "Distribuie-ți blocurile folosind această legătură:\n\n%1",
-  hashError: "Scuze, „%1” nu corespunde nici unui program salvat.",
-  xmlError: "Sistemul nu a putut încărca fișierul salvat. Poate că a fost creat cu o altă versiune de Blockly?",
-  badXml: "Eroare de parsare XML:\n%1\n\nAlege „OK” pentru a renunța la modificările efectuate sau „Revocare” pentru a modifica în continuare fișierul XML."
-};
diff --git a/demos/code/msg/ru.js b/demos/code/msg/ru.js
deleted file mode 100644
index 389e9052a3..0000000000
--- a/demos/code/msg/ru.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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."
-};
diff --git a/demos/code/msg/sc.js b/demos/code/msg/sc.js
deleted file mode 100644
index 82f94d61d0..0000000000
--- a/demos/code/msg/sc.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Còdixi",
-  blocks: "Brocus",
-  linkTooltip: "Sarva e alliòngia a is brocus.",
-  runTooltip: "Arròllia su programa cumpostu de is brocus in s'àrea de traballu.",
-  badCode: "Errori in su Programa:\n%1",
-  timeout: "Giai lòmpius a su màssimu numeru de repicus.",
-  trashTooltip: "Boganci totu is brocus.",
-  catLogic: "Lògica",
-  catLoops: "Lòrigas",
-  catMath: "Matemàtica",
-  catText: "Testu",
-  catLists: "Lista",
-  catColour: "Colori",
-  catVariables: "Variabilis",
-  catFunctions: "Funtzionis",
-  listVariable: "lista",
-  textVariable: "testu",
-  httpRequestError: "Ddui fut unu problema cun sa pregunta",
-  linkAlert: "Poni is brocus tuus in custu acàpiu:\n\n%1",
-  hashError: "Mi dispraxit, '%1' non torrat a pari cun nimancu unu de is programas sarvaus.",
-  xmlError: "Non potzu carrigai su file sarvau. Fortzis est stètiu fatu cun d-una versioni diferenti de Blockly?",
-  badXml: "Errori in s'anàlisi XML:\n%1\n\nCraca 'OK' po perdi is mudàntzias 'Anudda' po sighì a scriri su XML."
-};
diff --git a/demos/code/msg/sk.js b/demos/code/msg/sk.js
deleted file mode 100644
index 3917df293e..0000000000
--- a/demos/code/msg/sk.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kód",
-  blocks: "Bloky",
-  linkTooltip: "Uložiť a zdieľať odkaz na tento program.",
-  runTooltip: "Spustiť program, zložený z dielcov na pracovnej ploche.",
-  badCode: "Chyba v programe:\n%1",
-  timeout: "Bol prekročený maximálny počet opakovaní.",
-  trashTooltip: "Zahodiť všetky dielce.",
-  catLogic: "Logika",
-  catLoops: "Cykly",
-  catMath: "Matematické",
-  catText: "Text",
-  catLists: "Zoznamy",
-  catColour: "Farby",
-  catVariables: "Premenné",
-  catFunctions: "Funkcie",
-  listVariable: "zoznam",
-  textVariable: "text",
-  httpRequestError: "Problém so spracovaním požiadavky.",
-  linkAlert: "Zdieľať tento program skopírovaním odkazu\n\n%1",
-  hashError: "Prepáč, '%1' nie je meno žiadnemu uloženému programu.",
-  xmlError: "Nebolo možné načítať uložený súbor. Možno bol vytvorený v inej verzii Blocky.",
-  badXml: "Chyba pri parsovaní XML:\n%1\n\nStlačte 'OK' ak chcete zrušiť zmeny alebo 'Zrušiť' pre pokračovanie v úpravách XML."
-};
diff --git a/demos/code/msg/sr.js b/demos/code/msg/sr.js
deleted file mode 100644
index f9a026ca08..0000000000
--- a/demos/code/msg/sr.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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: "Не могу да учитам сачувану датотеку. Можда је направљена другом верзијом Blockly-ја.",
-  badXml: "Грешка при рашчлањивању XML-а:\n%1\n\nПритисните „У реду“ да напустите измене или „Откажи“ да наставите са уређивањем XML датотеке."
-};
diff --git a/demos/code/msg/sv.js b/demos/code/msg/sv.js
deleted file mode 100644
index 4134a4c7dc..0000000000
--- a/demos/code/msg/sv.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kod",
-  blocks: "Block",
-  linkTooltip: "Spara och länka till block.",
-  runTooltip: "Kör programmet som definierats av blocken i arbetsytan.",
-  badCode: "Programfel:\n%1",
-  timeout: "Det maximala antalet utförda loopar har överskridits.",
-  trashTooltip: "Släng alla block.",
-  catLogic: "Logik",
-  catLoops: "Loopar",
-  catMath: "Matematik",
-  catText: "Text",
-  catLists: "Listor",
-  catColour: "Färg",
-  catVariables: "Variabler",
-  catFunctions: "Funktioner",
-  listVariable: "lista",
-  textVariable: "text",
-  httpRequestError: "Det uppstod ett problem med begäran.",
-  linkAlert: "Dela dina block med denna länk: \n\n%1",
-  hashError: "Tyvärr, '%1' överensstämmer inte med något sparat program.",
-  xmlError: "Kunde inte läsa din sparade fil. Den skapades kanske med en annan version av Blockly?",
-  badXml: "Fel vid parsning av XML:\n%1\n\nKlicka på 'OK' för att strunta i dina ändringar eller 'Avbryt' för att fortsätta redigera XML-koden."
-};
diff --git a/demos/code/msg/ta.js b/demos/code/msg/ta.js
deleted file mode 100644
index ff472e2b7e..0000000000
--- a/demos/code/msg/ta.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "கணினி நிரல்", //Code
-  blocks: "நிரல் துண்டு", //block
-  linkTooltip: "சேமித்து நிரல் துண்டிற்கு இணைக்க", //save and link to block
-  runTooltip: "பணிமனை நினைவகத்தில் இயக்குக", //Run the program defined by the blocks in the workspace.
-  badCode: "கணினி நிரல் கோளாறு:\n%1",
-  timeout: "அதிகபட்ச அடுக்கின் அளவை மீரியது", //max iters reached/exceeded
-  trashTooltip: "நீக்கு",
-  catLogic: "தர்க வகை",
-  catLoops: "மடக்கு வாக்கியம்",
-  catMath: "கணிதம்",
-  catText: "உரை",
-  catLists: "பட்டியல்",
-  catColour: "வண்ணம்",
-  catVariables: "மாறிகள்",
-  catFunctions: "சார்புகள்",
-  listVariable: "பட்டியல் மாறி",
-  textVariable: "உரை சரம்",
-  httpRequestError: "இந்த செயலை இயக்குவதில் கோளாறு ஏற்பட்டது",
-  linkAlert: "இந்த சுட்டி வழியாக நிரல் துண்டுகளை பகிரவும்:\n\n%1",
-  hashError: "'%1' : இது சேமித்த நிரலாக தெரியவில்லை.",
-  xmlError: "உங்களது நிரலை காணவில்லை; வேறு Blockly அத்தியாயத்தில் சேமித்தீரா?",
-  badXml: "XML பகுப்பதில் கோளாறு:\n%1\n\nOK' கிளிக் செய்தால் மாற்றங்கள் இழப்பீர்கள்; பிழைகளுடன் தொடர 'Cancel' கிளிக் செய்யவும்."
-};
diff --git a/demos/code/msg/th.js b/demos/code/msg/th.js
deleted file mode 100644
index 1ac36245bd..0000000000
--- a/demos/code/msg/th.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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: "ไม่สามารถโหลดไฟล์ที่บันทึกไว้ของคุณได้ บางทีมันอาจจะถูกสร้างขึ้นด้วย Blockly รุ่นอื่นที่แตกต่างกัน?",
-  badXml: "เกิดข้อผิดพลาดในการแยกวิเคราะห์ XML:\n%1\n\nเลือก 'ตกลง' เพื่อละทิ้งการเปลี่ยนแปลงต่างๆ ที่ทำไว้ หรือเลือก 'ยกเลิก' เพื่อแก้ไข XML ต่อไป"
-};
diff --git a/demos/code/msg/tlh.js b/demos/code/msg/tlh.js
deleted file mode 100644
index 8d0c056f93..0000000000
--- a/demos/code/msg/tlh.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "ngoq",
-  blocks: "ngoghmey",
-  linkTooltip: "",
-  runTooltip: "",
-  badCode: "Qagh:\n%1",
-  timeout: "tlhoy nI'qu' poH.",
-  trashTooltip: "",
-  catLogic: "meq",
-  catLoops: "vIHtaHbogh ghomey",
-  catMath: "mI'QeD",
-  catText: "ghItlhHommey",
-  catLists: "tetlhmey",
-  catColour: "rItlh",
-  catVariables: "lIwmey",
-  catFunctions: "mIwmey",
-  listVariable: "tetlh",
-  textVariable: "ghItlhHom",
-  httpRequestError: "Qapbe' tlhobmeH QIn.",
-  linkAlert: "latlhvaD ngoghmeylIj DangeHmeH Quvvam yIlo':\n\n%1",
-  hashError: "Do'Ha', ngogh nab pollu'pu'bogh 'oHbe'law' \"%1\"'e'.",
-  xmlError: "ngogh nablIj pollu'pu'bogh chu'qa'laHbe' vay'.  chaq pollu'pu'DI' ghunmeH ngogh pIm lo'lu'pu'.",
-  badXml: "XML yajchu'laHbe' vay':\n%1\n\nchoHmeylIj DalonmeH \"ruch\" yIwIv pagh XML DachoHqa'meH \"qIl\" yIwIv."
-};
diff --git a/demos/code/msg/tr.js b/demos/code/msg/tr.js
deleted file mode 100644
index 1448300922..0000000000
--- a/demos/code/msg/tr.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Kod",
-  blocks: "Bloklar",
-  linkTooltip: "Blokları ve bağlantı adresini kaydet.",
-  runTooltip: "Çalışma alanında bloklar tarafından tanımlanan programını çalıştırın.",
-  badCode: "Program hatası:\n %1",
-  timeout: "Maksimum yürütme yinelemeleri aşıldı.",
-  trashTooltip: "Bütün blokları at.",
-  catLogic: "Mantık",
-  catLoops: "Döngüler",
-  catMath: "Matematik",
-  catText: "Metin",
-  catLists: "Listeler",
-  catColour: "Renk",
-  catVariables: "Değişkenler",
-  catFunctions: "İşlevler",
-  listVariable: "liste",
-  textVariable: "metin",
-  httpRequestError: "İstek ile ilgili bir problem var.",
-  linkAlert: "Bloklarını bu bağlantı ile paylaş:\n\n%1",
-  hashError: "Üzgünüz, '%1' hiç bir kaydedilmiş program ile uyuşmuyor.",
-  xmlError: "Kaydedilen dosyanız yüklenemiyor\nBlockly'nin önceki sürümü ile kaydedilmiş olabilir mi?",
-  badXml: "XML ayrıştırma hatası:\n%1\n\nDeğişikliklerden vazgeçmek için 'Tamam'ı, düzenlemeye devam etmek için 'İptal' seçeneğini seçiniz."
-};
diff --git a/demos/code/msg/uk.js b/demos/code/msg/uk.js
deleted file mode 100644
index 6b34627215..0000000000
--- a/demos/code/msg/uk.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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: "Не вдалося завантажити ваш збережений файл.  Можливо, він був створений з іншої версії Blockly?",
-  badXml: "Помилка синтаксичного аналізу XML:\n%1\n\nВиберіть \"Гаразд\", щоб відмовитися від змін або 'Скасувати' для подальшого редагування XML."
-};
diff --git a/demos/code/msg/vi.js b/demos/code/msg/vi.js
deleted file mode 100644
index 952d024b4c..0000000000
--- a/demos/code/msg/vi.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var MSG = {
-  title: "Chương trình",
-  blocks: "Các mảnh",
-  linkTooltip: "Lưu và lấy địa chỉ liên kết.",
-  runTooltip: "Chạy chương trình.",
-  badCode: "'Lỗi chương trình:\n%1",
-  timeout: "Đã vượt quá số lần lặp cho phép.",
-  trashTooltip: "Xóa tất cả mọi mảnh.",
-  catLogic: "Logic",
-  catLoops: "Vòng lặp",
-  catMath: "Công thức toán",
-  catText: "Văn bản",
-  catLists: "Danh sách",
-  catColour: "Màu",
-  catVariables: "Biến",
-  catFunctions: "Hàm",
-  listVariable: "danh sách",
-  textVariable: "văn bản",
-  httpRequestError: "Hoạt động bị trục trặc, không thực hiện được yêu cầu của bạn.",
-  linkAlert: "Chia sẻ chương trình của bạn với liên kết sau:\n\n %1",
-  hashError: "Không tìm thấy chương trình được lưu ở '%1'.",
-  xmlError: "Không mở được chương trình của bạn.  Có thể nó nằm trong một phiên bản khác của Blockly?",
-  badXml: "Lỗi sử lý XML:\n %1\n\nChọn 'OK' để từ bỏ các thay đổi hoặc 'Hủy' để tiếp tục chỉnh sửa các XML."
-};
diff --git a/demos/code/msg/zh-hans.js b/demos/code/msg/zh-hans.js
deleted file mode 100644
index abf8a6589b..0000000000
--- a/demos/code/msg/zh-hans.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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: "无法载入您保存的文件。您是否使用其他版本的Blockly创建该文件的?",
-  badXml: "XML解析错误:\n%1\n\n选择“确定”以取消您对XML的修改,或选择“取消”以继续编辑XML。"
-};
diff --git a/demos/code/msg/zh-hant.js b/demos/code/msg/zh-hant.js
deleted file mode 100644
index 48a8b52727..0000000000
--- a/demos/code/msg/zh-hant.js
+++ /dev/null
@@ -1,24 +0,0 @@
-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: "未能載入您保存的檔案。或許它是由其他版本的Blockly創建?",
-  badXml: "解析 XML 時出現錯誤:\n%1\n\n選擇'確定'以放棄您的更改,或選擇'取消'以進一步編輯 XML。"
-};
diff --git a/demos/code/style.css b/demos/code/style.css
deleted file mode 100644
index e05664f24e..0000000000
--- a/demos/code/style.css
+++ /dev/null
@@ -1,163 +0,0 @@
-html, body {
-  height: 100%;
-}
-
-body {
-  background-color: #fff;
-  font-family: sans-serif;
-  margin: 0;
-  overflow: hidden;
-}
-
-.farSide {
-  text-align: right;
-}
-
-html[dir="RTL"] .farSide {
-  text-align: left;
-}
-
-/* Buttons */
-button {
-  margin: 5px;
-  padding: 10px;
-  border-radius: 4px;
-  border: 1px solid #ddd;
-  font-size: large;
-  background-color: #eee;
-  color: #000;
-}
-button.primary {
-  border: 1px solid #dd4b39;
-  background-color: #dd4b39;
-  color: #fff;
-}
-button.primary>img {
-  opacity: 1;
-}
-button>img {
-  opacity: 0.6;
-  vertical-align: text-bottom;
-}
-button:hover>img {
-  opacity: 1;
-}
-button:active {
-  border: 1px solid #888 !important;
-}
-button:hover {
-  box-shadow: 2px 2px 5px #888;
-}
-button.disabled:hover>img {
-  opacity: 0.6;
-}
-button.disabled {
-  display: none;
-}
-button.notext {
-  font-size: 10%;
-}
-
-h1 {
-  font-weight: normal;
-  font-size: 140%;
-  margin-left: 5px;
-  margin-right: 5px;
-}
-
-/* Tabs */
-#tabRow>td {
-  border: 1px solid #ccc;
-  border-bottom: none;
-}
-td.tabon {
-  border-bottom-color: #ddd !important;
-  background-color: #ddd;
-  padding: 5px 19px;
-}
-td.taboff {
-  cursor: pointer;
-  padding: 5px 19px;
-}
-td.taboff:hover {
-  background-color: #eee;
-}
-td.tabmin {
-  border-top-style: none !important;
-  border-left-style: none !important;
-  border-right-style: none !important;
-}
-td.tabmax {
-  border-top-style: none !important;
-  border-left-style: none !important;
-  border-right-style: none !important;
-  width: 99%;
-  padding-left: 10px;
-  padding-right: 10px;
-  text-align: right;
-}
-html[dir=rtl] td.tabmax {
-  text-align: left;
-}
-
-table {
-  border-collapse: collapse;
-  margin: 0;
-  padding: 0;
-  border: none;
-}
-td {
-  padding: 0;
-  vertical-align: top;
-}
-.content {
-  visibility: hidden;
-  margin: 0;
-  padding: 1ex;
-  position: absolute;
-  direction: ltr;
-}
-pre.content {
-  border: 1px solid #ccc;
-  overflow: scroll;
-}
-#content_blocks {
-  padding: 0;
-}
-.blocklySvg {
-  border-top: none !important;
-}
-#content_xml {
-  resize: none;
-  outline: none;
-  border: 1px solid #ccc;
-  font-family: monospace;
-  overflow: scroll;
-}
-#languageMenu {
-  vertical-align: top;
-  margin-top: 15px;
-  margin-right: 15px;
-}
-
-/* Buttons */
-button {
-  padding: 1px 10px;
-  margin: 1px 5px;
-}
-
-/* Sprited icons. */
-.icon21 {
-  height: 21px;
-  width: 21px;
-  background-image: url(icons.png);
-}
-.trash {
-  background-position: 0px 0px;
-}
-.link {
-  background-position: -21px 0px;
-}
-.run {
-  background-position: -42px 0px;
-}
diff --git a/demos/fixed/icon.png b/demos/fixed/icon.png
deleted file mode 100644
index 1158acf017..0000000000
Binary files a/demos/fixed/icon.png and /dev/null differ
diff --git a/demos/fixed/index.html b/demos/fixed/index.html
deleted file mode 100644
index c3805bee1c..0000000000
--- a/demos/fixed/index.html
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-  
-  Blockly Demo: Fixed Blockly
-  
-  
-  
-  
-
-
-  

Blockly > - Demos > Fixed Blockly

- -

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

- -

→ More info on injecting fixed-sized Blockly...

- -
- - - - - - - diff --git a/demos/generator/icon.png b/demos/generator/icon.png deleted file mode 100644 index 132016e3f2..0000000000 Binary files a/demos/generator/icon.png and /dev/null differ diff --git a/demos/generator/index.html b/demos/generator/index.html deleted file mode 100644 index 593eb4ba46..0000000000 --- a/demos/generator/index.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - Blockly Demo: Generating JavaScript - - - - - - - -

Blockly > - Demos > Generating JavaScript

- -

This is a simple demo of generating code from blocks.

- -

→ More info on Code Generators...

- -

- - -

- -
- - - - - - - - - diff --git a/demos/graph/icon.png b/demos/graph/icon.png deleted file mode 100644 index ad8b582f69..0000000000 Binary files a/demos/graph/icon.png and /dev/null differ diff --git a/demos/graph/index.html b/demos/graph/index.html deleted file mode 100644 index 83a6b71e25..0000000000 --- a/demos/graph/index.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - Blockly Demo: Graph - - - - - - - - -

Blockly > - Demos > Graph

- -

This is a demo of giving instant feedback as blocks are changed.

- -

→ More info on Realtime generation...

- - - - - - -
-
-
-
-
- -
- - ... -
- - - - - - - - - diff --git a/demos/headless/icon.png b/demos/headless/icon.png deleted file mode 100644 index af9ebe7142..0000000000 Binary files a/demos/headless/icon.png and /dev/null differ diff --git a/demos/headless/index.html b/demos/headless/index.html deleted file mode 100644 index c3bad9d3bb..0000000000 --- a/demos/headless/index.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - Blockly Demo: Headless - - - - - - - -

Blockly > - Demos > Headless

- -

This is a simple demo of generating Python code from XML with no graphics. - This might be useful for server-side code generation.

- - - - - - - -
- - - - -
- -
- -
- - - - - diff --git a/demos/index.html b/demos/index.html deleted file mode 100644 index 8af600662e..0000000000 --- a/demos/index.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - Blockly Demos - - - -

Blockly > Demos

- -

These demos are intended for developers who want to integrate Blockly with - their own applications.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Inject Blockly into a page as a fixed element.
-
- - - - - -
Inject Blockly into a page as a resizable element.
-
- - - - - -
Organize blocks into categories for the user.
-
- - - - - -
Limit the total number of blocks allowed (for academic exercises).
-
- - - - - -
Turn blocks into code and execute it.
-
- - - - - -
Generate code from XML without graphics.
-
- - - - - -
Step by step execution in JavaScript.
-
- - - - - -
Instant updates when blocks are changed.
-
- - - - - -
See what Blockly looks like in right-to-left mode (for Arabic and Hebrew).
-
- - - - - -
Using Closure Templates to support 35 languages.
-
- - - - - -
Save and load blocks with App Engine.
-
- - - - - -
Export a Blockly program into JavaScript, Python, PHP, Dart or XML.
-
- - - - - -
Build custom blocks using Blockly.
-
- - diff --git a/demos/interpreter/acorn_interpreter.js b/demos/interpreter/acorn_interpreter.js deleted file mode 100755 index b039ad3901..0000000000 --- a/demos/interpreter/acorn_interpreter.js +++ /dev/null @@ -1,130 +0,0 @@ -var mod$$inline_58=function(a){function b(a){n=a||{};for(var b in Ua)Object.prototype.hasOwnProperty.call(n,b)||(n[b]=Ua[b]);wa=n.sourceFile||null}function c(a,b){var c=Ab(k,a);b+=" ("+c.line+":"+c.column+")";var e=new SyntaxError(b);e.pos=a;e.loc=c;e.raisedAt=g;throw e;}function d(a){function b(a){if(1==a.length)return c+="return str === "+JSON.stringify(a[0])+";";c+="switch(str){";for(var va=0;vaa)++g;else if(47===a)if(a=k.charCodeAt(g+1),42===a){var a=n.onComment&&n.locations&&new f,b=g,e=k.indexOf("*/",g+=2);-1===e&&c(g-2,"Unterminated comment"); -g=e+2;if(n.locations){Y.lastIndex=b;for(var d=void 0;(d=Y.exec(k))&&d.index=a?a=P(!0):(++g,a=e(xa)),a;case 40:return++g,e(J);case 41:return++g,e(F);case 59:return++g,e(K);case 44:return++g,e(L);case 91:return++g,e(ja); -case 93:return++g,e(ka);case 123:return++g,e(Z);case 125:return++g,e(T);case 58:return++g,e(aa);case 63:return++g,e(ya);case 48:if(a=k.charCodeAt(g+1),120===a||88===a)return g+=2,a=l(16),null==a&&c(y+2,"Expected hexadecimal number"),la(k.charCodeAt(g))&&c(g,"Identifier directly after number"),a=e(ba,a);case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return P(!1);case 34:case 39:a:{g++;for(var b="";;){g>=S&&c(y,"Unterminated string constant");var f=k.charCodeAt(g);if(f===a){++g; -a=e(da,b);break a}if(92===f){var f=k.charCodeAt(++g),d=/^[0-7]+/.exec(k.slice(g,g+3));for(d&&(d=d[0]);d&&255=S)return e(pa);var b=k.charCodeAt(g);if(la(b)||92===b)return Ya();a=r(b);if(!1===a){b=String.fromCharCode(b);if("\\"===b||Za.test(b))return Ya();c(g,"Unexpected character '"+b+"'")}return a}function u(a,b){var c=k.slice(g,g+b);g+=b;e(a,c)}function D(){for(var a="",b,f,d=g;;){g>= -S&&c(d,"Unterminated regular expression");a=k.charAt(g);na.test(a)&&c(d,"Unterminated regular expression");if(b)b=!1;else{if("["===a)f=!0;else if("]"===a&&f)f=!1;else if("/"===a&&!f)break;b="\\"===a}++g}a=k.slice(d,g);++g;(b=$a())&&!/^[gmsiy]*$/.test(b)&&c(d,"Invalid regexp flag");return e(Ba,new RegExp(a,b))}function l(a,b){for(var c=g,f=0,e=0,d=null==b?Infinity:b;e=h?h-48:Infinity;if(h>=a)break;++g;f=f*a+h}return g===c||null!= -b&&g-c!==b?null:f}function P(a){var b=g,f=!1,d=48===k.charCodeAt(g);a||null!==l(10)||c(b,"Invalid number");46===k.charCodeAt(g)&&(++g,l(10),f=!0);a=k.charCodeAt(g);if(69===a||101===a)a=k.charCodeAt(++g),43!==a&&45!==a||++g,null===l(10)&&c(b,"Invalid number"),f=!0;la(k.charCodeAt(g))&&c(g,"Identifier directly after number");a=k.slice(b,g);var h;f?h=parseFloat(a):d&&1!==a.length?/[89]/.test(a)||C?c(b,"Invalid number"):h=parseInt(a,8):h=parseInt(a,10);return e(ba,h)}function ma(a){a=l(16,a);null===a&& -c(y,"Bad character escape sequence");return a}function $a(){ca=!1;for(var a,b=!0,f=g;;){var e=k.charCodeAt(g);if(ab(e))ca&&(a+=k.charAt(g)),++g;else if(92===e){ca||(a=k.slice(f,g));ca=!0;117!=k.charCodeAt(++g)&&c(g,"Expecting Unicode escape sequence \\uXXXX");++g;var e=ma(4),d=String.fromCharCode(e);d||c(g-1,"Invalid Unicode escape");(b?la(e):ab(e))||c(g-4,"Invalid Unicode escape");a+=d}else break;b=!1}return ca?a:k.slice(f,g)}function Ya(){var a=$a(),b=V;ca||(Lb(a)?b=Ca[a]:(n.forbidReserved&&(3=== -n.ecmaVersion?Mb:Nb)(a)||C&&bb(a))&&c(y,"The keyword '"+a+"' is reserved"));return e(b,a)}function t(){Da=y;M=X;Ea=ia;A()}function Fa(a){C=a;g=M;if(n.locations)for(;gb){var e=Q(a);e.left=a;e.operator=I;a=p;t();e.right=Ra(Sa(),f,c);f=q(e,a===Va||a===Wa?"LogicalExpression":"BinaryExpression");return Ra(f,b,c)}return a}function Sa(){if(p.prefix){var a=z(),b=p.isUpdate;a.operator=I;R=a.prefix=!0;t();a.argument= -Sa();b?ra(a.argument):C&&"delete"===a.operator&&"Identifier"===a.argument.type&&c(a.start,"Deleting local variable in strict mode");return q(a,b?"UpdateExpression":"UnaryExpression")}for(b=ha(ua());p.postfix&&!qa();)a=Q(b),a.operator=I,a.prefix=!1,a.argument=b,ra(b),t(),b=q(a,"UpdateExpression");return b}function ha(a,b){if(v(xa)){var c=Q(a);c.object=a;c.property=O(!0);c.computed=!1;return ha(q(c,"MemberExpression"),b)}return v(ja)?(c=Q(a),c.object=a,c.property=B(),c.computed=!0,w(ka),ha(q(c,"MemberExpression"), -b)):!b&&v(J)?(c=Q(a),c.callee=a,c.arguments=Ta(F,!1),ha(q(c,"CallExpression"),b)):a}function ua(){switch(p){case ub:var a=z();t();return q(a,"ThisExpression");case V:return O();case ba:case da:case Ba:return a=z(),a.value=I,a.raw=k.slice(y,X),t(),q(a,"Literal");case vb:case wb:case xb:return a=z(),a.value=p.atomValue,a.raw=p.keyword,t(),q(a,"Literal");case J:var a=oa,b=y;t();var f=B();f.start=b;f.end=X;n.locations&&(f.loc.start=a,f.loc.end=ia);n.ranges&&(f.range=[b,X]);w(F);return f;case ja:return a= -z(),t(),a.elements=Ta(ka,!0,!0),q(a,"ArrayExpression");case Z:a=z();b=!0;f=!1;a.properties=[];for(t();!v(T);){if(b)b=!1;else if(w(L),n.allowTrailingCommas&&v(T))break;var e={key:p===ba||p===da?ua():O(!0)},d=!1,h;v(aa)?(e.value=B(!0),h=e.kind="init"):5<=n.ecmaVersion&&"Identifier"===e.key.type&&("get"===e.key.name||"set"===e.key.name)?(d=f=!0,h=e.kind=e.key.name,e.key=p===ba||p===da?ua():O(!0),p!==J&&N(),e.value=Na(z(),!1)):N();if("Identifier"===e.key.type&&(C||f))for(var g=0;gf?a.id:a.params[f],(bb(e.name)||sa(e.name))&&c(e.start,"Defining '"+e.name+"' in strict mode"),0<=f)for(var d=0;da?36===a:91>a?!0:97>a?95===a:123>a?!0:170<=a&&Za.test(String.fromCharCode(a))},ab=a.isIdentifierChar=function(a){return 48>a?36===a:58>a?!0:65>a?!1:91>a?!0:97>a?95===a:123>a?!0:170<=a&&Pb.test(String.fromCharCode(a))},ca,Ia={kind:"loop"},Ob={kind:"switch"}}; -"object"==typeof exports&&"object"==typeof module?mod$$inline_58(exports):"function"==typeof define&&define.amd?define(["exports"],mod$$inline_58):mod$$inline_58(this.acorn||(this.acorn={})); -var Interpreter=function(a,b){this.initFunc_=b;this.UNDEFINED=this.createPrimitive(void 0);this.ast=acorn.parse(a);this.paused_=!1;var c=this.createScope(this.ast,null);this.stateStack=[{node:this.ast,scope:c,thisExpression:c}]};Interpreter.prototype.step=function(){if(!this.stateStack.length)return!1;if(this.paused_)return!0;var a=this.stateStack[0];this["step"+a.node.type]();return!0};Interpreter.prototype.run=function(){for(;!this.paused_&&this.step(););return this.paused_}; -Interpreter.prototype.initGlobalScope=function(a){this.setProperty(a,"Infinity",this.createPrimitive(Infinity),!0);this.setProperty(a,"NaN",this.createPrimitive(NaN),!0);this.setProperty(a,"undefined",this.UNDEFINED,!0);this.setProperty(a,"window",a,!0);this.setProperty(a,"self",a,!1);this.initFunction(a);this.initObject(a);a.parent=this.OBJECT;this.initArray(a);this.initNumber(a);this.initString(a);this.initBoolean(a);this.initDate(a);this.initMath(a);this.initRegExp(a);this.initJSON(a);var b=this, -c;c=function(a){a=a||b.UNDEFINED;return b.createPrimitive(isNaN(a.toNumber()))};this.setProperty(a,"isNaN",this.createNativeFunction(c));c=function(a){a=a||b.UNDEFINED;return b.createPrimitive(isFinite(a.toNumber()))};this.setProperty(a,"isFinite",this.createNativeFunction(c));c=function(a){a=a||b.UNDEFINED;return b.createPrimitive(parseFloat(a.toNumber()))};this.setProperty(a,"parseFloat",this.createNativeFunction(c));c=function(a,c){a=a||b.UNDEFINED;c=c||b.UNDEFINED;return b.createPrimitive(parseInt(a.toString(), -c.toNumber()))};this.setProperty(a,"parseInt",this.createNativeFunction(c));c=this.createObject(this.FUNCTION);c.eval=!0;this.setProperty(c,"length",this.createPrimitive(1),!0);this.setProperty(a,"eval",c);for(var d="escape unescape decodeURI decodeURIComponent encodeURI encodeURIComponent".split(" "),f=0;fa?Math.max(this.length+a,0):Math.min(a,this.length);e=c(e,Infinity);e=Math.min(e,this.length-a);for(var m=b.createObject(b.ARRAY),r=a;r=a;r--)this.properties[r+arguments.length-2]=this.properties[r];this.length+=arguments.length-2;for(r=2;rm&&(m=this.length+m);var m= -Math.max(0,Math.min(m,this.length)),r=c(e,this.length);0>r&&(r=this.length+r);for(var r=Math.max(0,Math.min(r,this.length)),A=0;mh&&(h=this.length+h);for(h=Math.max(0,Math.min(h, -this.length));hh&&(h=this.length+h);for(h=Math.max(0,Math.min(h,this.length));0<=h;h--){var m=b.getProperty(this,h);if(0==b.comp(m,a))return b.createPrimitive(h)}return b.createPrimitive(-1)};this.setProperty(this.ARRAY.properties.prototype, -"lastIndexOf",this.createNativeFunction(d),!1,!0);d=function(){for(var a=[],c=0;cb?1:0};Interpreter.prototype.arrayIndex=function(a){a=Number(a);return!isFinite(a)||a!=Math.floor(a)||0>a?NaN:a}; -Interpreter.prototype.createPrimitive=function(a){if(void 0===a&&this.UNDEFINED)return this.UNDEFINED;if(a instanceof RegExp)return this.createRegExp(this.createObject(this.REGEXP),a);var b=typeof a;a={data:a,isPrimitive:!0,type:b,toBoolean:function(){return Boolean(this.data)},toNumber:function(){return Number(this.data)},toString:function(){return String(this.data)},valueOf:function(){return this.data}};"number"==b?a.parent=this.NUMBER:"string"==b?a.parent=this.STRING:"boolean"==b&&(a.parent=this.BOOLEAN); -return a}; -Interpreter.prototype.createObject=function(a){a={isPrimitive:!1,type:"object",parent:a,fixed:Object.create(null),nonenumerable:Object.create(null),properties:Object.create(null),toBoolean:function(){return!0},toNumber:function(){return 0},toString:function(){return"["+this.type+"]"},valueOf:function(){return this}};this.isa(a,this.FUNCTION)&&(a.type="function",this.setProperty(a,"prototype",this.createObject(this.OBJECT||null)));this.isa(a,this.ARRAY)&&(a.length=0,a.toString=function(){for(var a=[], -c=0;c>="==b.operator)b=f>>e;else if(">>>="==b.operator)b=f>>>e;else if("&="==b.operator)b=f&e;else if("^="==b.operator)b=f^e;else if("|="==b.operator)b=f|e;else throw"Unknown assignment expression: "+b.operator;b=this.createPrimitive(b)}this.setValue(c,b);this.stateStack[0].value=b}else a.doneRight=!0,a.leftSide=a.value,this.stateStack.unshift({node:b.right});else a.doneLeft=!0,this.stateStack.unshift({node:b.left,components:!0})}; -Interpreter.prototype.stepBinaryExpression=function(){var a=this.stateStack[0],b=a.node;if(a.doneLeft)if(a.doneRight){this.stateStack.shift();var c=a.leftValue,a=a.value,d=this.comp(c,a);if("=="==b.operator||"!="==b.operator)c=c.isPrimitive&&a.isPrimitive?c.data==a.data:0===d,"!="==b.operator&&(c=!c);else if("==="==b.operator||"!=="==b.operator)c=c.isPrimitive&&a.isPrimitive?c.data===a.data:c===a,"!=="==b.operator&&(c=!c);else if(">"==b.operator)c=1==d;else if(">="==b.operator)c=1==d||0===d;else if("<"== -b.operator)c=-1==d;else if("<="==b.operator)c=-1==d||0===d;else if("+"==b.operator)"string"==c.type||"string"==a.type?(c=c.toString(),a=a.toString()):(c=c.toNumber(),a=a.toNumber()),c+=a;else if("in"==b.operator)c=this.hasProperty(a,c);else if(c=c.toNumber(),a=a.toNumber(),"-"==b.operator)c-=a;else if("*"==b.operator)c*=a;else if("/"==b.operator)c/=a;else if("%"==b.operator)c%=a;else if("&"==b.operator)c&=a;else if("|"==b.operator)c|=a;else if("^"==b.operator)c^=a;else if("<<"==b.operator)c<<=a;else if(">>"== -b.operator)c>>=a;else if(">>>"==b.operator)c>>>=a;else throw"Unknown binary operator: "+b.operator;this.stateStack[0].value=this.createPrimitive(c)}else a.doneRight=!0,a.leftValue=a.value,this.stateStack.unshift({node:b.right});else a.doneLeft=!0,this.stateStack.unshift({node:b.left})}; -Interpreter.prototype.stepBreakStatement=function(){var a=this.stateStack.shift(),a=a.node,b=null;a.label&&(b=a.label.name);for(a=this.stateStack.shift();a&&"callExpression"!=a.node.type;){if(b?b==a.label:a.isLoop||a.isSwitch)return;a=this.stateStack.shift()}throw new SyntaxError("Illegal break statement");};Interpreter.prototype.stepBlockStatement=function(){var a=this.stateStack[0],b=a.node,c=a.n_||0;b.body[c]?(a.n_=c+1,this.stateStack.unshift({node:b.body[c]})):this.stateStack.shift()}; -Interpreter.prototype.stepCallExpression=function(){var a=this.stateStack[0],b=a.node;if(a.doneCallee_){if(a.func_)c=a.n_,a.arguments.length!=b.arguments.length&&(a.arguments[c-1]=a.value);else{if("function"==a.value.type)a.func_=a.value;else if(a.member_=a.value[0],a.func_=this.getValue(a.value),!a.func_||"function"!=a.func_.type)throw new TypeError((a.func_&&a.func_.type)+" is not a function");"NewExpression"==a.node.type?(a.funcThis_=this.createObject(a.func_),a.isConstructor_=!0):a.funcThis_= -a.value.length?a.value[0]:this.stateStack[this.stateStack.length-1].thisExpression;a.arguments=[];var c=0}if(b.arguments[c])a.n_=c+1,this.stateStack.unshift({node:b.arguments[c]});else if(a.doneExec)this.stateStack.shift(),this.stateStack[0].value=a.isConstructor_?a.funcThis_:a.value;else{a.doneExec=!0;if(a.func_.node&&("FunctionApply_"==a.func_.node.type||"FunctionCall_"==a.func_.node.type)){a.funcThis_=a.arguments.shift();if("FunctionApply_"==a.func_.node.type){var d=a.arguments.shift();if(d&&this.isa(d, -this.ARRAY))for(a.arguments=[],b=0;bb?a.arguments[b]:this.UNDEFINED;this.setProperty(c,d,f)}d=this.createObject(this.ARRAY);for(b=0;b - - - - Blockly Demo: JS Interpreter - - - - - - - - -

Blockly > - Demos > JS Interpreter

- -

This is a simple demo of executing code with a sandboxed JavaScript interpreter.

- -

→ More info on JS Interpreter...

- -

- - -

- -
- - - - - - - - - diff --git a/demos/maxBlocks/icon.png b/demos/maxBlocks/icon.png deleted file mode 100644 index 13bf65a9c8..0000000000 Binary files a/demos/maxBlocks/icon.png and /dev/null differ diff --git a/demos/maxBlocks/index.html b/demos/maxBlocks/index.html deleted file mode 100644 index fd6b7eab07..0000000000 --- a/demos/maxBlocks/index.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Blockly Demo: Maximum Block Limit - - - - - - -

Blockly > - Demos > Maximum Block Limit

- -

This is a demo of Blockly which has been restricted to a maximum of - five blocks.

- -

You have block(s) left.

- -
- - - - - - - diff --git a/demos/plane/README.txt b/demos/plane/README.txt deleted file mode 100644 index 6da3fa65d6..0000000000 --- a/demos/plane/README.txt +++ /dev/null @@ -1,26 +0,0 @@ -This Blockly demo uses Closure Templates to create a multilingual application. -Any changes to the template.soy file require a recompile. Here is the command -to generate a quick English version for debugging: - -java -jar soy/SoyToJsSrcCompiler.jar --outputPathFormat generated/en.js --srcs template.soy - -To generate a full set of language translations, first extract all the strings -from template.soy using this command: - -java -jar soy/SoyMsgExtractor.jar --outputFile xlf/extracted_msgs.xlf template.soy - -This generates xlf/extracted_msgs.xlf, which may then be used by any -XLIFF-compatible translation console to generate a set of files with the -translated strings. These should be placed in the xlf directory. - -Finally, generate all the language versions wih this command: - -java -jar soy/SoyToJsSrcCompiler.jar --locales ar,be-tarask,br,ca,da,de,el,en,es,fa,fr,he,hrx,hu,ia,is,it,ja,ko,ms,nb,nl,pl,pms,pt-br,ro,ru,sc,sv,th,tr,uk,vi,zh-hans,zh-hant --messageFilePathFormat xlf/translated_msgs_{LOCALE}.xlf --outputPathFormat "generated/{LOCALE}.js" template.soy - -This is the process that Google uses for maintaining Blockly Games in 40+ -languages. The XLIFF fromat is simple enough that it is trival to write a -Python script to reformat it into some other format (such as JSON) for -compatability with other translation consoles. - -For more information, see message translation for Closure Templates: -https://developers.google.com/closure/templates/docs/translation diff --git a/demos/plane/blocks.js b/demos/plane/blocks.js deleted file mode 100644 index 18be29c5dd..0000000000 --- a/demos/plane/blocks.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Blockly Demos: Plane Seat Calculator Blocks - * - * Copyright 2013 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 Blocks for Blockly's Plane Seat Calculator application. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Blocks['plane_set_seats'] = { - // Block seat variable setter. - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_SET_HELPURL); - this.setColour(330); - this.appendValueInput('VALUE') - .appendField(Plane.getMsg('Plane_setSeats')); - this.setTooltip(Blockly.Msg.VARIABLES_SET_TOOLTIP); - this.setDeletable(false); - } -}; - -Blockly.JavaScript['plane_set_seats'] = function(block) { - // Generate JavaScript for seat variable setter. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_ASSIGNMENT) || 'NaN'; - return argument0 + ';'; -}; - -Blockly.Blocks['plane_get_rows'] = { - // Block for row variable getter. - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_GET_HELPURL); - this.setColour(330); - this.appendDummyInput() - .appendField(Plane.getMsg('Plane_getRows'), 'title'); - this.setOutput(true, 'Number'); - }, - customUpdate: function() { - this.setFieldValue( - Plane.getMsg('Plane_getRows').replace('%1', Plane.rows1st), 'title'); - } -}; - -Blockly.JavaScript['plane_get_rows'] = function(block) { - // Generate JavaScript for row variable getter. - return ['Plane.rows1st', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.Blocks['plane_get_rows1st'] = { - // Block for first class row variable getter. - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_GET_HELPURL); - this.setColour(330); - this.appendDummyInput() - .appendField(Plane.getMsg('Plane_getRows1'), 'title'); - this.setOutput(true, 'Number'); - }, - customUpdate: function() { - this.setFieldValue( - Plane.getMsg('Plane_getRows1').replace('%1', Plane.rows1st), 'title'); - } -}; - -Blockly.JavaScript['plane_get_rows1st'] = function(block) { - // Generate JavaScript for first class row variable getter. - return ['Plane.rows1st', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.Blocks['plane_get_rows2nd'] = { - // Block for second class row variable getter. - init: function() { - this.setHelpUrl(Blockly.Msg.VARIABLES_GET_HELPURL); - this.setColour(330); - this.appendDummyInput() - .appendField(Plane.getMsg('Plane_getRows2'), 'title'); - this.setOutput(true, 'Number'); - }, - customUpdate: function() { - this.setFieldValue( - Plane.getMsg('Plane_getRows2').replace('%1', Plane.rows2nd), 'title'); - } -}; - -Blockly.JavaScript['plane_get_rows2nd'] = function(block) { - // Generate JavaScript for second class row variable getter. - return ['Plane.rows2nd', Blockly.JavaScript.ORDER_MEMBER]; -}; diff --git a/demos/plane/generated/ar.js b/demos/plane/generated/ar.js deleted file mode 100644 index 1310949049..0000000000 --- a/demos/plane/generated/ar.js +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated from template.soy. -// Please don't edit this file by hand. - -if (typeof planepage == 'undefined') { var planepage = {}; } - - -planepage.messages = function(opt_data, opt_ignored, opt_ijData) { - return '
الصفوف: %1الصفوف (%1)صفوف الطبقة الأولى: %1صفوف الطبقة الأولى (%1)صفوف الفئة الثانية: %1صفوف الفئة الثانية: (%1)المقاعد: %1؟المقاعد =
'; -}; - - -planepage.start = function(opt_data, opt_ignored, opt_ijData) { - var output = planepage.messages(null, null, opt_ijData) + '

Blockly‏ > Demos‏ > آلة حاسبة لمقعد الطائرة   '; - var iLimit37 = opt_ijData.maxLevel + 1; - for (var i37 = 1; i37 < iLimit37; i37++) { - output += ' ' + ((i37 == opt_ijData.level) ? '' + soy.$$escapeHtml(i37) + '' : (i37 < opt_ijData.level) ? '' : '' + soy.$$escapeHtml(i37) + ''); - } - output += '

- - - - - - diff --git a/demos/plane/plane.js b/demos/plane/plane.js deleted file mode 100644 index c931c68d85..0000000000 --- a/demos/plane/plane.js +++ /dev/null @@ -1,443 +0,0 @@ -/** - * Blockly Demos: Plane Seat Calculator - * - * 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 JavaScript for Blockly's Plane Seat Calculator demo. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * Create a namespace for the application. - */ -var Plane = {}; - -/** - * Lookup for names of supported languages. Keys should be in ISO 639 format. - */ -Plane.LANGUAGE_NAME = { - 'ar': 'العربية', - 'be-tarask': 'Taraškievica', - 'br': 'Brezhoneg', - 'ca': 'Català', - 'da': 'Dansk', - 'de': 'Deutsch', - 'el': 'Ελληνικά', - 'en': 'English', - 'es': 'Español', - 'fa': 'فارسی', - 'fr': 'Français', - 'he': 'עברית', - 'hrx': 'Hunsrik', - 'hu': 'Magyar', - 'ia': 'Interlingua', - 'is': 'Íslenska', - 'it': 'Italiano', - 'ja': '日本語', - 'ko': '한국어', - 'ms': 'Bahasa Melayu', - 'nb': 'Norsk Bokmål', - 'nl': 'Nederlands, Vlaams', - 'pl': 'Polski', - 'pms': 'Piemontèis', - 'pt-br': 'Português Brasileiro', - 'ro': 'Română', - 'ru': 'Русский', - 'sc': 'Sardu', - 'sv': 'Svenska', - 'th': 'ภาษาไทย', - 'tr': 'Türkçe', - 'uk': 'Українська', - 'vi': 'Tiếng Việt', - 'zh-hans': '簡體中文', - 'zh-hant': '正體中文' -}; - -/** - * List of RTL languages. - */ -Plane.LANGUAGE_RTL = ['ar', 'fa', 'he']; - -/** - * Main Blockly workspace. - * @type {Blockly.WorkspaceSvg} - */ -Plane.workspace = null; - -/** - * Extracts a parameter from the URL. - * If the parameter is absent default_value is returned. - * @param {string} name The name of the parameter. - * @param {string} defaultValue Value to return if paramater not found. - * @return {string} The parameter value or the default value if not found. - */ -Plane.getStringParamFromUrl = function(name, defaultValue) { - var val = location.search.match(new RegExp('[?&]' + name + '=([^&]+)')); - return val ? decodeURIComponent(val[1].replace(/\+/g, '%20')) : defaultValue; -}; - -/** - * Extracts a numeric parameter from the URL. - * If the parameter is absent or less than min_value, min_value is - * returned. If it is greater than max_value, max_value is returned. - * @param {string} name The name of the parameter. - * @param {number} minValue The minimum legal value. - * @param {number} maxValue The maximum legal value. - * @return {number} A number in the range [min_value, max_value]. - */ -Plane.getNumberParamFromUrl = function(name, minValue, maxValue) { - var val = Number(Plane.getStringParamFromUrl(name, 'NaN')); - return isNaN(val) ? minValue : Math.min(Math.max(minValue, val), maxValue); -}; - -/** - * Get the language of this user from the URL. - * @return {string} User's language. - */ -Plane.getLang = function() { - var lang = Plane.getStringParamFromUrl('lang', ''); - if (Plane.LANGUAGE_NAME[lang] === undefined) { - // Default to English. - lang = 'en'; - } - return lang; -}; - -/** - * Is the current language (Plane.LANG) an RTL language? - * @return {boolean} True if RTL, false if LTR. - */ -Plane.isRtl = function() { - return Plane.LANGUAGE_RTL.indexOf(Plane.LANG) != -1; -}; - -/** - * Load blocks saved in session/local storage. - * @param {string} defaultXml Text representation of default blocks. - */ -Plane.loadBlocks = function(defaultXml) { - try { - var loadOnce = window.sessionStorage.loadOnceBlocks; - } catch(e) { - // Firefox sometimes throws a SecurityError when accessing sessionStorage. - // Restarting Firefox fixes this, so it looks like a bug. - var loadOnce = null; - } - if (loadOnce) { - // Language switching stores the blocks during the reload. - delete window.sessionStorage.loadOnceBlocks; - var xml = Blockly.Xml.textToDom(loadOnce); - Blockly.Xml.domToWorkspace(Plane.workspace, xml); - } else if (defaultXml) { - // Load the editor with default starting blocks. - var xml = Blockly.Xml.textToDom(defaultXml); - Blockly.Xml.domToWorkspace(Plane.workspace, xml); - } -}; - -/** - * Save the blocks and reload with a different language. - */ -Plane.changeLanguage = function() { - // Store the blocks for the duration of the reload. - // This should be skipped for the index page, which has no blocks and does - // not load Blockly. - // MSIE 11 does not support sessionStorage on file:// URLs. - if (typeof Blockly != 'undefined' && window.sessionStorage) { - var xml = Blockly.Xml.workspaceToDom(Plane.workspace); - var text = Blockly.Xml.domToText(xml); - window.sessionStorage.loadOnceBlocks = text; - } - - var languageMenu = document.getElementById('languageMenu'); - var newLang = encodeURIComponent( - languageMenu.options[languageMenu.selectedIndex].value); - var search = window.location.search; - if (search.length <= 1) { - search = '?lang=' + newLang; - } else if (search.match(/[?&]lang=[^&]*/)) { - search = search.replace(/([?&]lang=)[^&]*/, '$1' + newLang); - } else { - search = search.replace(/\?/, '?lang=' + newLang + '&'); - } - - window.location = window.location.protocol + '//' + - window.location.host + window.location.pathname + search; -}; - -/** - * Gets the message with the given key from the document. - * @param {string} key The key of the document element. - * @return {string} The textContent of the specified element, - * or an error message if the element was not found. - */ -Plane.getMsg = function(key) { - var element = document.getElementById(key); - if (element) { - var text = element.textContent; - // Convert newline sequences. - text = text.replace(/\\n/g, '\n'); - return text; - } else { - return '[Unknown message: ' + key + ']'; - } -}; - -/** - * User's language (e.g. "en"). - * @type {string} - */ -Plane.LANG = Plane.getLang(); - -Plane.MAX_LEVEL = 3; -Plane.LEVEL = Plane.getNumberParamFromUrl('level', 1, Plane.MAX_LEVEL); - -Plane.rows1st = 0; -Plane.rows2nd = 0; - -/** - * Redraw the rows when the slider has moved. - * @param {number} value New slider position. - */ -Plane.sliderChange = function(value) { - var newRows = Math.round(value * 410 / 20); - Plane.redraw(newRows); -}; - -/** - * Change the text of a label. - * @param {string} id ID of element to change. - * @param {string} text New text. - */ -Plane.setText = function(id, text) { - var el = document.getElementById(id); - while (el.firstChild) { - el.removeChild(el.firstChild); - } - el.appendChild(document.createTextNode(text)); -}; - -/** - * Display a checkmark or cross next to the answer. - * @param {?boolean} ok True for checkmark, false for cross, null for nothing. - */ -Plane.setCorrect = function(ok) { - var yes = document.getElementById('seatYes'); - var no = document.getElementById('seatNo'); - yes.style.display = 'none'; - no.style.display = 'none'; - if (ok === true) { - yes.style.display = 'block'; - } else if (ok === false) { - no.style.display = 'block'; - } -}; - -/** - * Initialize Blockly and the SVG plane. - */ -Plane.init = function() { - Plane.initLanguage(); - - // Fixes viewport for small screens. - var viewport = document.querySelector('meta[name="viewport"]'); - if (viewport && screen.availWidth < 725) { - viewport.setAttribute('content', - 'width=725, initial-scale=.35, user-scalable=no'); - } - - Plane.workspace = Blockly.inject('blockly', - {media: '../../media/', - rtl: Plane.isRtl(), - toolbox: document.getElementById('toolbox')}); - - var defaultXml = - '' + - ' ' + - ' ' + - ''; - Plane.loadBlocks(defaultXml); - - Plane.workspace.addChangeListener(Plane.recalculate); - - // Initialize the slider. - var svg = document.getElementById('plane'); - Plane.rowSlider = new Slider(60, 330, 425, svg, Plane.sliderChange); - Plane.rowSlider.setValue(0.225); - - // Draw five 1st class rows. - Plane.redraw(5); -}; - -/** - * Initialize the page language. - */ -Plane.initLanguage = function() { - // Set the page title with the content of the H1 title. - document.title += ' ' + document.getElementById('title').textContent; - - // Set the HTML's language and direction. - // document.dir fails in Mozilla, use document.body.parentNode.dir instead. - // https://bugzilla.mozilla.org/show_bug.cgi?id=151407 - var rtl = Plane.isRtl(); - document.head.parentElement.setAttribute('dir', rtl ? 'rtl' : 'ltr'); - document.head.parentElement.setAttribute('lang', Plane.LANG); - - // Sort languages alphabetically. - var languages = []; - for (var lang in Plane.LANGUAGE_NAME) { - languages.push([Plane.LANGUAGE_NAME[lang], lang]); - } - var comp = function(a, b) { - // Sort based on first argument ('English', 'Русский', '简体字', etc). - if (a[0] > b[0]) return 1; - if (a[0] < b[0]) return -1; - return 0; - }; - languages.sort(comp); - // Populate the language selection menu. - var languageMenu = document.getElementById('languageMenu'); - languageMenu.options.length = 0; - for (var i = 0; i < languages.length; i++) { - var tuple = languages[i]; - var lang = tuple[tuple.length - 1]; - var option = new Option(tuple[0], lang); - if (lang == Plane.LANG) { - option.selected = true; - } - languageMenu.options.add(option); - } - languageMenu.addEventListener('change', Plane.changeLanguage, true); -}; - -/** - * Use the blocks to calculate the number of seats. - * Display the calculated number. - */ -Plane.recalculate = function() { - // Find the 'set' block and use it as the formula root. - var rootBlock = null; - var blocks = Plane.workspace.getTopBlocks(false); - for (var i = 0, block; block = blocks[i]; i++) { - if (block.type == 'plane_set_seats') { - rootBlock = block; - } - } - var seats = NaN; - Blockly.JavaScript.init(Plane.workspace); - var code = Blockly.JavaScript.blockToCode(rootBlock); - try { - seats = eval(code); - } catch (e) { - // Allow seats to remain NaN. - } - Plane.setText('seatText', - Plane.getMsg('Plane_seats').replace( - '%1', isNaN(seats) ? '?' : seats)); - Plane.setCorrect(isNaN(seats) ? null : (Plane.answer() == seats)); - - // Update blocks to show values. - function updateBlocks(blocks) { - for (var i = 0, block; block = blocks[i]; i++) { - block.customUpdate && block.customUpdate(); - } - } - updateBlocks(Plane.workspace.getAllBlocks()); - updateBlocks(Plane.workspace.flyout_.workspace_.getAllBlocks()); -}; - -/** - * Calculate the correct answer. - * @return {number} Number of seats. - */ -Plane.answer = function() { - if (Plane.LEVEL == 1) { - return Plane.rows1st * 4; - } else if (Plane.LEVEL == 2) { - return 2 + (Plane.rows1st * 4); - } else if (Plane.LEVEL == 3) { - return 2 + (Plane.rows1st * 4) + (Plane.rows2nd * 5); - } - throw 'Unknown level.'; -}; - -/** - * Redraw the SVG to show a new number of rows. - * @param {number} newRows - */ -Plane.redraw = function(newRows) { - var rows1st = Plane.rows1st; - var rows2nd = Plane.rows2nd; - var svg = document.getElementById('plane'); - if (newRows != rows1st) { - while (newRows < rows1st) { - var row = document.getElementById('row1st' + rows1st); - row.parentNode.removeChild(row); - rows1st--; - } - while (newRows > rows1st) { - rows1st++; - var row = document.createElementNS('http://www.w3.org/2000/svg', 'use'); - row.setAttribute('id', 'row1st' + rows1st); - // Row of 4 seats. - row.setAttribute('x', (rows1st - 1) * 20); - row.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', '#row1st'); - svg.appendChild(row); - } - - if (Plane.LEVEL == 3) { - newRows = Math.floor((21 - newRows) * 1.11); - while (newRows < rows2nd) { - var row = document.getElementById('row2nd' + rows2nd); - row.parentNode.removeChild(row); - rows2nd--; - } - while (newRows > rows2nd) { - rows2nd++; - var row = document.createElementNS('http://www.w3.org/2000/svg', - 'use'); - row.setAttribute('id', 'row2nd' + rows2nd); - row.setAttribute('x', 400 - (rows2nd - 1) * 18); - row.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', '#row2nd'); - svg.appendChild(row); - } - } - - if (Plane.LEVEL < 3) { - Plane.setText('row1stText', - Plane.getMsg('Plane_rows').replace('%1', rows1st)); - } else { - Plane.setText('row1stText', - Plane.getMsg('Plane_rows1').replace('%1', rows1st)); - Plane.setText('row2ndText', - Plane.getMsg('Plane_rows2').replace('%1', rows2nd)); - } - - Plane.rows1st = rows1st; - Plane.rows2nd = rows2nd; - Plane.recalculate(); - } -}; - -window.addEventListener('load', Plane.init); - -// Load the user's language pack. -document.write('\n'); diff --git a/demos/plane/slider.js b/demos/plane/slider.js deleted file mode 100644 index 2df67b8344..0000000000 --- a/demos/plane/slider.js +++ /dev/null @@ -1,287 +0,0 @@ -/** - * Blockly Demos: SVG Slider - * - * 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 A slider control in SVG. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - - -/** - * Object representing a horizontal slider widget. - * @param {number} x The horizontal offset of the slider. - * @param {number} y The vertical offset of the slider. - * @param {number} width The total width of the slider. - * @param {!Element} svgParent The SVG element to append the slider to. - * @param {Function=} opt_changeFunc Optional callback function that will be - * called when the slider is moved. The current value is passed. - * @constructor - */ -var Slider = function(x, y, width, svgParent, opt_changeFunc) { - this.KNOB_Y_ = y - 12; - this.KNOB_MIN_X_ = x + 8; - this.KNOB_MAX_X_ = x + width - 8; - this.TARGET_OVERHANG_ = 20; - this.value_ = 0.5; - this.changeFunc_ = opt_changeFunc; - this.animationTasks_ = []; - - // Draw the slider. - /* - - - - - */ - var track = document.createElementNS(Slider.SVG_NS_, 'line'); - track.setAttribute('class', 'sliderTrack'); - track.setAttribute('x1', x); - track.setAttribute('y1', y); - track.setAttribute('x2', x + width); - track.setAttribute('y2', y); - svgParent.appendChild(track); - this.track_ = track; - var rect = document.createElementNS(Slider.SVG_NS_, 'rect'); - rect.setAttribute('style', 'opacity: 0'); - rect.setAttribute('x', x - this.TARGET_OVERHANG_); - rect.setAttribute('y', y - this.TARGET_OVERHANG_); - rect.setAttribute('width', width + 2 * this.TARGET_OVERHANG_); - rect.setAttribute('height', 2 * this.TARGET_OVERHANG_); - rect.setAttribute('rx', this.TARGET_OVERHANG_); - rect.setAttribute('ry', this.TARGET_OVERHANG_); - svgParent.appendChild(rect); - this.trackTarget_ = rect; - var knob = document.createElementNS(Slider.SVG_NS_, 'path'); - knob.setAttribute('class', 'sliderKnob'); - knob.setAttribute('d', 'm 0,0 l -8,8 v 12 h 16 v -12 z'); - svgParent.appendChild(knob); - this.knob_ = knob; - var circle = document.createElementNS(Slider.SVG_NS_, 'circle'); - circle.setAttribute('style', 'opacity: 0'); - circle.setAttribute('r', this.TARGET_OVERHANG_); - circle.setAttribute('cy', y); - svgParent.appendChild(circle); - this.knobTarget_ = circle; - this.setValue(0.5); - - // Find the root SVG object. - while (svgParent && svgParent.nodeName.toLowerCase() != 'svg') { - svgParent = svgParent.parentNode; - } - this.SVG_ = svgParent; - - // Bind the events to this slider. - Slider.bindEvent_(this.knobTarget_, 'mousedown', this, this.knobMouseDown_); - Slider.bindEvent_(this.knobTarget_, 'touchstart', this, this.knobMouseDown_); - Slider.bindEvent_(this.trackTarget_, 'mousedown', this, this.rectMouseDown_); - Slider.bindEvent_(this.SVG_, 'mouseup', null, Slider.knobMouseUp_); - Slider.bindEvent_(this.SVG_, 'touchend', null, Slider.knobMouseUp_); - Slider.bindEvent_(this.SVG_, 'mousemove', null, Slider.knobMouseMove_); - Slider.bindEvent_(this.SVG_, 'touchmove', null, Slider.knobMouseMove_); - Slider.bindEvent_(document, 'mouseover', null, Slider.mouseOver_); -}; - - -Slider.SVG_NS_ = 'http://www.w3.org/2000/svg'; - -Slider.activeSlider_ = null; -Slider.startMouseX_ = 0; -Slider.startKnobX_ = 0; - -/** - * Start a drag when clicking down on the knob. - * @param {!Event} e Mouse-down event. - * @private - */ -Slider.prototype.knobMouseDown_ = function(e) { - if (e.type == 'touchstart') { - if (e.changedTouches.length != 1) { - return; - } - Slider.touchToMouse_(e) - } - Slider.activeSlider_ = this; - Slider.startMouseX_ = this.mouseToSvg_(e).x; - Slider.startKnobX_ = 0; - var transform = this.knob_.getAttribute('transform'); - if (transform) { - var r = transform.match(/translate\(\s*([-\d.]+)/); - if (r) { - Slider.startKnobX_ = Number(r[1]); - } - } - // Stop browser from attempting to drag the knob or - // from scrolling/zooming the page. - e.preventDefault(); -}; - -/** - * Stop a drag when clicking up anywhere. - * @param {Event} e Mouse-up event. - * @private - */ -Slider.knobMouseUp_ = function(e) { - Slider.activeSlider_ = null; -}; - -/** - * Stop a drag when the mouse enters a node not part of the SVG. - * @param {Event} e Mouse-up event. - * @private - */ -Slider.mouseOver_ = function(e) { - if (!Slider.activeSlider_) { - return; - } - var node = e.target; - // Find the root SVG object. - do { - if (node == Slider.activeSlider_.SVG_) { - return; - } - } while (node = node.parentNode); - Slider.knobMouseUp_(e); -}; - -/** - * Drag the knob to follow the mouse. - * @param {!Event} e Mouse-move event. - * @private - */ -Slider.knobMouseMove_ = function(e) { - var thisSlider = Slider.activeSlider_; - if (!thisSlider) { - return; - } - if (e.type == 'touchmove') { - if (e.changedTouches.length != 1) { - return; - } - Slider.touchToMouse_(e) - } - var x = thisSlider.mouseToSvg_(e).x - Slider.startMouseX_ + - Slider.startKnobX_; - thisSlider.setValue((x - thisSlider.KNOB_MIN_X_) / - (thisSlider.KNOB_MAX_X_ - thisSlider.KNOB_MIN_X_)); -}; - -/** - * Jump to a new value when the track is clicked. - * @param {!Event} e Mouse-down event. - * @private - */ -Slider.prototype.rectMouseDown_ = function(e) { - if (e.type == 'touchstart') { - if (e.changedTouches.length != 1) { - return; - } - Slider.touchToMouse_(e) - } - var x = this.mouseToSvg_(e).x; - this.animateValue((x - this.KNOB_MIN_X_) / - (this.KNOB_MAX_X_ - this.KNOB_MIN_X_)); -}; - -/** - * Returns the slider's value (0.0 - 1.0). - * @return {number} Current value. - */ -Slider.prototype.getValue = function() { - return this.value_; -}; - -/** - * Animates the slider's value (0.0 - 1.0). - * @param {number} value New value. - */ -Slider.prototype.animateValue = function(value) { - // Clear any ongoing animations. - while (this.animationTasks_.length) { - clearTimeout(this.animationTasks_.pop()); - } - var duration = 200; // Milliseconds to animate for. - var steps = 10; // Number of steps to animate. - var oldValue = this.getValue(); - var thisSlider = this; - var stepFunc = function(i) { - return function() { - var newVal = i * (value - oldValue) / (steps - 1) + oldValue; - thisSlider.setValue(newVal); - }; - } - for (var i = 0; i < steps; i++) { - this.animationTasks_.push(setTimeout(stepFunc(i), i * duration / steps)); - } -}; - -/** - * Sets the slider's value (0.0 - 1.0). - * @param {number} value New value. - */ -Slider.prototype.setValue = function(value) { - this.value_ = Math.min(Math.max(value, 0), 1); - var x = this.KNOB_MIN_X_ + - (this.KNOB_MAX_X_ - this.KNOB_MIN_X_) * this.value_; - this.knob_.setAttribute('transform', - 'translate(' + x + ',' + this.KNOB_Y_ + ')'); - this.knobTarget_.setAttribute('cx', x); - this.changeFunc_ && this.changeFunc_(this.value_); -}; - -/** - * Convert the mouse coordinates into SVG coordinates. - * @param {!Object} e Object with x and y mouse coordinates. - * @return {!Object} Object with x and y properties in SVG coordinates. - * @private - */ -Slider.prototype.mouseToSvg_ = function(e) { - var svgPoint = this.SVG_.createSVGPoint(); - svgPoint.x = e.clientX; - svgPoint.y = e.clientY; - var matrix = this.SVG_.getScreenCTM().inverse(); - return svgPoint.matrixTransform(matrix); -}; - -/** - * Bind an event to a function call. - * @param {!Node} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @private - */ -Slider.bindEvent_ = function(node, name, thisObject, func) { - var wrapFunc = function(e) { - func.apply(thisObject, arguments); - }; - node.addEventListener(name, wrapFunc, false); -}; - -/** - * Map the touch event's properties to be compatible with a mouse event. - * @param {TouchEvent} e Event to modify. - */ -Slider.touchToMouse_ = function(e) { - var touchPoint = e.changedTouches[0]; - e.clientX = touchPoint.clientX; - e.clientY = touchPoint.clientY; -}; diff --git a/demos/plane/soy/COPYING b/demos/plane/soy/COPYING deleted file mode 100644 index d645695673..0000000000 --- a/demos/plane/soy/COPYING +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - 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 - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/demos/plane/soy/README b/demos/plane/soy/README deleted file mode 100644 index e3447f2d81..0000000000 --- a/demos/plane/soy/README +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2009 Google Inc. -// -// 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. - - -Contents: - -+ SoyToJsSrcCompiler.jar - Executable jar that compiles template files into JavaScript files. - -+ SoyMsgExtractor.jar - Executable jar that extracts messages from template files into XLF files. - -+ soyutils.js - Helper utilities required by all JavaScript code that SoyToJsSrcCompiler - generates. Equivalent functionality to soyutils_usegoog.js, but this - version does not need Closure Library. - - -Instructions: - -+ A simple Hello World for JavaScript: - http://code.google.com/closure/templates/docs/helloworld_js.html - -+ Complete documentation: - http://code.google.com/closure/templates/ - -+ Closure Templates project on Google Code: - http://code.google.com/p/closure-templates/ - - -Notes: - -+ Closure Templates requires Java 6 or higher: - http://www.java.com/ diff --git a/demos/plane/soy/SoyMsgExtractor.jar b/demos/plane/soy/SoyMsgExtractor.jar deleted file mode 100644 index d7d2619843..0000000000 Binary files a/demos/plane/soy/SoyMsgExtractor.jar and /dev/null differ diff --git a/demos/plane/soy/SoyToJsSrcCompiler.jar b/demos/plane/soy/SoyToJsSrcCompiler.jar deleted file mode 100644 index 540a0702a8..0000000000 Binary files a/demos/plane/soy/SoyToJsSrcCompiler.jar and /dev/null differ diff --git a/demos/plane/soy/soyutils.js b/demos/plane/soy/soyutils.js deleted file mode 100644 index bde8e4133d..0000000000 --- a/demos/plane/soy/soyutils.js +++ /dev/null @@ -1,2767 +0,0 @@ -/* - * Copyright 2008 Google Inc. - * - * 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 - * Utility functions and classes for Soy. - * - *

- * The top portion of this file contains utilities for Soy users:

    - *
  • soy.StringBuilder: Compatible with the 'stringbuilder' code style. - *
  • soy.renderElement: Render template and set as innerHTML of an element. - *
  • soy.renderAsFragment: Render template and return as HTML fragment. - *
- * - *

- * The bottom portion of this file contains utilities that should only be called - * by Soy-generated JS code. Please do not use these functions directly from - * your hand-writen code. Their names all start with '$$'. - * - * @author Garrett Boyer - * @author Mike Samuel - * @author Kai Huang - * @author Aharon Lanin - */ - - -// COPIED FROM nogoog_shim.js - -// Create closure namespaces. -var goog = goog || {}; - - -goog.DEBUG = false; - - -goog.inherits = function(childCtor, parentCtor) { - /** @constructor */ - function tempCtor() {} - tempCtor.prototype = parentCtor.prototype; - childCtor.superClass_ = parentCtor.prototype; - childCtor.prototype = new tempCtor(); - childCtor.prototype.constructor = childCtor; -}; - - -// Just enough browser detection for this file. -if (!goog.userAgent) { - goog.userAgent = (function() { - var userAgent = ""; - if ("undefined" !== typeof navigator && navigator - && "string" == typeof navigator.userAgent) { - userAgent = navigator.userAgent; - } - var isOpera = userAgent.indexOf('Opera') == 0; - return { - jscript: { - /** - * @type {boolean} - */ - HAS_JSCRIPT: 'ScriptEngine' in this - }, - /** - * @type {boolean} - */ - OPERA: isOpera, - /** - * @type {boolean} - */ - IE: !isOpera && userAgent.indexOf('MSIE') != -1, - /** - * @type {boolean} - */ - WEBKIT: !isOpera && userAgent.indexOf('WebKit') != -1 - }; - })(); -} - -if (!goog.asserts) { - goog.asserts = { - /** - * @param {*} condition Condition to check. - */ - assert: function (condition) { - if (!condition) { - throw Error('Assertion error'); - } - }, - /** - * @param {...*} var_args - */ - fail: function (var_args) {} - }; -} - - -// Stub out the document wrapper used by renderAs*. -if (!goog.dom) { - goog.dom = {}; - /** - * @param {Document=} d - * @constructor - */ - goog.dom.DomHelper = function(d) { - this.document_ = d || document; - }; - /** - * @return {!Document} - */ - goog.dom.DomHelper.prototype.getDocument = function() { - return this.document_; - }; - /** - * Creates a new element. - * @param {string} name Tag name. - * @return {!Element} - */ - goog.dom.DomHelper.prototype.createElement = function(name) { - return this.document_.createElement(name); - }; - /** - * Creates a new document fragment. - * @return {!DocumentFragment} - */ - goog.dom.DomHelper.prototype.createDocumentFragment = function() { - return this.document_.createDocumentFragment(); - }; -} - - -if (!goog.format) { - goog.format = { - insertWordBreaks: function(str, maxCharsBetweenWordBreaks) { - str = String(str); - - var resultArr = []; - var resultArrLen = 0; - - // These variables keep track of important state inside str. - var isInTag = false; // whether we're inside an HTML tag - var isMaybeInEntity = false; // whether we might be inside an HTML entity - var numCharsWithoutBreak = 0; // number of chars since last word break - var flushIndex = 0; // index of first char not yet flushed to resultArr - - for (var i = 0, n = str.length; i < n; ++i) { - var charCode = str.charCodeAt(i); - - // If hit maxCharsBetweenWordBreaks, and not space next, then add . - if (numCharsWithoutBreak >= maxCharsBetweenWordBreaks && - // space - charCode != 32) { - resultArr[resultArrLen++] = str.substring(flushIndex, i); - flushIndex = i; - resultArr[resultArrLen++] = goog.format.WORD_BREAK; - numCharsWithoutBreak = 0; - } - - if (isInTag) { - // If inside an HTML tag and we see '>', it's the end of the tag. - if (charCode == 62) { - isInTag = false; - } - - } else if (isMaybeInEntity) { - switch (charCode) { - // Inside an entity, a ';' is the end of the entity. - // The entity that just ended counts as one char, so increment - // numCharsWithoutBreak. - case 59: // ';' - isMaybeInEntity = false; - ++numCharsWithoutBreak; - break; - // If maybe inside an entity and we see '<', we weren't actually in - // an entity. But now we're inside and HTML tag. - case 60: // '<' - isMaybeInEntity = false; - isInTag = true; - break; - // If maybe inside an entity and we see ' ', we weren't actually in - // an entity. Just correct the state and reset the - // numCharsWithoutBreak since we just saw a space. - case 32: // ' ' - isMaybeInEntity = false; - numCharsWithoutBreak = 0; - break; - } - - } else { // !isInTag && !isInEntity - switch (charCode) { - // When not within a tag or an entity and we see '<', we're now - // inside an HTML tag. - case 60: // '<' - isInTag = true; - break; - // When not within a tag or an entity and we see '&', we might be - // inside an entity. - case 38: // '&' - isMaybeInEntity = true; - break; - // When we see a space, reset the numCharsWithoutBreak count. - case 32: // ' ' - numCharsWithoutBreak = 0; - break; - // When we see a non-space, increment the numCharsWithoutBreak. - default: - ++numCharsWithoutBreak; - break; - } - } - } - - // Flush the remaining chars at the end of the string. - resultArr[resultArrLen++] = str.substring(flushIndex); - - return resultArr.join(''); - }, - /** - * String inserted as a word break by insertWordBreaks(). Safari requires - * , Opera needs the 'shy' entity, though this will give a - * visible hyphen at breaks. Other browsers just use . - * @type {string} - * @private - */ - WORD_BREAK: goog.userAgent.WEBKIT - ? '' : goog.userAgent.OPERA ? '­' : '' - }; -} - - -if (!goog.i18n) { - goog.i18n = { - bidi: { - /** - * Check the directionality of a piece of text, return true if the piece - * of text should be laid out in RTL direction. - * @param {string} text The piece of text that need to be detected. - * @param {boolean=} opt_isHtml Whether {@code text} is HTML/HTML-escaped. - * Default: false. - * @return {boolean} - * @private - */ - detectRtlDirectionality: function(text, opt_isHtml) { - text = soyshim.$$bidiStripHtmlIfNecessary_(text, opt_isHtml); - return soyshim.$$bidiRtlWordRatio_(text) - > soyshim.$$bidiRtlDetectionThreshold_; - } - } - }; -} - -/** - * Directionality enum. - * @enum {number} - */ -goog.i18n.bidi.Dir = { - RTL: -1, - UNKNOWN: 0, - LTR: 1 -}; - - -/** - * Convert a directionality given in various formats to a goog.i18n.bidi.Dir - * constant. Useful for interaction with different standards of directionality - * representation. - * - * @param {goog.i18n.bidi.Dir|number|boolean} givenDir Directionality given in - * one of the following formats: - * 1. A goog.i18n.bidi.Dir constant. - * 2. A number (positive = LRT, negative = RTL, 0 = unknown). - * 3. A boolean (true = RTL, false = LTR). - * @return {goog.i18n.bidi.Dir} A goog.i18n.bidi.Dir constant matching the given - * directionality. - */ -goog.i18n.bidi.toDir = function(givenDir) { - if (typeof givenDir == 'number') { - return givenDir > 0 ? goog.i18n.bidi.Dir.LTR : - givenDir < 0 ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.UNKNOWN; - } else { - return givenDir ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR; - } -}; - - -/** - * Utility class for formatting text for display in a potentially - * opposite-directionality context without garbling. Provides the following - * functionality: - * - * @param {goog.i18n.bidi.Dir|number|boolean} dir The context - * directionality as a number - * (positive = LRT, negative = RTL, 0 = unknown). - * @constructor - */ -goog.i18n.BidiFormatter = function(dir) { - this.dir_ = goog.i18n.bidi.toDir(dir); -}; - - -/** - * Returns 'dir="ltr"' or 'dir="rtl"', depending on {@code text}'s estimated - * directionality, if it is not the same as the context directionality. - * Otherwise, returns the empty string. - * - * @param {string} text Text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether {@code text} is HTML / HTML-escaped. - * Default: false. - * @return {string} 'dir="rtl"' for RTL text in non-RTL context; 'dir="ltr"' for - * LTR text in non-LTR context; else, the empty string. - */ -goog.i18n.BidiFormatter.prototype.dirAttr = function (text, opt_isHtml) { - var dir = soy.$$bidiTextDir(text, opt_isHtml); - return dir && dir != this.dir_ ? dir < 0 ? 'dir="rtl"' : 'dir="ltr"' : ''; -}; - -/** - * Returns the trailing horizontal edge, i.e. "right" or "left", depending on - * the global bidi directionality. - * @return {string} "left" for RTL context and "right" otherwise. - */ -goog.i18n.BidiFormatter.prototype.endEdge = function () { - return this.dir_ < 0 ? 'left' : 'right'; -}; - -/** - * Returns the Unicode BiDi mark matching the context directionality (LRM for - * LTR context directionality, RLM for RTL context directionality), or the - * empty string for neutral / unknown context directionality. - * - * @return {string} LRM for LTR context directionality and RLM for RTL context - * directionality. - */ -goog.i18n.BidiFormatter.prototype.mark = function () { - return ( - (this.dir_ > 0) ? '\u200E' /*LRM*/ : - (this.dir_ < 0) ? '\u200F' /*RLM*/ : - ''); -}; - -/** - * Returns a Unicode BiDi mark matching the context directionality (LRM or RLM) - * if the directionality or the exit directionality of {@code text} are opposite - * to the context directionality. Otherwise returns the empty string. - * - * @param {string} text The input text. - * @param {boolean=} opt_isHtml Whether {@code text} is HTML / HTML-escaped. - * Default: false. - * @return {string} A Unicode bidi mark matching the global directionality or - * the empty string. - */ -goog.i18n.BidiFormatter.prototype.markAfter = function (text, opt_isHtml) { - var dir = soy.$$bidiTextDir(text, opt_isHtml); - return soyshim.$$bidiMarkAfterKnownDir_(this.dir_, dir, text, opt_isHtml); -}; - -/** - * Formats a string of unknown directionality for use in HTML output of the - * context directionality, so an opposite-directionality string is neither - * garbled nor garbles what follows it. - * - * @param {string} str The input text. - * @param {boolean=} placeholder This argument exists for consistency with the - * Closure Library. Specifying it has no effect. - * @return {string} Input text after applying the above processing. - */ -goog.i18n.BidiFormatter.prototype.spanWrap = function(str, placeholder) { - str = String(str); - var textDir = soy.$$bidiTextDir(str, true); - var reset = soyshim.$$bidiMarkAfterKnownDir_(this.dir_, textDir, str, true); - if (textDir > 0 && this.dir_ <= 0) { - str = '' + str + ''; - } else if (textDir < 0 && this.dir_ >= 0) { - str = '' + str + ''; - } - return str + reset; -}; - -/** - * Returns the leading horizontal edge, i.e. "left" or "right", depending on - * the global bidi directionality. - * @return {string} "right" for RTL context and "left" otherwise. - */ -goog.i18n.BidiFormatter.prototype.startEdge = function () { - return this.dir_ < 0 ? 'right' : 'left'; -}; - -/** - * Formats a string of unknown directionality for use in plain-text output of - * the context directionality, so an opposite-directionality string is neither - * garbled nor garbles what follows it. - * As opposed to {@link #spanWrap}, this makes use of unicode BiDi formatting - * characters. In HTML, its *only* valid use is inside of elements that do not - * allow mark-up, e.g. an 'option' tag. - * - * @param {string} str The input text. - * @param {boolean=} placeholder This argument exists for consistency with the - * Closure Library. Specifying it has no effect. - * @return {string} Input text after applying the above processing. - */ -goog.i18n.BidiFormatter.prototype.unicodeWrap = function(str, placeholder) { - str = String(str); - var textDir = soy.$$bidiTextDir(str, true); - var reset = soyshim.$$bidiMarkAfterKnownDir_(this.dir_, textDir, str, true); - if (textDir > 0 && this.dir_ <= 0) { - str = '\u202A' + str + '\u202C'; - } else if (textDir < 0 && this.dir_ >= 0) { - str = '\u202B' + str + '\u202C'; - } - return str + reset; -}; - - -if (!goog.string) { - goog.string = { - /** - * Converts \r\n, \r, and \n to
s - * @param {*} str The string in which to convert newlines. - * @param {boolean=} opt_xml Whether to use XML compatible tags. - * @return {string} A copy of {@code str} with converted newlines. - */ - newLineToBr: function(str, opt_xml) { - - str = String(str); - - // This quick test helps in the case when there are no chars to replace, - // in the worst case this makes barely a difference to the time taken. - if (!goog.string.NEWLINE_TO_BR_RE_.test(str)) { - return str; - } - - return str.replace(/(\r\n|\r|\n)/g, opt_xml ? '
' : '
'); - }, - urlEncode: encodeURIComponent, - /** - * Regular expression used within newlineToBr(). - * @type {RegExp} - * @private - */ - NEWLINE_TO_BR_RE_: /[\r\n]/ - }; -} - -/** - * Utility class to facilitate much faster string concatenation in IE, - * using Array.join() rather than the '+' operator. For other browsers - * we simply use the '+' operator. - * - * @param {Object|number|string|boolean=} opt_a1 Optional first initial item - * to append. - * @param {...Object|number|string|boolean} var_args Other initial items to - * append, e.g., new goog.string.StringBuffer('foo', 'bar'). - * @constructor - */ -goog.string.StringBuffer = function(opt_a1, var_args) { - /** - * Internal buffer for the string to be concatenated. - * @type {string|Array} - * @private - */ - this.buffer_ = goog.userAgent.jscript.HAS_JSCRIPT ? [] : ''; - - if (opt_a1 != null) { - this.append.apply(this, arguments); - } -}; - - -/** - * Length of internal buffer (faster than calling buffer_.length). - * Only used for IE. - * @type {number} - * @private - */ -goog.string.StringBuffer.prototype.bufferLength_ = 0; - -/** - * Appends one or more items to the string. - * - * Calling this with null, undefined, or empty arguments is an error. - * - * @param {Object|number|string|boolean} a1 Required first string. - * @param {Object|number|string|boolean=} opt_a2 Optional second string. - * @param {...Object|number|string|boolean} var_args Other items to append, - * e.g., sb.append('foo', 'bar', 'baz'). - * @return {goog.string.StringBuffer} This same StringBuilder object. - */ -goog.string.StringBuffer.prototype.append = function(a1, opt_a2, var_args) { - - if (goog.userAgent.jscript.HAS_JSCRIPT) { - if (opt_a2 == null) { // no second argument (note: undefined == null) - // Array assignment is 2x faster than Array push. Also, use a1 - // directly to avoid arguments instantiation, another 2x improvement. - this.buffer_[this.bufferLength_++] = a1; - } else { - var arr = /**@type {Array.}*/(this.buffer_); - arr.push.apply(arr, arguments); - this.bufferLength_ = this.buffer_.length; - } - - } else { - - // Use a1 directly to avoid arguments instantiation for single-arg case. - this.buffer_ += a1; - if (opt_a2 != null) { // no second argument (note: undefined == null) - for (var i = 1; i < arguments.length; i++) { - this.buffer_ += arguments[i]; - } - } - } - - return this; -}; - - -/** - * Clears the string. - */ -goog.string.StringBuffer.prototype.clear = function() { - - if (goog.userAgent.jscript.HAS_JSCRIPT) { - this.buffer_.length = 0; // reuse array to avoid creating new object - this.bufferLength_ = 0; - - } else { - this.buffer_ = ''; - } -}; - - -/** - * Returns the concatenated string. - * - * @return {string} The concatenated string. - */ -goog.string.StringBuffer.prototype.toString = function() { - - if (goog.userAgent.jscript.HAS_JSCRIPT) { - var str = this.buffer_.join(''); - // Given a string with the entire contents, simplify the StringBuilder by - // setting its contents to only be this string, rather than many fragments. - this.clear(); - if (str) { - this.append(str); - } - return str; - - } else { - return /** @type {string} */ (this.buffer_); - } -}; - - -if (!goog.soy) goog.soy = { - /** - * Helper function to render a Soy template and then set the - * output string as the innerHTML of an element. It is recommended - * to use this helper function instead of directly setting - * innerHTML in your hand-written code, so that it will be easier - * to audit the code for cross-site scripting vulnerabilities. - * - * @param {Function} template The Soy template defining element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - * @param {(goog.dom.DomHelper|Document)=} opt_dom The context in which DOM - * nodes will be created. - */ - renderAsElement: function( - template, opt_templateData, opt_injectedData, opt_dom) { - return /** @type {!Element} */ (soyshim.$$renderWithWrapper_( - template, opt_templateData, opt_dom, true /* asElement */, - opt_injectedData)); - }, - /** - * Helper function to render a Soy template into a single node or - * a document fragment. If the rendered HTML string represents a - * single node, then that node is returned (note that this is - * *not* a fragment, despite them name of the method). Otherwise a - * document fragment is returned containing the rendered nodes. - * - * @param {Function} template The Soy template defining element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - * @param {(goog.dom.DomHelper|Document)=} opt_dom The context in which DOM - * nodes will be created. - * @return {!Node} The resulting node or document fragment. - */ - renderAsFragment: function( - template, opt_templateData, opt_injectedData, opt_dom) { - return soyshim.$$renderWithWrapper_( - template, opt_templateData, opt_dom, false /* asElement */, - opt_injectedData); - }, - /** - * Helper function to render a Soy template and then set the output string as - * the innerHTML of an element. It is recommended to use this helper function - * instead of directly setting innerHTML in your hand-written code, so that it - * will be easier to audit the code for cross-site scripting vulnerabilities. - * - * NOTE: New code should consider using goog.soy.renderElement instead. - * - * @param {Element} element The element whose content we are rendering. - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - */ - renderElement: function( - element, template, opt_templateData, opt_injectedData) { - element.innerHTML = template(opt_templateData, null, opt_injectedData); - }, - data: {} -}; - - -/** - * A type of textual content. - * - * This is an enum of type Object so that these values are unforgeable. - * - * @enum {!Object} - */ -goog.soy.data.SanitizedContentKind = { - - /** - * A snippet of HTML that does not start or end inside a tag, comment, entity, - * or DOCTYPE; and that does not contain any executable code - * (JS, {@code }s, etc.) from a different trust domain. - */ - HTML: {}, - - /** - * Executable Javascript code or expression, safe for insertion in a - * script-tag or event handler context, known to be free of any - * attacker-controlled scripts. This can either be side-effect-free - * Javascript (such as JSON) or Javascript that entirely under Google's - * control. - */ - JS: goog.DEBUG ? {sanitizedContentJsStrChars: true} : {}, - - /** - * A sequence of code units that can appear between quotes (either kind) in a - * JS program without causing a parse error, and without causing any side - * effects. - *

- * The content should not contain unescaped quotes, newlines, or anything else - * that would cause parsing to fail or to cause a JS parser to finish the - * string its parsing inside the content. - *

- * The content must also not end inside an escape sequence ; no partial octal - * escape sequences or odd number of '{@code \}'s at the end. - */ - JS_STR_CHARS: {}, - - /** A properly encoded portion of a URI. */ - URI: {}, - - /** - * Repeated attribute names and values. For example, - * {@code dir="ltr" foo="bar" onclick="trustedFunction()" checked}. - */ - ATTRIBUTES: goog.DEBUG ? {sanitizedContentHtmlAttribute: true} : {}, - - // TODO: Consider separating rules, declarations, and values into - // separate types, but for simplicity, we'll treat explicitly blessed - // SanitizedContent as allowed in all of these contexts. - /** - * A CSS3 declaration, property, value or group of semicolon separated - * declarations. - */ - CSS: {}, - - /** - * Unsanitized plain-text content. - * - * This is effectively the "null" entry of this enum, and is sometimes used - * to explicitly mark content that should never be used unescaped. Since any - * string is safe to use as text, being of ContentKind.TEXT makes no - * guarantees about its safety in any other context such as HTML. - */ - TEXT: {} -}; - - - -/** - * A string-like object that carries a content-type. - * - * IMPORTANT! Do not create these directly, nor instantiate the subclasses. - * Instead, use a trusted, centrally reviewed library as endorsed by your team - * to generate these objects. Otherwise, you risk accidentally creating - * SanitizedContent that is attacker-controlled and gets evaluated unescaped in - * templates. - * - * @constructor - */ -goog.soy.data.SanitizedContent = function() { - throw Error('Do not instantiate directly'); -}; - - -/** - * The context in which this content is safe from XSS attacks. - * @type {goog.soy.data.SanitizedContentKind} - */ -goog.soy.data.SanitizedContent.prototype.contentKind; - - -/** - * The already-safe content. - * @type {string} - */ -goog.soy.data.SanitizedContent.prototype.content; - - -/** @override */ -goog.soy.data.SanitizedContent.prototype.toString = function() { - return this.content; -}; - - -var soy = { esc: {} }; -var soydata = {}; -soydata.VERY_UNSAFE = {}; -var soyshim = { $$DEFAULT_TEMPLATE_DATA_: {} }; -/** - * Helper function to render a Soy template into a single node or a document - * fragment. If the rendered HTML string represents a single node, then that - * node is returned. Otherwise a document fragment is created and returned - * (wrapped in a DIV element if #opt_singleNode is true). - * - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {(goog.dom.DomHelper|Document)=} opt_dom The context in which DOM - * nodes will be created. - * @param {boolean=} opt_asElement Whether to wrap the fragment in an - * element if the template does not render a single element. If true, - * result is always an Element. - * @param {Object=} opt_injectedData The injected data for the template. - * @return {!Node} The resulting node or document fragment. - * @private - */ -soyshim.$$renderWithWrapper_ = function( - template, opt_templateData, opt_dom, opt_asElement, opt_injectedData) { - - var dom = opt_dom || document; - var wrapper = dom.createElement('div'); - wrapper.innerHTML = template( - opt_templateData || soyshim.$$DEFAULT_TEMPLATE_DATA_, undefined, - opt_injectedData); - - // If the template renders as a single element, return it. - if (wrapper.childNodes.length == 1) { - var firstChild = wrapper.firstChild; - if (!opt_asElement || firstChild.nodeType == 1 /* Element */) { - return /** @type {!Node} */ (firstChild); - } - } - - // If we're forcing it to be a single element, return the wrapper DIV. - if (opt_asElement) { - return wrapper; - } - - // Otherwise, create and return a fragment. - var fragment = dom.createDocumentFragment(); - while (wrapper.firstChild) { - fragment.appendChild(wrapper.firstChild); - } - return fragment; -}; - - -/** - * Returns a Unicode BiDi mark matching bidiGlobalDir (LRM or RLM) if the - * directionality or the exit directionality of text are opposite to - * bidiGlobalDir. Otherwise returns the empty string. - * If opt_isHtml, makes sure to ignore the LTR nature of the mark-up and escapes - * in text, making the logic suitable for HTML and HTML-escaped text. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {number} dir text's directionality: 1 if ltr, -1 if rtl, 0 if unknown. - * @param {string} text The text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {string} A Unicode bidi mark matching bidiGlobalDir, or - * the empty string when text's overall and exit directionalities both match - * bidiGlobalDir, or bidiGlobalDir is 0 (unknown). - * @private - */ -soyshim.$$bidiMarkAfterKnownDir_ = function( - bidiGlobalDir, dir, text, opt_isHtml) { - return ( - bidiGlobalDir > 0 && (dir < 0 || - soyshim.$$bidiIsRtlExitText_(text, opt_isHtml)) ? '\u200E' : // LRM - bidiGlobalDir < 0 && (dir > 0 || - soyshim.$$bidiIsLtrExitText_(text, opt_isHtml)) ? '\u200F' : // RLM - ''); -}; - - -/** - * Strips str of any HTML mark-up and escapes. Imprecise in several ways, but - * precision is not very important, since the result is only meant to be used - * for directionality detection. - * @param {string} str The string to be stripped. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {string} The stripped string. - * @private - */ -soyshim.$$bidiStripHtmlIfNecessary_ = function(str, opt_isHtml) { - return opt_isHtml ? str.replace(soyshim.$$BIDI_HTML_SKIP_RE_, ' ') : str; -}; - - -/** - * Simplified regular expression for am HTML tag (opening or closing) or an HTML - * escape - the things we want to skip over in order to ignore their ltr - * characters. - * @type {RegExp} - * @private - */ -soyshim.$$BIDI_HTML_SKIP_RE_ = /<[^>]*>|&[^;]+;/g; - - -/** - * A practical pattern to identify strong LTR character. This pattern is not - * theoretically correct according to unicode standard. It is simplified for - * performance and small code size. - * @type {string} - * @private - */ -soyshim.$$bidiLtrChars_ = - 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF' + - '\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF'; - - -/** - * A practical pattern to identify strong neutral and weak character. This - * pattern is not theoretically correct according to unicode standard. It is - * simplified for performance and small code size. - * @type {string} - * @private - */ -soyshim.$$bidiNeutralChars_ = - '\u0000-\u0020!-@[-`{-\u00BF\u00D7\u00F7\u02B9-\u02FF\u2000-\u2BFF'; - - -/** - * A practical pattern to identify strong RTL character. This pattern is not - * theoretically correct according to unicode standard. It is simplified for - * performance and small code size. - * @type {string} - * @private - */ -soyshim.$$bidiRtlChars_ = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC'; - - -/** - * Regular expressions to check if a piece of text is of RTL directionality - * on first character with strong directionality. - * @type {RegExp} - * @private - */ -soyshim.$$bidiRtlDirCheckRe_ = new RegExp( - '^[^' + soyshim.$$bidiLtrChars_ + ']*[' + soyshim.$$bidiRtlChars_ + ']'); - - -/** - * Regular expressions to check if a piece of text is of neutral directionality. - * Url are considered as neutral. - * @type {RegExp} - * @private - */ -soyshim.$$bidiNeutralDirCheckRe_ = new RegExp( - '^[' + soyshim.$$bidiNeutralChars_ + ']*$|^http://'); - - -/** - * Check the directionality of the a piece of text based on the first character - * with strong directionality. - * @param {string} str string being checked. - * @return {boolean} return true if rtl directionality is being detected. - * @private - */ -soyshim.$$bidiIsRtlText_ = function(str) { - return soyshim.$$bidiRtlDirCheckRe_.test(str); -}; - - -/** - * Check the directionality of the a piece of text based on the first character - * with strong directionality. - * @param {string} str string being checked. - * @return {boolean} true if all characters have neutral directionality. - * @private - */ -soyshim.$$bidiIsNeutralText_ = function(str) { - return soyshim.$$bidiNeutralDirCheckRe_.test(str); -}; - - -/** - * This constant controls threshold of rtl directionality. - * @type {number} - * @private - */ -soyshim.$$bidiRtlDetectionThreshold_ = 0.40; - - -/** - * Returns the RTL ratio based on word count. - * @param {string} str the string that need to be checked. - * @return {number} the ratio of RTL words among all words with directionality. - * @private - */ -soyshim.$$bidiRtlWordRatio_ = function(str) { - var rtlCount = 0; - var totalCount = 0; - var tokens = str.split(' '); - for (var i = 0; i < tokens.length; i++) { - if (soyshim.$$bidiIsRtlText_(tokens[i])) { - rtlCount++; - totalCount++; - } else if (!soyshim.$$bidiIsNeutralText_(tokens[i])) { - totalCount++; - } - } - - return totalCount == 0 ? 0 : rtlCount / totalCount; -}; - - -/** - * Regular expressions to check if the last strongly-directional character in a - * piece of text is LTR. - * @type {RegExp} - * @private - */ -soyshim.$$bidiLtrExitDirCheckRe_ = new RegExp( - '[' + soyshim.$$bidiLtrChars_ + '][^' + soyshim.$$bidiRtlChars_ + ']*$'); - - -/** - * Regular expressions to check if the last strongly-directional character in a - * piece of text is RTL. - * @type {RegExp} - * @private - */ -soyshim.$$bidiRtlExitDirCheckRe_ = new RegExp( - '[' + soyshim.$$bidiRtlChars_ + '][^' + soyshim.$$bidiLtrChars_ + ']*$'); - - -/** - * Check if the exit directionality a piece of text is LTR, i.e. if the last - * strongly-directional character in the string is LTR. - * @param {string} str string being checked. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {boolean} Whether LTR exit directionality was detected. - * @private - */ -soyshim.$$bidiIsLtrExitText_ = function(str, opt_isHtml) { - str = soyshim.$$bidiStripHtmlIfNecessary_(str, opt_isHtml); - return soyshim.$$bidiLtrExitDirCheckRe_.test(str); -}; - - -/** - * Check if the exit directionality a piece of text is RTL, i.e. if the last - * strongly-directional character in the string is RTL. - * @param {string} str string being checked. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {boolean} Whether RTL exit directionality was detected. - * @private - */ -soyshim.$$bidiIsRtlExitText_ = function(str, opt_isHtml) { - str = soyshim.$$bidiStripHtmlIfNecessary_(str, opt_isHtml); - return soyshim.$$bidiRtlExitDirCheckRe_.test(str); -}; - - -// ============================================================================= -// COPIED FROM soyutils_usegoog.js - - -// ----------------------------------------------------------------------------- -// StringBuilder (compatible with the 'stringbuilder' code style). - - -/** - * Utility class to facilitate much faster string concatenation in IE, - * using Array.join() rather than the '+' operator. For other browsers - * we simply use the '+' operator. - * - * @param {Object} var_args Initial items to append, - * e.g., new soy.StringBuilder('foo', 'bar'). - * @constructor - */ -soy.StringBuilder = goog.string.StringBuffer; - - -// ----------------------------------------------------------------------------- -// soydata: Defines typed strings, e.g. an HTML string {@code "ac"} is -// semantically distinct from the plain text string {@code "ac"} and smart -// templates can take that distinction into account. - -/** - * A type of textual content. - * - * This is an enum of type Object so that these values are unforgeable. - * - * @enum {!Object} - */ -soydata.SanitizedContentKind = goog.soy.data.SanitizedContentKind; - - -/** - * Content of type {@link soydata.SanitizedContentKind.HTML}. - * - * The content is a string of HTML that can safely be embedded in a PCDATA - * context in your app. If you would be surprised to find that an HTML - * sanitizer produced {@code s} (e.g. it runs code or fetches bad URLs) and - * you wouldn't write a template that produces {@code s} on security or privacy - * grounds, then don't pass {@code s} here. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedHtml = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedHtml, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedHtml.prototype.contentKind = soydata.SanitizedContentKind.HTML; - - -/** - * Content of type {@link soydata.SanitizedContentKind.JS}. - * - * The content is Javascript source that when evaluated does not execute any - * attacker-controlled scripts. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedJs = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedJs, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedJs.prototype.contentKind = - soydata.SanitizedContentKind.JS; - - -/** - * Content of type {@link soydata.SanitizedContentKind.JS_STR_CHARS}. - * - * The content can be safely inserted as part of a single- or double-quoted - * string without terminating the string. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedJsStrChars = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedJsStrChars, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedJsStrChars.prototype.contentKind = - soydata.SanitizedContentKind.JS_STR_CHARS; - - -/** - * Content of type {@link soydata.SanitizedContentKind.URI}. - * - * The content is a URI chunk that the caller knows is safe to emit in a - * template. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedUri = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedUri, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedUri.prototype.contentKind = soydata.SanitizedContentKind.URI; - - -/** - * Content of type {@link soydata.SanitizedContentKind.ATTRIBUTES}. - * - * The content should be safely embeddable within an open tag, such as a - * key="value" pair. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedHtmlAttribute = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedHtmlAttribute, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedHtmlAttribute.prototype.contentKind = - soydata.SanitizedContentKind.ATTRIBUTES; - - -/** - * Content of type {@link soydata.SanitizedContentKind.CSS}. - * - * The content is non-attacker-exploitable CSS, such as {@code color:#c3d9ff}. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedCss = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedCss, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedCss.prototype.contentKind = - soydata.SanitizedContentKind.CSS; - - -/** - * Unsanitized plain text string. - * - * While all strings are effectively safe to use as a plain text, there are no - * guarantees about safety in any other context such as HTML. This is - * sometimes used to mark that should never be used unescaped. - * - * @param {*} content Plain text with no guarantees. - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.UnsanitizedText = function(content) { - /** @override */ - this.content = String(content); -}; -goog.inherits(soydata.UnsanitizedText, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.UnsanitizedText.prototype.contentKind = - soydata.SanitizedContentKind.TEXT; - - -/** - * Creates a factory for SanitizedContent types. - * - * This is a hack so that the soydata.VERY_UNSAFE.ordainSanitized* can - * instantiate Sanitized* classes, without making the Sanitized* constructors - * publicly usable. Requiring all construction to use the VERY_UNSAFE names - * helps callers and their reviewers easily tell that creating SanitizedContent - * is not always safe and calls for careful review. - * - * @param {function(new: T, string)} ctor A constructor. - * @return {!function(*): T} A factory that takes content and returns a - * new instance. - * @template T - * @private - */ -soydata.$$makeSanitizedContentFactory_ = function(ctor) { - /** @constructor */ - function InstantiableCtor() {} - InstantiableCtor.prototype = ctor.prototype; - return function(content) { - var result = new InstantiableCtor(); - result.content = String(content); - return result; - }; -}; - - -// ----------------------------------------------------------------------------- -// Sanitized content ordainers. Please use these with extreme caution (with the -// exception of markUnsanitizedText). A good recommendation is to limit usage -// of these to just a handful of files in your source tree where usages can be -// carefully audited. - - -/** - * Protects a string from being used in an noAutoescaped context. - * - * This is useful for content where there is significant risk of accidental - * unescaped usage in a Soy template. A great case is for user-controlled - * data that has historically been a source of vulernabilities. - * - * @param {*} content Text to protect. - * @return {!soydata.UnsanitizedText} A wrapper that is rejected by the - * Soy noAutoescape print directive. - */ -soydata.markUnsanitizedText = function(content) { - return new soydata.UnsanitizedText(content); -}; - - -/** - * Takes a leap of faith that the provided content is "safe" HTML. - * - * @param {*} content A string of HTML that can safely be embedded in - * a PCDATA context in your app. If you would be surprised to find that an - * HTML sanitizer produced {@code s} (e.g. it runs code or fetches bad URLs) - * and you wouldn't write a template that produces {@code s} on security or - * privacy grounds, then don't pass {@code s} here. - * @return {!soydata.SanitizedHtml} Sanitized content wrapper that - * indicates to Soy not to escape when printed as HTML. - */ -soydata.VERY_UNSAFE.ordainSanitizedHtml = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedHtml); - - -/** - * Takes a leap of faith that the provided content is "safe" (non-attacker- - * controlled, XSS-free) Javascript. - * - * @param {*} content Javascript source that when evaluated does not - * execute any attacker-controlled scripts. - * @return {!soydata.SanitizedJs} Sanitized content wrapper that indicates to - * Soy not to escape when printed as Javascript source. - */ -soydata.VERY_UNSAFE.ordainSanitizedJs = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedJs); - - -// TODO: This function is probably necessary, either externally or internally -// as an implementation detail. Generally, plain text will always work here, -// as there's no harm to unescaping the string and then re-escaping when -// finally printed. -/** - * Takes a leap of faith that the provided content can be safely embedded in - * a Javascript string without re-esacping. - * - * @param {*} content Content that can be safely inserted as part of a - * single- or double-quoted string without terminating the string. - * @return {!soydata.SanitizedJsStrChars} Sanitized content wrapper that - * indicates to Soy not to escape when printed in a JS string. - */ -soydata.VERY_UNSAFE.ordainSanitizedJsStrChars = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedJsStrChars); - - -/** - * Takes a leap of faith that the provided content is "safe" to use as a URI - * in a Soy template. - * - * This creates a Soy SanitizedContent object which indicates to Soy there is - * no need to escape it when printed as a URI (e.g. in an href or src - * attribute), such as if it's already been encoded or if it's a Javascript: - * URI. - * - * @param {*} content A chunk of URI that the caller knows is safe to - * emit in a template. - * @return {!soydata.SanitizedUri} Sanitized content wrapper that indicates to - * Soy not to escape or filter when printed in URI context. - */ -soydata.VERY_UNSAFE.ordainSanitizedUri = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedUri); - - -/** - * Takes a leap of faith that the provided content is "safe" to use as an - * HTML attribute. - * - * @param {*} content An attribute name and value, such as - * {@code dir="ltr"}. - * @return {!soydata.SanitizedHtmlAttribute} Sanitized content wrapper that - * indicates to Soy not to escape when printed as an HTML attribute. - */ -soydata.VERY_UNSAFE.ordainSanitizedHtmlAttribute = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedHtmlAttribute); - - -/** - * Takes a leap of faith that the provided content is "safe" to use as CSS - * in a style attribute or block. - * - * @param {*} content CSS, such as {@code color:#c3d9ff}. - * @return {!soydata.SanitizedCss} Sanitized CSS wrapper that indicates to - * Soy there is no need to escape or filter when printed in CSS context. - */ -soydata.VERY_UNSAFE.ordainSanitizedCss = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedCss); - - -// ----------------------------------------------------------------------------- -// Public utilities. - - -/** - * Helper function to render a Soy template and then set the output string as - * the innerHTML of an element. It is recommended to use this helper function - * instead of directly setting innerHTML in your hand-written code, so that it - * will be easier to audit the code for cross-site scripting vulnerabilities. - * - * NOTE: New code should consider using goog.soy.renderElement instead. - * - * @param {Element} element The element whose content we are rendering. - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - */ -soy.renderElement = goog.soy.renderElement; - - -/** - * Helper function to render a Soy template into a single node or a document - * fragment. If the rendered HTML string represents a single node, then that - * node is returned (note that this is *not* a fragment, despite them name of - * the method). Otherwise a document fragment is returned containing the - * rendered nodes. - * - * NOTE: New code should consider using goog.soy.renderAsFragment - * instead (note that the arguments are different). - * - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Document=} opt_document The document used to create DOM nodes. If not - * specified, global document object is used. - * @param {Object=} opt_injectedData The injected data for the template. - * @return {!Node} The resulting node or document fragment. - */ -soy.renderAsFragment = function( - template, opt_templateData, opt_document, opt_injectedData) { - return goog.soy.renderAsFragment( - template, opt_templateData, opt_injectedData, - new goog.dom.DomHelper(opt_document)); -}; - - -/** - * Helper function to render a Soy template into a single node. If the rendered - * HTML string represents a single node, then that node is returned. Otherwise, - * a DIV element is returned containing the rendered nodes. - * - * NOTE: New code should consider using goog.soy.renderAsElement - * instead (note that the arguments are different). - * - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Document=} opt_document The document used to create DOM nodes. If not - * specified, global document object is used. - * @param {Object=} opt_injectedData The injected data for the template. - * @return {!Element} Rendered template contents, wrapped in a parent DIV - * element if necessary. - */ -soy.renderAsElement = function( - template, opt_templateData, opt_document, opt_injectedData) { - return goog.soy.renderAsElement( - template, opt_templateData, opt_injectedData, - new goog.dom.DomHelper(opt_document)); -}; - - -// ----------------------------------------------------------------------------- -// Below are private utilities to be used by Soy-generated code only. - - -/** - * Builds an augmented map. The returned map will contain mappings from both - * the base map and the additional map. If the same key appears in both, then - * the value from the additional map will be visible, while the value from the - * base map will be hidden. The base map will be used, but not modified. - * - * @param {!Object} baseMap The original map to augment. - * @param {!Object} additionalMap A map containing the additional mappings. - * @return {!Object} An augmented map containing both the original and - * additional mappings. - */ -soy.$$augmentMap = function(baseMap, additionalMap) { - - // Create a new map whose '__proto__' field is set to baseMap. - /** @constructor */ - function TempCtor() {} - TempCtor.prototype = baseMap; - var augmentedMap = new TempCtor(); - - // Add the additional mappings to the new map. - for (var key in additionalMap) { - augmentedMap[key] = additionalMap[key]; - } - - return augmentedMap; -}; - - -/** - * Checks that the given map key is a string. - * @param {*} key Key to check. - * @return {string} The given key. - */ -soy.$$checkMapKey = function(key) { - if ((typeof key) != 'string') { - throw Error( - 'Map literal\'s key expression must evaluate to string' + - ' (encountered type "' + (typeof key) + '").'); - } - return key; -}; - - -/** - * Gets the keys in a map as an array. There are no guarantees on the order. - * @param {Object} map The map to get the keys of. - * @return {Array.} The array of keys in the given map. - */ -soy.$$getMapKeys = function(map) { - var mapKeys = []; - for (var key in map) { - mapKeys.push(key); - } - return mapKeys; -}; - - -/** - * Gets a consistent unique id for the given delegate template name. Two calls - * to this function will return the same id if and only if the input names are - * the same. - * - *

Important: This function must always be called with a string constant. - * - *

If Closure Compiler is not being used, then this is just this identity - * function. If Closure Compiler is being used, then each call to this function - * will be replaced with a short string constant, which will be consistent per - * input name. - * - * @param {string} delTemplateName The delegate template name for which to get a - * consistent unique id. - * @return {string} A unique id that is consistent per input name. - * - * @consistentIdGenerator - */ -soy.$$getDelTemplateId = function(delTemplateName) { - return delTemplateName; -}; - - -/** - * Map from registered delegate template key to the priority of the - * implementation. - * @type {Object} - * @private - */ -soy.$$DELEGATE_REGISTRY_PRIORITIES_ = {}; - -/** - * Map from registered delegate template key to the implementation function. - * @type {Object} - * @private - */ -soy.$$DELEGATE_REGISTRY_FUNCTIONS_ = {}; - - -/** - * Registers a delegate implementation. If the same delegate template key (id - * and variant) has been registered previously, then priority values are - * compared and only the higher priority implementation is stored (if - * priorities are equal, an error is thrown). - * - * @param {string} delTemplateId The delegate template id. - * @param {string} delTemplateVariant The delegate template variant (can be - * empty string). - * @param {number} delPriority The implementation's priority value. - * @param {Function} delFn The implementation function. - */ -soy.$$registerDelegateFn = function( - delTemplateId, delTemplateVariant, delPriority, delFn) { - - var mapKey = 'key_' + delTemplateId + ':' + delTemplateVariant; - var currPriority = soy.$$DELEGATE_REGISTRY_PRIORITIES_[mapKey]; - if (currPriority === undefined || delPriority > currPriority) { - // Registering new or higher-priority function: replace registry entry. - soy.$$DELEGATE_REGISTRY_PRIORITIES_[mapKey] = delPriority; - soy.$$DELEGATE_REGISTRY_FUNCTIONS_[mapKey] = delFn; - } else if (delPriority == currPriority) { - // Registering same-priority function: error. - throw Error( - 'Encountered two active delegates with the same priority ("' + - delTemplateId + ':' + delTemplateVariant + '").'); - } else { - // Registering lower-priority function: do nothing. - } -}; - - -/** - * Retrieves the (highest-priority) implementation that has been registered for - * a given delegate template key (id and variant). If no implementation has - * been registered for the key, then the fallback is the same id with empty - * variant. If the fallback is also not registered, and allowsEmptyDefault is - * true, then returns an implementation that is equivalent to an empty template - * (i.e. rendered output would be empty string). - * - * @param {string} delTemplateId The delegate template id. - * @param {string} delTemplateVariant The delegate template variant (can be - * empty string). - * @param {boolean} allowsEmptyDefault Whether to default to the empty template - * function if there's no active implementation. - * @return {Function} The retrieved implementation function. - */ -soy.$$getDelegateFn = function( - delTemplateId, delTemplateVariant, allowsEmptyDefault) { - - var delFn = soy.$$DELEGATE_REGISTRY_FUNCTIONS_[ - 'key_' + delTemplateId + ':' + delTemplateVariant]; - if (! delFn && delTemplateVariant != '') { - // Fallback to empty variant. - delFn = soy.$$DELEGATE_REGISTRY_FUNCTIONS_['key_' + delTemplateId + ':']; - } - - if (delFn) { - return delFn; - } else if (allowsEmptyDefault) { - return soy.$$EMPTY_TEMPLATE_FN_; - } else { - throw Error( - 'Found no active impl for delegate call to "' + delTemplateId + ':' + - delTemplateVariant + '" (and not allowemptydefault="true").'); - } -}; - - -/** - * Private helper soy.$$getDelegateFn(). This is the empty template function - * that is returned whenever there's no delegate implementation found. - * - * @param {Object.=} opt_data - * @param {soy.StringBuilder=} opt_sb - * @param {Object.=} opt_ijData - * @return {string} - * @private - */ -soy.$$EMPTY_TEMPLATE_FN_ = function(opt_data, opt_sb, opt_ijData) { - return ''; -}; - - -// ----------------------------------------------------------------------------- -// Escape/filter/normalize. - - -/** - * Escapes HTML special characters in a string. Escapes double quote '"' in - * addition to '&', '<', and '>' so that a string can be included in an HTML - * tag attribute value within double quotes. - * Will emit known safe HTML as-is. - * - * @param {*} value The string-like value to be escaped. May not be a string, - * but the value will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeHtml = function(value) { - // TODO: Perhaps we should just ignore the contentKind property and instead - // look only at the constructor. - if (value && value.contentKind && - value.contentKind === goog.soy.data.SanitizedContentKind.HTML) { - goog.asserts.assert( - value.constructor === soydata.SanitizedHtml); - return value.content; - } - return soy.esc.$$escapeHtmlHelper(value); -}; - - -/** - * Strips unsafe tags to convert a string of untrusted HTML into HTML that - * is safe to embed. - * - * @param {*} value The string-like value to be escaped. May not be a string, - * but the value will be coerced to a string. - * @return {string} A sanitized and normalized version of value. - */ -soy.$$cleanHtml = function(value) { - if (value && value.contentKind && - value.contentKind === goog.soy.data.SanitizedContentKind.HTML) { - goog.asserts.assert( - value.constructor === soydata.SanitizedHtml); - return value.content; - } - return soy.$$stripHtmlTags(value, soy.esc.$$SAFE_TAG_WHITELIST_); -}; - - -/** - * Escapes HTML special characters in a string so that it can be embedded in - * RCDATA. - *

- * Escapes HTML special characters so that the value will not prematurely end - * the body of a tag like {@code }. - *

- * Will normalize known safe HTML to make sure that sanitized HTML (which could - * contain an innocuous {@code } don't prematurely end an RCDATA - * element. - * - * @param {*} value The string-like value to be escaped. May not be a string, - * but the value will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeHtmlRcdata = function(value) { - if (value && value.contentKind && - value.contentKind === goog.soy.data.SanitizedContentKind.HTML) { - goog.asserts.assert( - value.constructor === soydata.SanitizedHtml); - return soy.esc.$$normalizeHtmlHelper(value.content); - } - return soy.esc.$$escapeHtmlHelper(value); -}; - - -/** - * Matches any/only HTML5 void elements' start tags. - * See http://www.w3.org/TR/html-markup/syntax.html#syntax-elements - * @type {RegExp} - * @private - */ -soy.$$HTML5_VOID_ELEMENTS_ = new RegExp( - '^<(?:area|base|br|col|command|embed|hr|img|input' + - '|keygen|link|meta|param|source|track|wbr)\\b'); - - -/** - * Removes HTML tags from a string of known safe HTML. - * If opt_tagWhitelist is not specified or is empty, then - * the result can be used as an attribute value. - * - * @param {*} value The HTML to be escaped. May not be a string, but the - * value will be coerced to a string. - * @param {Object.=} opt_tagWhitelist Has an own property whose - * name is a lower-case tag name and whose value is {@code 1} for - * each element that is allowed in the output. - * @return {string} A representation of value without disallowed tags, - * HTML comments, or other non-text content. - */ -soy.$$stripHtmlTags = function(value, opt_tagWhitelist) { - if (!opt_tagWhitelist) { - // If we have no white-list, then use a fast track which elides all tags. - return String(value).replace(soy.esc.$$HTML_TAG_REGEX_, '') - // This is just paranoia since callers should normalize the result - // anyway, but if they didn't, it would be necessary to ensure that - // after the first replace non-tag uses of < do not recombine into - // tags as in "<script>alert(1337)script>". - .replace(soy.esc.$$LT_REGEX_, '<'); - } - - // Escapes '[' so that we can use [123] below to mark places where tags - // have been removed. - var html = String(value).replace(/\[/g, '['); - - // Consider all uses of '<' and replace whitelisted tags with markers like - // [1] which are indices into a list of approved tag names. - // Replace all other uses of < and > with entities. - var tags = []; - html = html.replace( - soy.esc.$$HTML_TAG_REGEX_, - function(tok, tagName) { - if (tagName) { - tagName = tagName.toLowerCase(); - if (opt_tagWhitelist.hasOwnProperty(tagName) && - opt_tagWhitelist[tagName]) { - var start = tok.charAt(1) === '/' ? ''; - return '[' + index + ']'; - } - } - return ''; - }); - - // Escape HTML special characters. Now there are no '<' in html that could - // start a tag. - html = soy.esc.$$normalizeHtmlHelper(html); - - var finalCloseTags = soy.$$balanceTags_(tags); - - // Now html contains no tags or less-than characters that could become - // part of a tag via a replacement operation and tags only contains - // approved tags. - // Reinsert the white-listed tags. - html = html.replace( - /\[(\d+)\]/g, function(_, index) { return tags[index]; }); - - // Close any still open tags. - // This prevents unclosed formatting elements like

    and from - // breaking the layout of containing HTML. - return html + finalCloseTags; -}; - - -/** - * Throw out any close tags that don't correspond to start tags. - * If {@code
    } is used for formatting, embedded HTML shouldn't be able - * to use a mismatched {@code
    } to break page layout. - * - * @param {Array.} tags an array of tags that will be modified in place - * include tags, the empty string, or concatenations of empty tags. - * @return {string} zero or more closed tags that close all elements that are - * opened in tags but not closed. - * @private - */ -soy.$$balanceTags_ = function(tags) { - var open = []; - for (var i = 0, n = tags.length; i < n; ++i) { - var tag = tags[i]; - if (tag.charAt(1) === '/') { - var openTagIndex = open.length - 1; - // NOTE: This is essentially lastIndexOf, but it's not supported in IE. - while (openTagIndex >= 0 && open[openTagIndex] != tag) { - openTagIndex--; - } - if (openTagIndex < 0) { - tags[i] = ''; // Drop close tag. - } else { - tags[i] = open.slice(openTagIndex).reverse().join(''); - open.length = openTagIndex; - } - } else if (!soy.$$HTML5_VOID_ELEMENTS_.test(tag)) { - open.push('Hello World - return soy.esc.$$filterHtmlElementNameHelper(value); -}; - - -/** - * Escapes characters in the value to make it valid content for a JS string - * literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - * @deprecated - */ -soy.$$escapeJs = function(value) { - return soy.$$escapeJsString(value); -}; - - -/** - * Escapes characters in the value to make it valid content for a JS string - * literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeJsString = function(value) { - if (value && - value.contentKind === goog.soy.data.SanitizedContentKind.JS_STR_CHARS) { - // TODO: It might still be worthwhile to normalize it to remove - // unescaped quotes, null, etc: replace(/(?:^|[^\])['"]/g, '\\$ - goog.asserts.assert(value.constructor === - soydata.SanitizedJsStrChars); - return value.content; - } - return soy.esc.$$escapeJsStringHelper(value); -}; - - -/** - * Encodes a value as a JavaScript literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} A JavaScript code representation of the input. - */ -soy.$$escapeJsValue = function(value) { - // We surround values with spaces so that they can't be interpolated into - // identifiers by accident. - // We could use parentheses but those might be interpreted as a function call. - if (value == null) { // Intentionally matches undefined. - // Java returns null from maps where there is no corresponding key while - // JS returns undefined. - // We always output null for compatibility with Java which does not have a - // distinct undefined value. - return ' null '; - } - if (value.contentKind == goog.soy.data.SanitizedContentKind.JS) { - goog.asserts.assert(value.constructor === - soydata.SanitizedJs); - return value.content; - } - switch (typeof value) { - case 'boolean': case 'number': - return ' ' + value + ' '; - default: - return "'" + soy.esc.$$escapeJsStringHelper(String(value)) + "'"; - } -}; - - -/** - * Escapes characters in the string to make it valid content for a JS regular - * expression literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeJsRegex = function(value) { - return soy.esc.$$escapeJsRegexHelper(value); -}; - - -/** - * Matches all URI mark characters that conflict with HTML attribute delimiters - * or that cannot appear in a CSS uri. - * From G.2: CSS grammar - *
    - *     url        ([!#$%&*-~]|{nonascii}|{escape})*
    - * 
    - * - * @type {RegExp} - * @private - */ -soy.$$problematicUriMarks_ = /['()]/g; - -/** - * @param {string} ch A single character in {@link soy.$$problematicUriMarks_}. - * @return {string} - * @private - */ -soy.$$pctEncode_ = function(ch) { - return '%' + ch.charCodeAt(0).toString(16); -}; - -/** - * Escapes a string so that it can be safely included in a URI. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeUri = function(value) { - if (value && value.contentKind === goog.soy.data.SanitizedContentKind.URI) { - goog.asserts.assert(value.constructor === - soydata.SanitizedUri); - return soy.$$normalizeUri(value); - } - // Apostophes and parentheses are not matched by encodeURIComponent. - // They are technically special in URIs, but only appear in the obsolete mark - // production in Appendix D.2 of RFC 3986, so can be encoded without changing - // semantics. - var encoded = soy.esc.$$escapeUriHelper(value); - soy.$$problematicUriMarks_.lastIndex = 0; - if (soy.$$problematicUriMarks_.test(encoded)) { - return encoded.replace(soy.$$problematicUriMarks_, soy.$$pctEncode_); - } - return encoded; -}; - - -/** - * Removes rough edges from a URI by escaping any raw HTML/JS string delimiters. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$normalizeUri = function(value) { - return soy.esc.$$normalizeUriHelper(value); -}; - - -/** - * Vets a URI's protocol and removes rough edges from a URI by escaping - * any raw HTML/JS string delimiters. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$filterNormalizeUri = function(value) { - if (value && value.contentKind == goog.soy.data.SanitizedContentKind.URI) { - goog.asserts.assert(value.constructor === - soydata.SanitizedUri); - return soy.$$normalizeUri(value); - } - return soy.esc.$$filterNormalizeUriHelper(value); -}; - - -/** - * Escapes a string so it can safely be included inside a quoted CSS string. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeCssString = function(value) { - return soy.esc.$$escapeCssStringHelper(value); -}; - - -/** - * Encodes a value as a CSS identifier part, keyword, or quantity. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} A safe CSS identifier part, keyword, or quanitity. - */ -soy.$$filterCssValue = function(value) { - if (value && value.contentKind === goog.soy.data.SanitizedContentKind.CSS) { - goog.asserts.assert(value.constructor === - soydata.SanitizedCss); - return value.content; - } - // Uses == to intentionally match null and undefined for Java compatibility. - if (value == null) { - return ''; - } - return soy.esc.$$filterCssValueHelper(value); -}; - - -/** - * Sanity-checks noAutoescape input for explicitly tainted content. - * - * SanitizedContentKind.TEXT is used to explicitly mark input that was never - * meant to be used unescaped. - * - * @param {*} value The value to filter. - * @return {string} The value, that we dearly hope will not cause an attack. - */ -soy.$$filterNoAutoescape = function(value) { - if (value && value.contentKind === goog.soy.data.SanitizedContentKind.TEXT) { - // Fail in development mode. - goog.asserts.fail( - 'Tainted SanitizedContentKind.TEXT for |noAutoescape: `%s`', - [value.content]); - // Return innocuous data in production. - return 'zSoyz'; - } - return String(value); -}; - - -// ----------------------------------------------------------------------------- -// Basic directives/functions. - - -/** - * Converts \r\n, \r, and \n to
    s - * @param {*} str The string in which to convert newlines. - * @return {string} A copy of {@code str} with converted newlines. - */ -soy.$$changeNewlineToBr = function(str) { - return goog.string.newLineToBr(String(str), false); -}; - - -/** - * Inserts word breaks ('wbr' tags) into a HTML string at a given interval. The - * counter is reset if a space is encountered. Word breaks aren't inserted into - * HTML tags or entities. Entites count towards the character count; HTML tags - * do not. - * - * @param {*} str The HTML string to insert word breaks into. Can be other - * types, but the value will be coerced to a string. - * @param {number} maxCharsBetweenWordBreaks Maximum number of non-space - * characters to allow before adding a word break. - * @return {string} The string including word breaks. - */ -soy.$$insertWordBreaks = function(str, maxCharsBetweenWordBreaks) { - return goog.format.insertWordBreaks(String(str), maxCharsBetweenWordBreaks); -}; - - -/** - * Truncates a string to a given max length (if it's currently longer), - * optionally adding ellipsis at the end. - * - * @param {*} str The string to truncate. Can be other types, but the value will - * be coerced to a string. - * @param {number} maxLen The maximum length of the string after truncation - * (including ellipsis, if applicable). - * @param {boolean} doAddEllipsis Whether to add ellipsis if the string needs - * truncation. - * @return {string} The string after truncation. - */ -soy.$$truncate = function(str, maxLen, doAddEllipsis) { - - str = String(str); - if (str.length <= maxLen) { - return str; // no need to truncate - } - - // If doAddEllipsis, either reduce maxLen to compensate, or else if maxLen is - // too small, just turn off doAddEllipsis. - if (doAddEllipsis) { - if (maxLen > 3) { - maxLen -= 3; - } else { - doAddEllipsis = false; - } - } - - // Make sure truncating at maxLen doesn't cut up a unicode surrogate pair. - if (soy.$$isHighSurrogate_(str.charAt(maxLen - 1)) && - soy.$$isLowSurrogate_(str.charAt(maxLen))) { - maxLen -= 1; - } - - // Truncate. - str = str.substring(0, maxLen); - - // Add ellipsis. - if (doAddEllipsis) { - str += '...'; - } - - return str; -}; - -/** - * Private helper for $$truncate() to check whether a char is a high surrogate. - * @param {string} ch The char to check. - * @return {boolean} Whether the given char is a unicode high surrogate. - * @private - */ -soy.$$isHighSurrogate_ = function(ch) { - return 0xD800 <= ch && ch <= 0xDBFF; -}; - -/** - * Private helper for $$truncate() to check whether a char is a low surrogate. - * @param {string} ch The char to check. - * @return {boolean} Whether the given char is a unicode low surrogate. - * @private - */ -soy.$$isLowSurrogate_ = function(ch) { - return 0xDC00 <= ch && ch <= 0xDFFF; -}; - - -// ----------------------------------------------------------------------------- -// Bidi directives/functions. - - -/** - * Cache of bidi formatter by context directionality, so we don't keep on - * creating new objects. - * @type {!Object.} - * @private - */ -soy.$$bidiFormatterCache_ = {}; - - -/** - * Returns cached bidi formatter for bidiGlobalDir, or creates a new one. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @return {goog.i18n.BidiFormatter} A formatter for bidiGlobalDir. - * @private - */ -soy.$$getBidiFormatterInstance_ = function(bidiGlobalDir) { - return soy.$$bidiFormatterCache_[bidiGlobalDir] || - (soy.$$bidiFormatterCache_[bidiGlobalDir] = - new goog.i18n.BidiFormatter(bidiGlobalDir)); -}; - - -/** - * Estimate the overall directionality of text. If opt_isHtml, makes sure to - * ignore the LTR nature of the mark-up and escapes in text, making the logic - * suitable for HTML and HTML-escaped text. - * @param {string} text The text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {number} 1 if text is LTR, -1 if it is RTL, and 0 if it is neutral. - */ -soy.$$bidiTextDir = function(text, opt_isHtml) { - if (!text) { - return 0; - } - return goog.i18n.bidi.detectRtlDirectionality(text, opt_isHtml) ? -1 : 1; -}; - - -/** - * Returns 'dir="ltr"' or 'dir="rtl"', depending on text's estimated - * directionality, if it is not the same as bidiGlobalDir. - * Otherwise, returns the empty string. - * If opt_isHtml, makes sure to ignore the LTR nature of the mark-up and escapes - * in text, making the logic suitable for HTML and HTML-escaped text. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {string} text The text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {soydata.SanitizedHtmlAttribute} 'dir="rtl"' for RTL text in non-RTL - * context; 'dir="ltr"' for LTR text in non-LTR context; - * else, the empty string. - */ -soy.$$bidiDirAttr = function(bidiGlobalDir, text, opt_isHtml) { - return soydata.VERY_UNSAFE.ordainSanitizedHtmlAttribute( - soy.$$getBidiFormatterInstance_(bidiGlobalDir).dirAttr(text, opt_isHtml)); -}; - - -/** - * Returns a Unicode BiDi mark matching bidiGlobalDir (LRM or RLM) if the - * directionality or the exit directionality of text are opposite to - * bidiGlobalDir. Otherwise returns the empty string. - * If opt_isHtml, makes sure to ignore the LTR nature of the mark-up and escapes - * in text, making the logic suitable for HTML and HTML-escaped text. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {string} text The text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {string} A Unicode bidi mark matching bidiGlobalDir, or the empty - * string when text's overall and exit directionalities both match - * bidiGlobalDir, or bidiGlobalDir is 0 (unknown). - */ -soy.$$bidiMarkAfter = function(bidiGlobalDir, text, opt_isHtml) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - return formatter.markAfter(text, opt_isHtml); -}; - - -/** - * Returns str wrapped in a according to its directionality - * - but only if that is neither neutral nor the same as the global context. - * Otherwise, returns str unchanged. - * Always treats str as HTML/HTML-escaped, i.e. ignores mark-up and escapes when - * estimating str's directionality. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {*} str The string to be wrapped. Can be other types, but the value - * will be coerced to a string. - * @return {string} The wrapped string. - */ -soy.$$bidiSpanWrap = function(bidiGlobalDir, str) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - return formatter.spanWrap(str + '', true); -}; - - -/** - * Returns str wrapped in Unicode BiDi formatting characters according to its - * directionality, i.e. either LRE or RLE at the beginning and PDF at the end - - * but only if str's directionality is neither neutral nor the same as the - * global context. Otherwise, returns str unchanged. - * Always treats str as HTML/HTML-escaped, i.e. ignores mark-up and escapes when - * estimating str's directionality. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {*} str The string to be wrapped. Can be other types, but the value - * will be coerced to a string. - * @return {string} The wrapped string. - */ -soy.$$bidiUnicodeWrap = function(bidiGlobalDir, str) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - return formatter.unicodeWrap(str + '', true); -}; - - -// ----------------------------------------------------------------------------- -// Generated code. - - - - -// START GENERATED CODE FOR ESCAPERS. - -/** - * @type {function (*) : string} - */ -soy.esc.$$escapeUriHelper = function(v) { - return encodeURIComponent(String(v)); -}; - -/** - * Maps charcters to the escaped versions for the named escape directives. - * @type {Object.} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_ = { - '\x00': '\x26#0;', - '\x22': '\x26quot;', - '\x26': '\x26amp;', - '\x27': '\x26#39;', - '\x3c': '\x26lt;', - '\x3e': '\x26gt;', - '\x09': '\x26#9;', - '\x0a': '\x26#10;', - '\x0b': '\x26#11;', - '\x0c': '\x26#12;', - '\x0d': '\x26#13;', - ' ': '\x26#32;', - '-': '\x26#45;', - '\/': '\x26#47;', - '\x3d': '\x26#61;', - '`': '\x26#96;', - '\x85': '\x26#133;', - '\xa0': '\x26#160;', - '\u2028': '\x26#8232;', - '\u2029': '\x26#8233;' -}; - -/** - * A function that can be used with String.replace.. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_[ch]; -}; - -/** - * Maps charcters to the escaped versions for the named escape directives. - * @type {Object.} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_ = { - '\x00': '\\x00', - '\x08': '\\x08', - '\x09': '\\t', - '\x0a': '\\n', - '\x0b': '\\x0b', - '\x0c': '\\f', - '\x0d': '\\r', - '\x22': '\\x22', - '\x26': '\\x26', - '\x27': '\\x27', - '\/': '\\\/', - '\x3c': '\\x3c', - '\x3d': '\\x3d', - '\x3e': '\\x3e', - '\\': '\\\\', - '\x85': '\\x85', - '\u2028': '\\u2028', - '\u2029': '\\u2029', - '$': '\\x24', - '(': '\\x28', - ')': '\\x29', - '*': '\\x2a', - '+': '\\x2b', - ',': '\\x2c', - '-': '\\x2d', - '.': '\\x2e', - ':': '\\x3a', - '?': '\\x3f', - '[': '\\x5b', - ']': '\\x5d', - '^': '\\x5e', - '{': '\\x7b', - '|': '\\x7c', - '}': '\\x7d' -}; - -/** - * A function that can be used with String.replace.. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_[ch]; -}; - -/** - * Maps charcters to the escaped versions for the named escape directives. - * @type {Object.} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_CSS_STRING_ = { - '\x00': '\\0 ', - '\x08': '\\8 ', - '\x09': '\\9 ', - '\x0a': '\\a ', - '\x0b': '\\b ', - '\x0c': '\\c ', - '\x0d': '\\d ', - '\x22': '\\22 ', - '\x26': '\\26 ', - '\x27': '\\27 ', - '(': '\\28 ', - ')': '\\29 ', - '*': '\\2a ', - '\/': '\\2f ', - ':': '\\3a ', - ';': '\\3b ', - '\x3c': '\\3c ', - '\x3d': '\\3d ', - '\x3e': '\\3e ', - '@': '\\40 ', - '\\': '\\5c ', - '{': '\\7b ', - '}': '\\7d ', - '\x85': '\\85 ', - '\xa0': '\\a0 ', - '\u2028': '\\2028 ', - '\u2029': '\\2029 ' -}; - -/** - * A function that can be used with String.replace.. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_ESCAPE_CSS_STRING_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_CSS_STRING_[ch]; -}; - -/** - * Maps charcters to the escaped versions for the named escape directives. - * @type {Object.} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_ = { - '\x00': '%00', - '\x01': '%01', - '\x02': '%02', - '\x03': '%03', - '\x04': '%04', - '\x05': '%05', - '\x06': '%06', - '\x07': '%07', - '\x08': '%08', - '\x09': '%09', - '\x0a': '%0A', - '\x0b': '%0B', - '\x0c': '%0C', - '\x0d': '%0D', - '\x0e': '%0E', - '\x0f': '%0F', - '\x10': '%10', - '\x11': '%11', - '\x12': '%12', - '\x13': '%13', - '\x14': '%14', - '\x15': '%15', - '\x16': '%16', - '\x17': '%17', - '\x18': '%18', - '\x19': '%19', - '\x1a': '%1A', - '\x1b': '%1B', - '\x1c': '%1C', - '\x1d': '%1D', - '\x1e': '%1E', - '\x1f': '%1F', - ' ': '%20', - '\x22': '%22', - '\x27': '%27', - '(': '%28', - ')': '%29', - '\x3c': '%3C', - '\x3e': '%3E', - '\\': '%5C', - '{': '%7B', - '}': '%7D', - '\x7f': '%7F', - '\x85': '%C2%85', - '\xa0': '%C2%A0', - '\u2028': '%E2%80%A8', - '\u2029': '%E2%80%A9', - '\uff01': '%EF%BC%81', - '\uff03': '%EF%BC%83', - '\uff04': '%EF%BC%84', - '\uff06': '%EF%BC%86', - '\uff07': '%EF%BC%87', - '\uff08': '%EF%BC%88', - '\uff09': '%EF%BC%89', - '\uff0a': '%EF%BC%8A', - '\uff0b': '%EF%BC%8B', - '\uff0c': '%EF%BC%8C', - '\uff0f': '%EF%BC%8F', - '\uff1a': '%EF%BC%9A', - '\uff1b': '%EF%BC%9B', - '\uff1d': '%EF%BC%9D', - '\uff1f': '%EF%BC%9F', - '\uff20': '%EF%BC%A0', - '\uff3b': '%EF%BC%BB', - '\uff3d': '%EF%BC%BD' -}; - -/** - * A function that can be used with String.replace.. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_[ch]; -}; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_HTML_ = /[\x00\x22\x26\x27\x3c\x3e]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_ = /[\x00\x22\x27\x3c\x3e]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_HTML_NOSPACE_ = /[\x00\x09-\x0d \x22\x26\x27\x2d\/\x3c-\x3e`\x85\xa0\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_NOSPACE_ = /[\x00\x09-\x0d \x22\x27\x2d\/\x3c-\x3e`\x85\xa0\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_JS_STRING_ = /[\x00\x08-\x0d\x22\x26\x27\/\x3c-\x3e\\\x85\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_JS_REGEX_ = /[\x00\x08-\x0d\x22\x24\x26-\/\x3a\x3c-\x3f\x5b-\x5e\x7b-\x7d\x85\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_CSS_STRING_ = /[\x00\x08-\x0d\x22\x26-\x2a\/\x3a-\x3e@\\\x7b\x7d\x85\xa0\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_ = /[\x00- \x22\x27-\x29\x3c\x3e\\\x7b\x7d\x7f\x85\xa0\u2028\u2029\uff01\uff03\uff04\uff06-\uff0c\uff0f\uff1a\uff1b\uff1d\uff1f\uff20\uff3b\uff3d]/g; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_CSS_VALUE_ = /^(?!-*(?:expression|(?:moz-)?binding))(?:[.#]?-?(?:[_a-z0-9-]+)(?:-[_a-z0-9-]+)*-?|-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[a-z]{1,2}|%)?|!important|)$/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_NORMALIZE_URI_ = /^(?:(?:https?|mailto):|[^&:\/?#]*(?:[\/?#]|$))/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_HTML_ATTRIBUTES_ = /^(?!style|on|action|archive|background|cite|classid|codebase|data|dsync|href|longdesc|src|usemap)(?:[a-z0-9_$:-]*)$/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_HTML_ELEMENT_NAME_ = /^(?!script|style|title|textarea|xmp|no)[a-z0-9_$:-]*$/i; - -/** - * A helper for the Soy directive |escapeHtml - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeHtmlHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_HTML_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |normalizeHtml - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$normalizeHtmlHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |escapeHtmlNospace - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeHtmlNospaceHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_HTML_NOSPACE_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |normalizeHtmlNospace - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$normalizeHtmlNospaceHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_NOSPACE_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |escapeJsString - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeJsStringHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_JS_STRING_, - soy.esc.$$REPLACER_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_); -}; - -/** - * A helper for the Soy directive |escapeJsRegex - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeJsRegexHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_JS_REGEX_, - soy.esc.$$REPLACER_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_); -}; - -/** - * A helper for the Soy directive |escapeCssString - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeCssStringHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_CSS_STRING_, - soy.esc.$$REPLACER_FOR_ESCAPE_CSS_STRING_); -}; - -/** - * A helper for the Soy directive |filterCssValue - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterCssValueHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_CSS_VALUE_.test(str)) { - return 'zSoyz'; - } - return str; -}; - -/** - * A helper for the Soy directive |normalizeUri - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$normalizeUriHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_, - soy.esc.$$REPLACER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_); -}; - -/** - * A helper for the Soy directive |filterNormalizeUri - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterNormalizeUriHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_NORMALIZE_URI_.test(str)) { - return '#zSoyz'; - } - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_, - soy.esc.$$REPLACER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_); -}; - -/** - * A helper for the Soy directive |filterHtmlAttributes - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterHtmlAttributesHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_HTML_ATTRIBUTES_.test(str)) { - return 'zSoyz'; - } - return str; -}; - -/** - * A helper for the Soy directive |filterHtmlElementName - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterHtmlElementNameHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_HTML_ELEMENT_NAME_.test(str)) { - return 'zSoyz'; - } - return str; -}; - -/** - * Matches all tags, HTML comments, and DOCTYPEs in tag soup HTML. - * By removing these, and replacing any '<' or '>' characters with - * entities we guarantee that the result can be embedded into a - * an attribute without introducing a tag boundary. - * - * @type {RegExp} - * @private - */ -soy.esc.$$HTML_TAG_REGEX_ = /<(?:!|\/?([a-zA-Z][a-zA-Z0-9:\-]*))(?:[^>'"]|"[^"]*"|'[^']*')*>/g; - -/** - * Matches all occurrences of '<'. - * - * @type {RegExp} - * @private - */ -soy.esc.$$LT_REGEX_ = /} - * @private - */ -soy.esc.$$SAFE_TAG_WHITELIST_ = {'b': 1, 'br': 1, 'em': 1, 'i': 1, 's': 1, 'sub': 1, 'sup': 1, 'u': 1}; - -// END GENERATED CODE diff --git a/demos/plane/style.css b/demos/plane/style.css deleted file mode 100644 index 0db0c021f1..0000000000 --- a/demos/plane/style.css +++ /dev/null @@ -1,104 +0,0 @@ -body { - background-color: #fff; - font-family: sans-serif; - margin-top: 0; -} -h1 { - font-weight: normal; - font-size: 140%; -} -.farSide { - text-align: right; -} -html[dir="RTL"] .farSide { - text-align: left; -} -.tab { - padding: 6px 12px; - text-decoration: none; - color: #000; -} -#selected { - font-weight: bold; - background-color: #ddd; - border-radius: 20px; -} - -/* Pulse the language menu once to draw attention to it. */ -#languageBorder { - border-radius: 4px; - animation: pulse 2s ease-in-out forwards; - -webkit-animation: pulse 2s ease-in-out forwards; - animation-delay: 2s; - -webkit-animation-delay: 2s; -} -@keyframes pulse { - 0% { background-color: #fff } - 50% { background-color: #f00 } - 100% { background-color: #fff } -} -@-webkit-keyframes pulse { - 0% { background-color: #fff } - 50% { background-color: #f00 } - 100% { background-color: #fff } -} - -#blockly { - height: 300px; - width: 100%; - border-style: solid; - border-color: #ddd; - border-width: 0 1px 1px 0; -} - -/* SVG Plane. */ -#plane { - overflow: hidden; -} -#fuselage { - fill: #fff; - stroke: #000; -} -#wing, #tail { - fill: #ddd; - stroke: #444; -} -.crew { - fill: #f44; - stroke: #000; -} -.seat1st { - fill: #88f; - stroke: #000; -} -.seat2nd { - fill: #8b8; - stroke: #000; -} -#seatYes, #seatNo { - font-size: 40pt; -} -text { - font-family: sans-serif; - font-size: 20pt; - fill: #444; -} -html[dir="RTL"] #plane text { - text-anchor: end; -} - -/* Slider. */ -.sliderTrack { - stroke: #aaa; - stroke-width: 6px; - stroke-linecap: round; -} -.sliderKnob { - fill: #ddd; - stroke: #bbc; - stroke-width: 1px; - stroke-linejoin: round; -} -.sliderKnob:hover { - fill: #eee; -} diff --git a/demos/plane/template.soy b/demos/plane/template.soy deleted file mode 100644 index 5b19e99bec..0000000000 --- a/demos/plane/template.soy +++ /dev/null @@ -1,225 +0,0 @@ -{namespace planepage} - -/** - * This is a Closure Template. - * - * See the README.txt for details. - */ - -/** - * Translated messages for use in JavaScript. - */ -{template .messages} -
    - {msg meaning="Plane.rows" desc="page text - Total number of rows of seats on an airplane.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero."}Rows: %1{/msg} - {msg meaning="Plane.getRows" desc="block text - The number of rows on the airplane, to be used in a mathematical equation, such as: 'seats = 4 x '''rows (5)''''.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero."}rows (%1){/msg} - {msg meaning="Plane.rows1" desc="page text - The number of rows of first-class seats on the airplane. You can see the block at [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero."}1st class rows: %1{/msg} - {msg meaning="Plane.getRows1" desc="block text - The number of rows of first-class seats on the, to be used in a mathematical equation. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero."}1st class rows (%1){/msg} - {msg meaning="Plane.rows2" desc="page text - The number of rows of second-class seats on the airplane. %1 is an integer greater or equal to zero. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero."}2nd class rows: %1{/msg} - {msg meaning="Plane.getRows2" desc="block text - The number of rows of second-class (also called 'economy class') seats on the airplane, to be used in a mathematical expression.\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero."}2nd class rows (%1){/msg} - {msg meaning="Plane.seats" desc="page text - The total number of seats on the airplane.\n\nParameters:\n* %1 - number of seats on an airplane. It is always either the next message or an integer greater than or equal to zero."}Seats: %1{/msg} - {msg meaning="Plane.placeholder" desc="page text - A word or symbol indicating that this numeric value has not yet been determined."}?{/msg} - {msg meaning="Plane.setSeats" desc="block text - The first half of a mathematical equation determining the number of seats in an airplane, such as: ''''seats =''' 4 x rows'."}seats ={/msg} -
    -{/template} - -/** - * Web page structure. - */ -{template .start} - {call .messages /} - - - - - -
    -

    Blockly‏ >{sp} - Demos‏ >{sp} - - {msg meaning="Plane.plane" desc="title - Specifies that this is Blockly's '''Plane''' (airplane) tutorial. The word 'plane' was chosen over 'airplane' in English because it is shorter and less formal."} - Plane Seat Calculator - {/msg} - - {sp} {sp} - {for $i in range(1, $ij.maxLevel + 1)} - {sp} - {if $i == $ij.level} - {$i} - {else} - {if $i < $ij.level} - - {else} - {$i} - {/if} - {/if} - {/for} -

    -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {if $ij.level > 1} - - - {/if} - - -

    - {switch $ij.level} - {case 1} - {msg meaning="Plane.description1" desc="instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1 this level], there is only one type of seat on the plane."}An airplane has a number of rows of passenger seats. Each row contains four seats.{/msg} - {case 2} - {msg meaning="Plane.description2" desc="instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=2 this level], there are two types of seats on this plane."}An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats.{/msg} - {case 3} - {msg meaning="Plane.description3" desc="instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3 this level], there are three types of seats on this plane. Be sure to use the same terms for '1st class' and '2nd class' as you did for the earlier messages."}An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats.{/msg} - {/switch} -

    -

    - {msg meaning="Plane.instructions" desc="page text - This text appears below the airplane graphic and above the space for the user to create the formula. The number of rows an the graphic may be changed by the user with a slider. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1] for a picture."}Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above).{/msg} -

    - - - - - - - {call .toolbox /} -
    -{/template} - -/** - * Toolboxes for each level. - */ -{template .toolbox} - -{/template} diff --git a/demos/plane/xlf/extracted_msgs.xlf b/demos/plane/xlf/extracted_msgs.xlf deleted file mode 100644 index 6a4fd44ff4..0000000000 --- a/demos/plane/xlf/extracted_msgs.xlf +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - Rows: %1 - page text - Total number of rows of seats on an airplane.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero. - Plane.rows - - - seats = - block text - The first half of a mathematical equation determining the number of seats in an airplane, such as: ''''seats =''' 4 x rows'. - Plane.setSeats - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3 this level], there are three types of seats on this plane. Be sure to use the same terms for '1st class' and '2nd class' as you did for the earlier messages. - Plane.description3 - - - ? - page text - A word or symbol indicating that this numeric value has not yet been determined. - Plane.placeholder - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - page text - This text appears below the airplane graphic and above the space for the user to create the formula. The number of rows an the graphic may be changed by the user with a slider. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1] for a picture. - Plane.instructions - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=2 this level], there are two types of seats on this plane. - Plane.description2 - - - 1st class rows (%1) - block text - The number of rows of first-class seats on the, to be used in a mathematical equation. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.getRows1 - - - 2nd class rows: %1 - page text - The number of rows of second-class seats on the airplane. %1 is an integer greater or equal to zero. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.rows2 - - - Seats: %1 - page text - The total number of seats on the airplane.\n\nParameters:\n* %1 - number of seats on an airplane. It is always either the next message or an integer greater than or equal to zero. - Plane.seats - - - Plane Seat Calculator - title - Specifies that this is Blockly's '''Plane''' (airplane) tutorial. The word 'plane' was chosen over 'airplane' in English because it is shorter and less formal. - Plane.plane - - - rows (%1) - block text - The number of rows on the airplane, to be used in a mathematical equation, such as: 'seats = 4 x '''rows (5)''''.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero. - Plane.getRows - - - 1st class rows: %1 - page text - The number of rows of first-class seats on the airplane. You can see the block at [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.rows1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1 this level], there is only one type of seat on the plane. - Plane.description1 - - - 2nd class rows (%1) - block text - The number of rows of second-class (also called 'economy class') seats on the airplane, to be used in a mathematical expression.\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.getRows2 - - - - diff --git a/demos/plane/xlf/translated_msgs_ar.xlf b/demos/plane/xlf/translated_msgs_ar.xlf deleted file mode 100644 index c9b8e1689a..0000000000 --- a/demos/plane/xlf/translated_msgs_ar.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - الصفوف: %1 - - - seats = - المقاعد = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - طائرة بمقعدين في مقطورة الطيّار (للطيار ومساعده) وعدد من المقاعد في صفوف الدرجة الأولى والثانية. كل صف من صفوف الدرجة الأولى يحتوي على أربعة مقاعد. ويحتوي كل صف في الدرجة الثانية على خمسة مقاعد. - - - ? - ؟ - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - لبناء صيغة (أدناه) تقوم بحساب إجمالي عدد المقاعد في الطائرة عند تغيير الصفوف (أعلاه). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - طائرة بمقعدين في مقطورة الطيّار (للطيار ومساعده) وعدد من الصفوف يحتوي كل صف على أربعة مقاعد. - - - 1st class rows (%1) - صفوف الطبقة الأولى (%1) - - - 2nd class rows: %1 - صفوف الفئة الثانية: %1 - - - Seats: %1 - المقاعد: %1 - - - Plane Seat Calculator - آلة حاسبة لمقعد الطائرة - - - rows (%1) - الصفوف (%1) - - - 1st class rows: %1 - صفوف الطبقة الأولى: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - هنالك طائرة تحتوي على عدد من صفوف مقاعد الركاب. كل صف يحتوي على أربعة مقاعد. - - - 2nd class rows (%1) - صفوف الفئة الثانية: (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_be-tarask.xlf b/demos/plane/xlf/translated_msgs_be-tarask.xlf deleted file mode 100644 index 4580b5f1d6..0000000000 --- a/demos/plane/xlf/translated_msgs_be-tarask.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Радкоў: %1 - - - seats = - месцаў = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Самалёт мае два месцы ў кабіне экіпажа (пілот і другі пілот), і некалькі пасажырскіх шэрагаў месцаў 1-га кляса і 2-га кляса. Кожны шэраг 1-га кляса утрымлівае чатыры месцы. Кожны шэраг 2-га кляса ўтрымлівае пяць месцаў. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Пабудаваць формулу (ніжэй), якая падлічвае агульную колькасьць месцаў у самалёце пры зьмене радоў (гл. вышэй). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Самалёт мае два месцы ў кабіне экіпажа (пілот і другі пілот), і некалькі шэрагаў пасажырскіх сядзеньняў. Кожны шэраг утрымлівае чатыры месцы. - - - 1st class rows (%1) - радкі першага клясу (%1) - - - 2nd class rows: %1 - Радкі другога клясу: %1 - - - Seats: %1 - Месцаў: %1 - - - Plane Seat Calculator - Калькулятар месцаў у самалёце - - - rows (%1) - радкоў (%1) - - - 1st class rows: %1 - Радкі першага клясу: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Самалёт мае некалькі шэрагаў пасажырскіх сядзеньняў. Кожная шэраг утрымлівае чатыры месцы. - - - 2nd class rows (%1) - радкі другога клясу (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_br.xlf b/demos/plane/xlf/translated_msgs_br.xlf deleted file mode 100644 index 4a7fc0c26c..0000000000 --- a/demos/plane/xlf/translated_msgs_br.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Renkennadoù : %1 - - - seats = - azezennoù = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - En un nijerez ez eus div azezenn el logell leviañ(evit al loman hag an eil loman), hag un toullad renkennadoù azezennoù tremenidi kentañ hag eil klas. Peder azezenn zo e pep renkennad kentañ klas. Pemp azezenn zo e pemp renkennad eil klas. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Sevel ur formulenn (amañ dindan) evit jediñ an niver a azezennoù en holl en nijerez pa vez kemmet an niver a renkennadoù (amañ a-us). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - En un nijerez ez eus div azezenn el logell leviañ(evit al loman hag an eil loman), hag ur toullad renkennadoù azezennoù evit an dremenidi. Peder azezenn zo e pep renkennad. - - - 1st class rows (%1) - Renkennadoù kentañ klas (%1) - - - 2nd class rows: %1 - Renkennadoù eil klas : %1 - - - Seats: %1 - Azezennoù : %1 - - - Plane Seat Calculator - Jederez azezenn nijerez - - - rows (%1) - renkennadoù (%1) - - - 1st class rows: %1 - Renkennadoù kentañ klas : %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un nijerez he deus un toullad renkennadoù azezennoù evit ar veajourien. Peder azezenn a zo e pep renkennad. - - - 2nd class rows (%1) - Renkennadoù eil klas (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ca.xlf b/demos/plane/xlf/translated_msgs_ca.xlf deleted file mode 100644 index 17dfe65e09..0000000000 --- a/demos/plane/xlf/translated_msgs_ca.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Files: %1 - - - seats = - seients = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avió té dos seients en la cabina de vol (pel pilot i copilot) i un nombre de files per seients de passatgers de primera classe i de segona classe. Cada fila de primera classe conté quatre seients. Cada fila de segona classe conté cinc seients. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construïu una fórmula (a sota) que calculi el nombre total de seients de l'avió a mida que canviïn les files (a dalt). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avió té dos seients en la cabina de vol (pel pilot i pel copilot) i un nombre de files de seients de passatgers. Cada fila conté quatre seients. - - - 1st class rows (%1) - files de primera classe (%1) - - - 2nd class rows: %1 - files de segona classe: %1 - - - Seats: %1 - Seients: %1 - - - Plane Seat Calculator - Calculadora de seients d'avió - - - rows (%1) - files (%1) - - - 1st class rows: %1 - files de primera classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avió té un nombre de files de seients de passatgers. Cada fila conté quatre seients. - - - 2nd class rows (%1) - files de segona classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_da.xlf b/demos/plane/xlf/translated_msgs_da.xlf deleted file mode 100644 index 752fe24f5b..0000000000 --- a/demos/plane/xlf/translated_msgs_da.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rækker: %1 - - - seats = - sæder = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Et fly har to pladser i cockpittet (til pilot og med-pilot), og et antal rækker af 1. klasses og 2. klasses passagersæder. Hver 1. klasses række indeholder fire sæder. Hver 2. klasses række indeholder fem sæder. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Opbyg en formel (nedenfor), der beregner det samlede antal pladser på flyet, hvis antal rækker ændres (ovenfor). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Et fly har to pladser i cockpittet (til pilot og med-pilot), og et antal rækker af passagersæder. Hver række indeholder fire sæder. - - - 1st class rows (%1) - 1. klasse rækker (%1) - - - 2nd class rows: %1 - 2. klasse rækker: %1 - - - Seats: %1 - Sæder: %1 - - - Plane Seat Calculator - Flysædelommeregner - - - rows (%1) - rækker (%1) - - - 1st class rows: %1 - 1. klasse rækker: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Et fly har et antal rækker af passagersæder. Hver række indeholder fire sæder. - - - 2nd class rows (%1) - 2. klasse rækker (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_de.xlf b/demos/plane/xlf/translated_msgs_de.xlf deleted file mode 100644 index f06bc77253..0000000000 --- a/demos/plane/xlf/translated_msgs_de.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Reihen: %1 - - - seats = - Sitze = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Ein Flugzeug hat zwei Sitze im Pilotenstand (für den Piloten und Co-Piloten) und eine Anzahl an Reihen mit Passagiersitzen der 1. und 2. Klasse. Jede 1.-Klasse-Reihe enthält vier Sitze. Jede 2.-Klasse-Reihe enthält fünf Sitze. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Erstelle eine Formel (unten), die die gesamte Anzahl an Sitzen im Flugzeug berechnet, wenn die Reihen (oben) geändert werden. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Ein Flugzeug hat zwei Sitze im Pilotenstand (für den Piloten und Co-Piloten) und eine Anzahl an Reihen mit Passagiersitzen. Jede Reihe enthält vier Sitze. - - - 1st class rows (%1) - Reihen der 1. Klasse (%1) - - - 2nd class rows: %1 - Reihen der 2. Klasse: %1 - - - Seats: %1 - Sitze: %1 - - - Plane Seat Calculator - Flugzeugsitzrechner - - - rows (%1) - Reihen (%1) - - - 1st class rows: %1 - Reihen der 1. Klasse: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Ein Flugzeug hat eine Anzahl an Reihen mit Passagiersitzen. Jede Reihe enthält vier Sitze. - - - 2nd class rows (%1) - Reihen der 2. Klasse (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_el.xlf b/demos/plane/xlf/translated_msgs_el.xlf deleted file mode 100644 index 5acb291d2c..0000000000 --- a/demos/plane/xlf/translated_msgs_el.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Σειρές: %1 - - - seats = - καθίσματα = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Ένα αεροπλάνο έχει δύο καθίσματα στον θάλαμο διακυβέρνησης (για τον κυβερνήτη και τον συγκυβερνήτη), καθώς και έναν αριθμό σειρών καθισμάτων για την 1η και 2η θέση. Κάθε σειρά της 1ης θέσης έχει τέσσερα καθίσματα και κάθε σειρά της 2ης θέσης έχει πέντε καθίσματα. - - - ? - ; - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Φτιάξε έναν τύπο (κάτω) που θα υπολογίζει τον συνολικό αριθμό καθισμάτων του αεροπλάνου καθώς αλλάζουν οι σειρές (πάνω). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Ένα αεροπλάνο έχει δύο καθίσματα στον θάλαμο διακυβέρνησης (για τον κυβερνήτη και τον συγκυβερνήτη), καθώς και έναν αριθμό από σειρές καθισμάτων επιβατών. Κάθε σειρά έχει τέσσερα καθίσματα. - - - 1st class rows (%1) - Σειρές 1ης θέσης (%1) - - - 2nd class rows: %1 - Σειρές 2ης θέσης: %1 - - - Seats: %1 - Καθίσματα: %1 - - - Plane Seat Calculator - Υπολογισμός Θέσεων Σε Αεροπλάνο - - - rows (%1) - σειρές (%1) - - - 1st class rows: %1 - Σειρές 1ης θέσης: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Ένα αεροπλάνο έχει έναν συγκεκριμένο αριθμό σειρών καθισμάτων επιβατών. Κάθε σειρά έχει τέσσερα καθίσματα. - - - 2nd class rows (%1) - Σειρές 2ης θέσης (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_en.xlf b/demos/plane/xlf/translated_msgs_en.xlf deleted file mode 100644 index e471a00085..0000000000 --- a/demos/plane/xlf/translated_msgs_en.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rows: %1 - - - seats = - seats = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - - - 1st class rows (%1) - 1st class rows (%1) - - - 2nd class rows: %1 - 2nd class rows: %1 - - - Seats: %1 - Seats: %1 - - - Plane Seat Calculator - Plane Seat Calculator - - - rows (%1) - rows (%1) - - - 1st class rows: %1 - 1st class rows: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - An airplane has a number of rows of passenger seats. Each row contains four seats. - - - 2nd class rows (%1) - 2nd class rows (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_es.xlf b/demos/plane/xlf/translated_msgs_es.xlf deleted file mode 100644 index e2022b5f12..0000000000 --- a/demos/plane/xlf/translated_msgs_es.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Filas: %1 - - - seats = - asientos = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avión tiene dos asientos en la cabina de vuelo (para el piloto y co-piloto), y un número de filas de asientos para pasajeros de primera y segunda clase. Cada fila de la primera clase contiene cuatro asientos. Cada fila de la segunda clase contiene cinco asientos. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construir una fórmula (abajo) que calcule el número total de asientos en el avión cuando las filas sean cambiadas (arriba). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avión tiene dos asientos en la cabina de vuelo (para el piloto y co-piloto), y un número de filas de asientos de pasajeros. Cada fila contiene cuatro asientos. - - - 1st class rows (%1) - Filas de primera clase: (%1) - - - 2nd class rows: %1 - Filas de segunda clase: %1 - - - Seats: %1 - Asientos: %1 - - - Plane Seat Calculator - Calculadora de asientos de avión - - - rows (%1) - filas (%1) - - - 1st class rows: %1 - Filas de primera clase: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avión  tiene un número de filas de asientos de pasajeros. Cada fila contiene cuatro asientos. - - - 2nd class rows (%1) - Filas de segunda clase: (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_fa.xlf b/demos/plane/xlf/translated_msgs_fa.xlf deleted file mode 100644 index 264ec31044..0000000000 --- a/demos/plane/xlf/translated_msgs_fa.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - ردیف: %1 - - - seats = - صندلی‌ها = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - یک هواپیما دو صندلی در کابین خلبان دارد (برای خلبان و کمک خلبان) و تهداد از صندلی‌ها مسافرین درجه یک و درجه دو. هر ردیف درجه یک شامل چهار صندلی است. هر ردیف درجه دو شامل پنج صندلی است. - - - ? - ؟ - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - یک فرمول بسازید (پایین) که تعداد کل صندلی‌های هواپیما با تغییر ردیف را حساب کند (بالا). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - یک هواپیما دو صندلی در عرشهٔ پرواز دارد (برای خلبان و کمک خلبان) و تعدادی صندلی مسافرین. هر ردیف شامل چهار صندلی است. - - - 1st class rows (%1) - اولین کلاس ردیف‌ها (%1) - - - 2nd class rows: %1 - دومین کلاس ردیف: %1 - - - Seats: %1 - صندلی‌ها: %1 - - - Plane Seat Calculator - محاسبه‌گر صندلی‌های هواپیما - - - rows (%1) - ردیف‌ها (%1) - - - 1st class rows: %1 - اولین ردیف کلاس: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - یک هواپیما تعداد از صندلی‌های مسافرین را دارد. هر ردیف شمال چهار صندلی است. - - - 2nd class rows (%1) - دومین کلاس ردیف‌ها (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_fr.xlf b/demos/plane/xlf/translated_msgs_fr.xlf deleted file mode 100644 index 9485da29bd..0000000000 --- a/demos/plane/xlf/translated_msgs_fr.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rangées : %1 - - - seats = - sièges = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avion a deux sièges dans la cabine de pilotage (pour le pilote et le copilote), et un certain nombre de rangées de sièges passager de première et seconde classes. Chaque rangée de première classe contient quatre sièges. Chaque rangée de seconde classe contient cinq sièges. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construire une formule (ci-dessous) qui calcule le nombre total de sièges dans l’avion quand le nombre de rangées est modifié (ci-dessus). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avion a deux sièges dans le poste de pilotage (pour le pilote et le copilote), et un certain nombre de rangées de sièges passager. Chaque rangée contient quatre sièges. - - - 1st class rows (%1) - rangées de première classe (%1) - - - 2nd class rows: %1 - rangées de seconde classe : %1 - - - Seats: %1 - Sièges : %1 - - - Plane Seat Calculator - Calculateur de sièges d’avion - - - rows (%1) - rangées (%1) - - - 1st class rows: %1 - rangées de première classe : %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avion a un nombre de rangées de sièges passager. Chaque rangée contient quatre sièges. - - - 2nd class rows (%1) - rangées de seconde classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_he.xlf b/demos/plane/xlf/translated_msgs_he.xlf deleted file mode 100644 index 55ac148c5a..0000000000 --- a/demos/plane/xlf/translated_msgs_he.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - שורות: %1 - - - seats = - מושבים = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - במטוס יש שני מושבים עבור הצוות (בשביל הטייס וטייס המשנה), ומספר שורות מושבים במחלקת הנוסעים הראשונה ובמחלקת הנוסעים השנייה. כל שורה במחלקה הראשונה מכילה ארבעה מושבים. כל שורה במחלקה השנייה מכילה חמישה מושבים. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - בנה נוסחה (למטה) אשר תחשב את סך כל המושבים במטוס בהתאם לשינוי מספר השורות (למעלה). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - במטוס יש שני מושבים עבור הצוות (בשביל הטייס וטייס המשנה), ומספר שורות עם מושבי נוסעים. בכל שורה יש ארבעה מושבים. - - - 1st class rows (%1) - שורות במחלקה ראשונה (%1) - - - 2nd class rows: %1 - שורות במחלקה שנייה: %1 - - - Seats: %1 - מושבים: %1 - - - Plane Seat Calculator - מחשבון מושב במטוס - - - rows (%1) - שורות (%1) - - - 1st class rows: %1 - שורות במחלקה ראשונה: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - במטוס יש מספר שורות עם מושבי נוסעים. בכל שורה יש ארבעה מושבים. - - - 2nd class rows (%1) - שורות במחלקה שנייה: (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_hrx.xlf b/demos/plane/xlf/translated_msgs_hrx.xlf deleted file mode 100644 index 263d305074..0000000000 --- a/demos/plane/xlf/translated_msgs_hrx.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Reihe: %1 - - - seats = - Sitze = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - En Fluchzeich hot zwooi Sitze im Pilotstand (für den Pilot und Co-Pilot) und en Oonzohl an Reihe mit Passagiersitze der 1. und 2. Klasse. Jede 1.-Klasse-Reih enthält vier Sitze. Jede 2.-Klasse-Reih enthält fünf Sitze. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Erstell en Formel (unne), die die gesamte Oonzohl an Sitze im Fluchzeich berechnet, wenn die Reihe (uwe) geännert sin. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - En Fluchzeich hot zwooi Sitze im Pilotestand (für den Pilot und Co-Pilot) und en Oonzohl an Reihe mit Passagiersitze. Jede Reih enthält vier Sitze. - - - 1st class rows (%1) - Reihe von der 1. Klasse (%1) - - - 2nd class rows: %1 - Reihe von der 2. Klasse: %1 - - - Seats: %1 - Sitz: %1 - - - Plane Seat Calculator - Fluchzeichsitzrechner - - - rows (%1) - Reihe (%1) - - - 1st class rows: %1 - Reihe von der 1. Klasse: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - En Fluchzeich hot en Oonzohl an Reihe mit Passagiersitze. Jede Reih enthält vier Sitze. - - - 2nd class rows (%1) - Reihe von der 2. Klasse (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_hu.xlf b/demos/plane/xlf/translated_msgs_hu.xlf deleted file mode 100644 index c44d1aa9d4..0000000000 --- a/demos/plane/xlf/translated_msgs_hu.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Sorok száma: %1 - - - seats = - Ülések száma = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Egy repülőgépnek 2 ülése van a pilótafülkében (a pilótának és a másodpilótának), az utasok 1. és 2. osztályon utazhatnak. Az 1. osztályon négy szék van egy sorban. A 2. osztályon öt szék van egy sorban. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Készítsd el a képletet (lent) amivel kiszámolható, hogy hány ülés van összesen a repülőgépen annak függvényében, ahogy (fent) állítod a sorok számát. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Egy repülőgépnek 2 ülése van a pilótafülkében (a pilótának és a másodpilótának), az utasok több sorban ülnek az utastérben. Az utastér minden sorában négy szék van. - - - 1st class rows (%1) - 1. osztály sorai (%1) - - - 2nd class rows: %1 - 2. osztály: %1 sor - - - Seats: %1 - Ülések száma összesen: %1 - - - Plane Seat Calculator - Repülőgép alkalmazás - - - rows (%1) - Sorok száma (%1) - - - 1st class rows: %1 - 1. osztály: %1 sor - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Egy repülőgépen az utasok több sorban ülnek az utastérben. Az utastér minden sorában négy szék van. - - - 2nd class rows (%1) - 2. osztály sorai (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ia.xlf b/demos/plane/xlf/translated_msgs_ia.xlf deleted file mode 100644 index 83ae2c6d2f..0000000000 --- a/demos/plane/xlf/translated_msgs_ia.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Filas: %1 - - - seats = - sedes = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avion ha duo sedes in le cabina (pro le pilota e le copilota) e un numero de filas de sedes pro passageros del prime classe e del secunde classes. Cata fila del prime classe contine quatro sedes. Cata fila del secunde classe contine cinque sedes. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construe un formula (ci infra) que calcula le numero total de sedes in le avion quando le numero de filas es cambiate (ci supra). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avion ha duo sedes in le cabina (pro le pilota e le copilota) e un numero de filas de sedes pro passageros. Cata fila contine quatro sedes. - - - 1st class rows (%1) - filas de prime classe (%1) - - - 2nd class rows: %1 - Filas de secunde classe: %1 - - - Seats: %1 - Sedes: %1 - - - Plane Seat Calculator - Calculator de sedias de avion - - - rows (%1) - filas (%1) - - - 1st class rows: %1 - Filas de prime classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avion ha un numero de filas de sedes pro passageros. Cata fila contine quatro sedes. - - - 2nd class rows (%1) - filas de secunde classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_is.xlf b/demos/plane/xlf/translated_msgs_is.xlf deleted file mode 100644 index 3810f4b34c..0000000000 --- a/demos/plane/xlf/translated_msgs_is.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Raðir: %1 - - - seats = - sæti = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Flugvél er með tvö sæti í stjórnklefa (fyrir flugmanninn og aðstoðarflugmanninn) og einhvern fjölda sætaraða fyrir farþega á 1. og 2. farrými. Hver sætaröð á 1. farrými hefur fjögur sæti. Hver sætaröð á 2. farrými hefur fimm sæti. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Búðu til formúlu (hér fyrir neðan) sem reiknar heildarfjölda sæta í flugvélinni eftir því sem röðunum er breytt (hér fyrir ofan). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Flugvél er með tvö sæti í stjórnklefa (fyrir flugmanninn og aðstoðarflugmanninn) og einhvern fjölda sætaraða fyrir farþega. Hver sætaröð hefur fjögur sæti. - - - 1st class rows (%1) - raðir 1. farrými (%1) - - - 2nd class rows: %1 - Raðir 2. farrými: %1 - - - Seats: %1 - Sæti: %1 - - - Plane Seat Calculator - Flugsætareiknir - - - rows (%1) - raðir (%1) - - - 1st class rows: %1 - Raðir 1. farrými: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Flugvél er með einhvern fjölda sætaraða fyrir farþega. Í hverri röð eru fjögur sæti. - - - 2nd class rows (%1) - raðir 2. farrými (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_it.xlf b/demos/plane/xlf/translated_msgs_it.xlf deleted file mode 100644 index 27bad0dcff..0000000000 --- a/demos/plane/xlf/translated_msgs_it.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - File: %1 - - - seats = - sedili = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un aereo ha due posti nella cabina di pilotaggio (per il pilota e il co-pilota), e un numero di file in prima e seconda classe, con i posti a sedere dei passeggeri. Ogni fila della prima classe contiene quattro posti. Quelle invece della seconda classe, ne contengono cinque. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Costruisci una formula (sotto) che calcola il numero totale di posti a sedere su un aeroplano, così come cambiano le file di posti (sopra). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un aeroplano ha due posti a sedere nella cabina di pilotaggio (per il pilota e co-pilota), e un numero di file con i posti a sedere dei passeggeri. Ogni fila contiene quattro posti. - - - 1st class rows (%1) - file 1ª classe (%1) - - - 2nd class rows: %1 - File 2ª classe: %1 - - - Seats: %1 - Sedili: %1 - - - Plane Seat Calculator - Calcolo posti aereo - - - rows (%1) - file (%1) - - - 1st class rows: %1 - File 1ª classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un aeroplano ha un numero di file contenenti i posti a sedere dei passeggeri. Ogni fila, contiene quattro posti a sedere. - - - 2nd class rows (%1) - File 2ª classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ja.xlf b/demos/plane/xlf/translated_msgs_ja.xlf deleted file mode 100644 index b04624a271..0000000000 --- a/demos/plane/xlf/translated_msgs_ja.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 列の数: %1 - - - seats = - 座席の数 = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 飛行機には、操縦室の 2 つの座席 (操縦士と副操縦士) と、ファーストクラスとセカンドクラスの乗客の座席の列があります。それぞれの列に、ファーストクラスでは 4 つの座席、セカンドクラスでは 5 つの座席があります。 - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 飛行機の座席の数を計算する式を、上で列の数を変更しても正しくなるように、下に入力してください。 - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 飛行機には、操縦室の 2 つの座席 (操縦士と副操縦士) と、乗客の座席の列があります。それぞれの列に 4 つの座席があります。 - - - 1st class rows (%1) - ファーストクラスの列数 (%1) - - - 2nd class rows: %1 - セカンドクラスの列数: %1 - - - Seats: %1 - 座席の数: %1 - - - Plane Seat Calculator - 飛行機座席計算機 - - - rows (%1) - 列の数 (%1) - - - 1st class rows: %1 - ファーストクラスの列数: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 飛行機に乗客の座席の列があります。それぞれの列に 4 つの座席があります。 - - - 2nd class rows (%1) - セカンドクラスの列数 (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ko.xlf b/demos/plane/xlf/translated_msgs_ko.xlf deleted file mode 100644 index 07e23288e6..0000000000 --- a/demos/plane/xlf/translated_msgs_ko.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 행 수: %1 - - - seats = - 좌석수 = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 비행기는 비행 갑판(조종사와 부조종사용)에서 좌석 두 개가 있고, 1등석과 2등석 승객 좌석의 행 수가 있습니다. 각 1등석 행에는 시트 네 개가 포함되어 있습니다. 각 2등석 행에는 시트 다섯 개가 포함되어 있습니다. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 행이 바뀐(위) 비행기에 좌석의 총 수를 계산하는 공식(아래)을 구축하세요. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 비행기는 비행 갑판(조종사와 부조종사용)에서 좌석 두 개가 있고, 승객 좌석의 행 수가 있습니다. 각 행에는 시트 네 개가 포함되어 있습니다. - - - 1st class rows (%1) - 1등석 행 수 (%1) - - - 2nd class rows: %1 - 2등석 행 수: %1 - - - Seats: %1 - 좌석 수: %1 - - - Plane Seat Calculator - 비행기 좌석 계산기 - - - rows (%1) - 행 수 (%1) - - - 1st class rows: %1 - 1등석 행 수: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 비행기는 승객 좌석의 행 수가 있습니다. 각 행에는 시트 네 개가 포함되어 있습니다. - - - 2nd class rows (%1) - 2등석 행 수 (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ms.xlf b/demos/plane/xlf/translated_msgs_ms.xlf deleted file mode 100644 index 4c993a9785..0000000000 --- a/demos/plane/xlf/translated_msgs_ms.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Baris: %1 - - - seats = - tempat duduk = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Sebuah kapal terbnag mempunyai tempat duduk di kokpit (untuk juruterbang dan pembantunya) dan sebilangan baris tempat duduk penumpang kelas pertama dan kelas kedua. Setiap baris kelas pertama mengandungi empat tempat duduk. Setiap baris kelas pertama mengandungi lima tempat duduk. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Wujudkan formula (di bawah) yang mengira jumlah tempat duduk di dalam kapal terbang sedangkan baris-barisnya diubah (di atas). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Sebuah kapal terbnag mempunyai tempat duduk di kokpit (untuk juruterbang dan pembantunya) dan sebilangan baris tempat duduk penumpang. Setiap baris mengandungi empat tempat duduk. - - - 1st class rows (%1) - baris kelas pertama (%1) - - - 2nd class rows: %1 - Baris kelas ke-2: %1 - - - Seats: %1 - Tempat duduk: %1 - - - Plane Seat Calculator - Pengira Tempat Duduk Kapal Terbang - - - rows (%1) - baris (%1) - - - 1st class rows: %1 - Baris kelas pertama: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Sebuah kapal terbang mempunyai sebilangan baris tempat duduk penumpang. Setiap baris mengandungi empat tempat duduk. - - - 2nd class rows (%1) - baris kelas ke-2 (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_nb.xlf b/demos/plane/xlf/translated_msgs_nb.xlf deleted file mode 100644 index 99c9c6a997..0000000000 --- a/demos/plane/xlf/translated_msgs_nb.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rader: %1 - - - seats = - seter = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Et fly har to seter i cockpit (for piloten og andrepiloten), og et antall rader med passasjerseter på første og andre klasse. Hver av radene på første klasse har fire seter. Hver av radene på andre klasse har fem seter. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Bygg en formel (under) som beregner det totale antall seter på flyet etter hvert som radene endres (over). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Et fly har to seter i cockpit (for piloten og andrepiloten), og et antall rader med passasjerseter. Hver rad inneholder fire seter. - - - 1st class rows (%1) - Rader i første klasse (%1) - - - 2nd class rows: %1 - Rader i andre klasse: %1 - - - Seats: %1 - Seter: %1 - - - Plane Seat Calculator - Flysetekalkulator - - - rows (%1) - rader (%1) - - - 1st class rows: %1 - Rader i første klasse: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Et fly har et antall rader med passasjerseter. Hver rad inneholder fire seter. - - - 2nd class rows (%1) - Rader i andre klasse (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_nl.xlf b/demos/plane/xlf/translated_msgs_nl.xlf deleted file mode 100644 index 6f36fa026c..0000000000 --- a/demos/plane/xlf/translated_msgs_nl.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rijen: %1 - - - seats = - stoelen= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Een vliegtuig heeft twee stoelen in de cockpit (voor de piloot en de copiloot) en een aantal rijen voor 1e klasse en 2e klasse passagiers. Iedere rij in de 1e klasse heeft vier stoelen. Iedere rij in de 2e klasse heeft vijf stoelen. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Maak hieronder een formule die het totale aantal stoelen in het vliegtuig berekent als het aantal rijen hierboven wordt aangepast. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Een vliegtuig heeft twee stoelen in de cockpit (voor de piloot en de copiloot) en een aantal rijen met stoelen voor passagiers. Iedere rij bevat vier stoelen. - - - 1st class rows (%1) - Rijen 1e klas (%1) - - - 2nd class rows: %1 - Rijen 2e klas: %1 - - - Seats: %1 - Zitplaatsen: %1 - - - Plane Seat Calculator - Vliegtuigstoelencalculator - - - rows (%1) - rijen (%1) - - - 1st class rows: %1 - Rijen 1e klas: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Een vliegtuig heeft een aantal rijen met stoelen. Iedere rij heeft vier stoelen. - - - 2nd class rows (%1) - Rijen 2e klas (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_pl.xlf b/demos/plane/xlf/translated_msgs_pl.xlf deleted file mode 100644 index 4c8b044e2c..0000000000 --- a/demos/plane/xlf/translated_msgs_pl.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rzędów: %1 - - - seats = - siedzeń = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Samolot ma dwa miejsca w kabinie pilotów (dla pierwszego i drugiego pilota) oraz rzędy siedzeń dla pasażerów pierwszej i drugiej klasy. Każdy rząd pierwszej klasy składa się z czterech siedzeń. Każdy rząd drugiej klasy składa się z pięciu siedzeń. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Zbuduj wzór (poniżej), który pozwala obliczyć łączną liczbę siedzeń w samolocie w funkcji zmieniającej się liczby rzędów (powyżej). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Samolot ma dwa miejsca w kabinie pilotów (dla pierwszego i drugiego pilota) oraz rzędy siedzeń dla pasażerów. Każdy taki rząd składa się z czterech siedzeń. - - - 1st class rows (%1) - Rzędów w pierwszej klasie (%1) - - - 2nd class rows: %1 - Rzędów w drugiej klasie: %1 - - - Seats: %1 - Siedzeń: %1 - - - Plane Seat Calculator - Kalkulator miejsc w samolocie. - - - rows (%1) - rzędów (%1) - - - 1st class rows: %1 - Rzędów w pierwszej klasie: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Samolot ma kilka rzędów siedzeń pasażerów. Każdy rząd zawiera cztery miejsca. - - - 2nd class rows (%1) - Rzędów w drugiej klasie (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_pms.xlf b/demos/plane/xlf/translated_msgs_pms.xlf deleted file mode 100644 index 0fef912176..0000000000 --- a/demos/plane/xlf/translated_msgs_pms.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Linie: %1 - - - seats = - sedij = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - N'avion a l'ha doi sedij ant la cabin-a ëd pilotage (për ël pilòta e ël cò-pilòta) e un chèich nùmer ëd file ëd sedij pr'ij passagé ëd prima e sconda classa. Minca fila ëd prima classa a conten quatr sedij. Minca fila ëd seconda classa a conten sinch sedij. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Fabriché na fórmola (sì-sota) ch'a fa 'l cont dël nùmer total ëd sedij ant l'avion cand che ël nùmer dle file a cangia (sì-dzora). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - N'avion a l'ha doi sedij ant la cabin-a ëd pilotage (për ël pilòta e ël cò-pilòta), e un chèich nùmer ëd file ëd sedij pr'ij passagé. Minca fila a conten quatr sedij. - - - 1st class rows (%1) - linie ëd prima classa (%1) - - - 2nd class rows: %1 - linie ëd seconda classa: %1 - - - Seats: %1 - Sedij: %1 - - - Plane Seat Calculator - Calcolator ëd sedij d'avion - - - rows (%1) - linie (%1) - - - 1st class rows: %1 - linie ëd prima classa: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - N'avion a l'ha un nùmer ëd file ëd sedij da passëgé. Minca fila a l'ha quatr sedij. - - - 2nd class rows (%1) - linie ëd seconda classa (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_pt-br.xlf b/demos/plane/xlf/translated_msgs_pt-br.xlf deleted file mode 100644 index 7bdd9ccff9..0000000000 --- a/demos/plane/xlf/translated_msgs_pt-br.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Filas: %1 - - - seats = - assentos = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Um avião tem dois assentos na cabine de comando (para o piloto e o copiloto) e um número de filas de assentos na primeira e na segunda classe. Cada fila da primeira classe contém quatro assentos. Cada fila da segunda classe contém cinco assentos. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Elabore uma fórmula (abaixo) que calcule o número total de assentos no avião a medida que as filas são alteradas (acima). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Um avião tem dois assentos na cabine de comando (para o piloto e o copiloto) e um número de filas de assentos para os passageiros. Cada fila contém quatro assentos. - - - 1st class rows (%1) - filas na primeira classe (%1) - - - 2nd class rows: %1 - filas na segunda classe: %1 - - - Seats: %1 - Assentos: %1 - - - Plane Seat Calculator - Calculadora de Assentos em Avião - - - rows (%1) - filas (%1) - - - 1st class rows: %1 - filas na primeira classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Um avião tem um número de filas de assentos para os passageiros. Cada fila contém quatro assentos. - - - 2nd class rows (%1) - filas na segunda classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ro.xlf b/demos/plane/xlf/translated_msgs_ro.xlf deleted file mode 100644 index 614a3bda28..0000000000 --- a/demos/plane/xlf/translated_msgs_ro.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rânduri: %1 - - - seats = - scaune = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avion are două scaune în carlingă (pentru pilot și copilot) și un număr de rânduri cu scaune de clasa I și clasa a II-a pentru pasageri. Fiecare rând de clasa I conține patru scaune. Fiecare rând de clasa a II-a conține cinci scaune. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construiește o formulă (mai jos) care calculează numărul total de locuri dintr-un avion în timp ce rândurile se schimbă (mai sus). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avion are două scaune în carlingă (pentru pilot și copilot) și un număr de rânduri cu scaune pentru pasageri. Fiecare rând conține patru scaune. - - - 1st class rows (%1) - rânduri de clasa I (%1) - - - 2nd class rows: %1 - rânduri de clasa a II-a: %1 - - - Seats: %1 - Scaune: %1 - - - Plane Seat Calculator - Calculator pentru locurile dintr-un avion - - - rows (%1) - rânduri (%1) - - - 1st class rows: %1 - rânduri de clasa I: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avion are un număr de rânduri cu scaune pentru pasageri. Fiecare rând conține patru scaune. - - - 2nd class rows (%1) - rânduri de clasa a II-a (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ru.xlf b/demos/plane/xlf/translated_msgs_ru.xlf deleted file mode 100644 index d25b25458d..0000000000 --- a/demos/plane/xlf/translated_msgs_ru.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Рядов: %1 - - - seats = - места = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - В самолёте 2 места для пилота и его помощника, несколько рядов с пассажирскими местами первого класса, а также несколько рядов с пассажирскими местами второго класса. В каждом ряду первого класса 4 места. В каждом ряду второго класса 5 мест. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Постройте формулу в области ниже, которая поможет рассчитать общее количество мест в самолёте (как на рисунке выше). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - В самолёте 2 места для пилота и его помощника, а также несколько рядов с пассажирскими местами. В каждом ряду 4 места. - - - 1st class rows (%1) - ряды 1-го класса (%1) - - - 2nd class rows: %1 - Рядов 2-го класса: %1 - - - Seats: %1 - Мест: %1 - - - Plane Seat Calculator - Калькулятор посадочных мест в самолёте - - - rows (%1) - ряды (%1) - - - 1st class rows: %1 - Рядов 1-го класса: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - В самолёте несколько рядов с пассажирскими местами. В каждом ряду 4 места. - - - 2nd class rows (%1) - ряды 2-го класса (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_sc.xlf b/demos/plane/xlf/translated_msgs_sc.xlf deleted file mode 100644 index 6328123561..0000000000 --- a/demos/plane/xlf/translated_msgs_sc.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Fileras: %1 - - - seats = - cadironis = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Unu aparèchiu tenit duus cadironis in sa cabina de cumandu (po su pilota e su co-pilota), e unas cantu fileras de cadironis po passigeris de prima classi e de segunda classi. Dònnia filera de prima classi tenit cuatru cadironis. Dònnia filera de segunda classi tenit cincu cadironis. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Cuncorda una formula (innoi asuta) chi cumpudit su numeru totali de postus a setzi in s'aparechiu, a segunda de comenti mudant is fileras de postus (innoi in susu) - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Unu aparèchiu tenit duus cadironis in sa cabina de cumandu (po su pilota e su co-pilota), e unas cantu fileras de cadironis po passigeris. Dònnia filera tenit cuatru cadironis. - - - 1st class rows (%1) - fileras de primu classi (%1) - - - 2nd class rows: %1 - fileras de segunda classi: %1 - - - Seats: %1 - Cadironis: %1 - - - Plane Seat Calculator - Fai su contu de is cadironis de unu aparèchiu - - - rows (%1) - fileras (%1) - - - 1st class rows: %1 - fileras de primu classi: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Unu aparèchiu tenit unas cantu fileras de cadironis po passigeris. Dònnia filera tenit cuatru cadironis. - - - 2nd class rows (%1) - fileras de segunda classi (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_sv.xlf b/demos/plane/xlf/translated_msgs_sv.xlf deleted file mode 100644 index f3d836fba3..0000000000 --- a/demos/plane/xlf/translated_msgs_sv.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rader: %1 - - - seats = - säten = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Ett flygplan har två säten i cockpiten (ett för piloten och ett för andrepiloten) och ett antal rader med passagerarsäten i första och andra klass. Varje rad i första klass innehåller fyra säten. Varje rad i andra klass innehåller fem säten. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Bygg en formel (nedan) som beräknar det totala antalet säten på flygplanet när raderna ändras (ovan). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Ett flygplan har två säten i cockpiten (ett för piloten och ett för andrepiloten) och ett antal rader med passagerarsäten. Varje rad innehåller fyra säten. - - - 1st class rows (%1) - Rader i första klass (%1) - - - 2nd class rows: %1 - Rader i andra klass: %1 - - - Seats: %1 - Säten: %1 - - - Plane Seat Calculator - Plansäteskalkylator - - - rows (%1) - rader (%1) - - - 1st class rows: %1 - Rader i första klass: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Ett flygplan har ett antal rader med passagerarsäten. Varje rad innehåller fyra säten. - - - 2nd class rows (%1) - Rader i andra klass (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_th.xlf b/demos/plane/xlf/translated_msgs_th.xlf deleted file mode 100644 index 0967d4d199..0000000000 --- a/demos/plane/xlf/translated_msgs_th.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - %1 แถว - - - seats = - จำนวนที่นั่ง = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - ภายในเครื่องบินจะมีที่นั่งนักบินอยู่ 2 ที่ (สำหรับนักบิน และผู้ช่วยนักบิน) และจะมีแถวที่นั่งสำหรับผู้โดยสาร "ชั้นเฟิร์สคลาส" และ "ชั้นธุรกิจ" อยู่จำนวนหนึ่ง โดยในชั้นเฟิร์สคลาสจะมีแถวละ 4 ที่นั่ง ส่วนในชั้นธุรกิจจะมีแถวละ 5 ที่นั่ง - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - สร้างสูตรคำนวณ (ด้านล่าง) เพื่อคำนวณหาจำนวนที่นั่งทั้งหมดบนเครื่องบิน ตามจำนวนแถวที่เปลี่ยนไป (ด้านบน) - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - ภายในเครื่องบินจะมีที่นั่งนักบินอยู่ 2 ที่ (สำหรับนักบิน และผู้ช่วยนักบิน) และมีแถวที่นั่งผู้โดยสารอยู่จำนวนหนึ่ง ในแต่ละแถวจะมี 4 ที่นั่ง - - - 1st class rows (%1) - จำนวนแถวชั้นเฟิร์สคลาส (%1) - - - 2nd class rows: %1 - ชั้นธุรกิจ %1 แถว - - - Seats: %1 - คำนวณได้ทั้งหมด %1 ที่นั่ง - - - Plane Seat Calculator - ระบบคำนวณที่นั่งบนเครื่องบิน - - - rows (%1) - จำนวนแถว (%1) - - - 1st class rows: %1 - ชั้นเฟิร์สคลาส %1 แถว - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - ภายในเครื่องบินประกอบไปด้วยแถวของที่นั่งผู้โดยสาร ในแต่ละแถวจะมี 4 ที่นั่ง - - - 2nd class rows (%1) - จำนวนแถวชั้นธุรกิจ (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_tr.xlf b/demos/plane/xlf/translated_msgs_tr.xlf deleted file mode 100644 index 678541a32d..0000000000 --- a/demos/plane/xlf/translated_msgs_tr.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Sıralar: %1 - - - seats = - koltuklar = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Bir uçağın uçuş güvertesinde iki koltuğu (pilot ve yardımcı pilot için), ve belirli sayıda birinci sınıf ve ikinci sınıf yolcu koltuğu sırası vardır. Her birinci sınıf sıra dört koltuk içerir. Her ikinci sınıf sıra beş koltuk içerir. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Sıralar(üstte) değiştikçe uçaktaki toplam koltuk sayısını hesaplayan bir formül(altta) oluşturun. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Bir uçağın uçuş güvertesinde iki koltuğu (pilot ve yardımcı pilot için), ve belirli sayıda koltuk sırası vardır. Her sıra dört koltuk içerir. - - - 1st class rows (%1) - Birinci sınıf sıralar (%1) - - - 2nd class rows: %1 - İkinci sınıf sıralar: %1 - - - Seats: %1 - Koltuklar: %1 - - - Plane Seat Calculator - Uçak Koltuğu Hesaplayıcı - - - rows (%1) - sıralar (%1) - - - 1st class rows: %1 - Birinci sınıf sıralar: (%1) - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Bir uçağın belirli sayıda koltuk sırası vardır. Her sıra dört koltuk içerir. - - - 2nd class rows (%1) - İkinci sınıf sıralar (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_uk.xlf b/demos/plane/xlf/translated_msgs_uk.xlf deleted file mode 100644 index d5e7682a58..0000000000 --- a/demos/plane/xlf/translated_msgs_uk.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Рядки: %1 - - - seats = - місць= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Літак має два місця в кабіні екіпажу (пілот і другий пілот), і кілька рядів 1-го класу 2-го класу пасажирських місць. Кожний ряд 1-го класу містить чотири місця. Кожен ряд 2-го класу містить п'ять місць. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Побудувати формулу (нижче), яка обчислює кількість місць на літаку при зміні рядків (див. вище). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Літак має два місця в кабіні екіпажу (пілот і другий пілот), і кілька рядів пасажирських сидінь. Кожен рядок містить чотири місця. - - - 1st class rows (%1) - рядів 1-го класу (%1) - - - 2nd class rows: %1 - рядів 2-го класу: %1 - - - Seats: %1 - Місць: %1 - - - Plane Seat Calculator - Калькулятор місць у літаку - - - rows (%1) - рядки (%1) - - - 1st class rows: %1 - рядів 1-го класу: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Літак має кілька рядів пасажирських сидінь. Кожен ряд містить чотири місця. - - - 2nd class rows (%1) - рядів 2-го класу (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_vi.xlf b/demos/plane/xlf/translated_msgs_vi.xlf deleted file mode 100644 index 1f4ef6fcf0..0000000000 --- a/demos/plane/xlf/translated_msgs_vi.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Số hàng ghế: %1 - - - seats = - Tính số chỗ ngồi = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Một chiếc máy bay này có hai chỗ ngồi ở sàn (cho phi công trưởng và phi công phó), và một số hàng ghế hạng 1 và hạng 2. Mỗi hàng hạng 1 có bốn chỗ ngồi. Mỗi hàng hạng 2 có năm chỗ ngồi. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Dưới đây hãy tạo công thức tính số chỗ ngồi trên máy bay để nó thay đổi tùy theo số lượng hàng ghế (hình trên). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Một máy bay có hai ghế trong buồng lái (dành cho phi công trưởng và phi công phụ), và một loạt hàng ghế cho hành khách. Mỗi hàng có bốn ghế (bốn chỗ ngồi). - - - 1st class rows (%1) - số hàng hạng nhất (%1) - - - 2nd class rows: %1 - Hàng hạng hai: %1 - - - Seats: %1 - Số chỗ ngồi: %1 - - - Plane Seat Calculator - Máy bay ghế máy tính - - - rows (%1) - đếm số hàng ghế (%1) - - - 1st class rows: %1 - Hàng hạng nhất: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Máy bay có một số hàng ghế hành khách. Mỗi hàng có bốn chỗ ngồi. - - - 2nd class rows (%1) - số hàng hạng hai (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_zh-hans.xlf b/demos/plane/xlf/translated_msgs_zh-hans.xlf deleted file mode 100644 index 2cbb7e858f..0000000000 --- a/demos/plane/xlf/translated_msgs_zh-hans.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 行:%1 - - - seats = - 座位= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 一架飞机除了有两个座位供正副驾驶员,还有一定量行数的头等及经济乘客座位。头等每行共四座,经济每行共五座。 - - - ? - - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 于下方写出一条公式以计算飞机上的座位总数。 - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 一架飞机除了有两个座位供正副驾驶员,还有一定量行数的乘客座位。每行共四座。 - - - 1st class rows (%1) - 头等行(%1) - - - 2nd class rows: %1 - 经济等行:%1 - - - Seats: %1 - 座位:%1 - - - Plane Seat Calculator - 飞机座位计算器 - - - rows (%1) - 行 (%1) - - - 1st class rows: %1 - 头等行:%1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 一架飞机有一定量行数的乘客座位,每行共四座。 - - - 2nd class rows (%1) - 经济等行(%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_zh-hant.xlf b/demos/plane/xlf/translated_msgs_zh-hant.xlf deleted file mode 100644 index 2dadf6d4e7..0000000000 --- a/demos/plane/xlf/translated_msgs_zh-hant.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 排:%1 - - - seats = - 座位= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 一架飛機除了有兩個座位供正副機師,還有一定量行數的頭等及經濟乘客座位。頭等艙每排都包含四個席位,經濟艙每排都包含五個席位。。 - - - ? - - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 於下方寫出一條公式以計算飛機上的座位總數。 - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 一架飛機除了有兩個座位供正副機師,還有一定量行數的乘客座位。每排都包含四個席位。 - - - 1st class rows (%1) - 頭等艙(%1) - - - 2nd class rows: %1 - 經濟艙:%1 排 - - - Seats: %1 - 座位:%1 - - - Plane Seat Calculator - 飛機座位計算器 - - - rows (%1) - 排(%1) - - - 1st class rows: %1 - 頭等艙:%1 排 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 一架飛機有一定量行數的乘客座位,每排都包含四個席位。 - - - 2nd class rows (%1) - 經濟艙(%1) - - - - diff --git a/demos/prettify.css b/demos/prettify.css deleted file mode 100644 index d44b3a2282..0000000000 --- a/demos/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/demos/prettify.js b/demos/prettify.js deleted file mode 100644 index 7b990496dd..0000000000 --- a/demos/prettify.js +++ /dev/null @@ -1,30 +0,0 @@ -!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a= -b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;ah[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com", -/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+ -s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/, -q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d= -c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"], -O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/, -V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-", -/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/], -["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}), -["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q, -hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]); -p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="
    "+a+"
    ";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1}); -return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i - - - - Blockly Demo: Resizable Blockly (Part 1) - - - - - - - - - - -
    -

    Blockly > - Demos > Resizable Blockly (Part 1)

    - -

    The first step in creating a resizable Blockly workspace is to use - CSS or tables to create an area for it. - Next, inject Blockly over that area.

    - -

    → More info on injecting resizable Blockly...

    -
    - Blockly will be positioned here. -
    - - diff --git a/demos/resizable/overlay.html b/demos/resizable/overlay.html deleted file mode 100644 index 68487a08a3..0000000000 --- a/demos/resizable/overlay.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - Blockly Demo: Resizable Blockly (Part 2) - - - - - - - - - - - - - -
    -

    Blockly > - Demos > Resizable Blockly (Part 2)

    - -

    - Once an area is defined, Blockly can be - injected and positioned over the area. - A resize handler keeps it in position as the page changes. -

    - -

    → More info on injecting resizable Blockly...

    -
    -
    - -
    - - - - - - diff --git a/demos/rtl/icon.png b/demos/rtl/icon.png deleted file mode 100644 index e177e32a30..0000000000 Binary files a/demos/rtl/icon.png and /dev/null differ diff --git a/demos/rtl/index.html b/demos/rtl/index.html deleted file mode 100644 index a88026132a..0000000000 --- a/demos/rtl/index.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Blockly Demo: RTL - - - - - - - -

    Blockly > - Demos > Right-to-Left

    - -
    - - - - - - diff --git a/demos/storage/icon.png b/demos/storage/icon.png deleted file mode 100644 index b8c50b245a..0000000000 Binary files a/demos/storage/icon.png and /dev/null differ diff --git a/demos/storage/index.html b/demos/storage/index.html deleted file mode 100644 index f21a48b92f..0000000000 --- a/demos/storage/index.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - Blockly Demo: Cloud Storage - - - - - - - -

    Blockly > - Demos > Cloud Storage

    - -

    This is a simple demo of cloud storage using App Engine.

    - - - -

    → More info on Cloud Storage...

    - -

    - -

    - -
    - - - - - - - diff --git a/demos/toolbox/icon.png b/demos/toolbox/icon.png deleted file mode 100644 index 336f390289..0000000000 Binary files a/demos/toolbox/icon.png and /dev/null differ diff --git a/demos/toolbox/index.html b/demos/toolbox/index.html deleted file mode 100644 index ef737d0dbc..0000000000 --- a/demos/toolbox/index.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - Blockly Demo: Toolbox - - - - - - -

    Blockly > - Demos > Toolbox

    - -

    This is a demo of a complex category structure for the toolbox.

    - -

    → More info on the Toolbox...

    - -
    - - - - - - - diff --git a/generators/dart.js b/generators/dart.js deleted file mode 100644 index f4faec27b5..0000000000 --- a/generators/dart.js +++ /dev/null @@ -1,193 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Helper functions for generating Dart for blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart'); - -goog.require('Blockly.Generator'); - - -/** - * Dart code generator. - * @type {!Blockly.Generator} - */ -Blockly.Dart = new Blockly.Generator('Dart'); - -/** - * List of illegal variable names. - * This is not intended to be a security feature. Blockly is 100% client-side, - * so bypassing this list is trivial. This is intended to prevent users from - * accidentally clobbering a built-in object or function. - * @private - */ -Blockly.Dart.addReservedWords( - // https://www.dartlang.org/docs/spec/latest/dart-language-specification.pdf - // Section 16.1.1 - 'assert,break,case,catch,class,const,continue,default,do,else,enum,extends,false,final,finally,for,if,in,is,new,null,rethrow,return,super,switch,this,throw,true,try,var,void,while,with,' + - // https://api.dartlang.org/dart_core.html - 'print,identityHashCode,identical,BidirectionalIterator,Comparable,double,Function,int,Invocation,Iterable,Iterator,List,Map,Match,num,Pattern,RegExp,Set,StackTrace,String,StringSink,Type,bool,DateTime,Deprecated,Duration,Expando,Null,Object,RuneIterator,Runes,Stopwatch,StringBuffer,Symbol,Uri,Comparator,AbstractClassInstantiationError,ArgumentError,AssertionError,CastError,ConcurrentModificationError,CyclicInitializationError,Error,Exception,FallThroughError,FormatException,IntegerDivisionByZeroException,NoSuchMethodError,NullThrownError,OutOfMemoryError,RangeError,StackOverflowError,StateError,TypeError,UnimplementedError,UnsupportedError'); - -/** - * Order of operation ENUMs. - * https://www.dartlang.org/docs/dart-up-and-running/ch02.html#operator_table - */ -Blockly.Dart.ORDER_ATOMIC = 0; // 0 "" ... -Blockly.Dart.ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] . -Blockly.Dart.ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr -Blockly.Dart.ORDER_MULTIPLICATIVE = 3; // * / % ~/ -Blockly.Dart.ORDER_ADDITIVE = 4; // + - -Blockly.Dart.ORDER_SHIFT = 5; // << >> -Blockly.Dart.ORDER_BITWISE_AND = 6; // & -Blockly.Dart.ORDER_BITWISE_XOR = 7; // ^ -Blockly.Dart.ORDER_BITWISE_OR = 8; // | -Blockly.Dart.ORDER_RELATIONAL = 9; // >= > <= < as is is! -Blockly.Dart.ORDER_EQUALITY = 10; // == != -Blockly.Dart.ORDER_LOGICAL_AND = 11; // && -Blockly.Dart.ORDER_LOGICAL_OR = 12; // || -Blockly.Dart.ORDER_CONDITIONAL = 13; // expr ? expr : expr -Blockly.Dart.ORDER_CASCADE = 14; // .. -Blockly.Dart.ORDER_ASSIGNMENT = 15; // = *= /= ~/= %= += -= <<= >>= &= ^= |= -Blockly.Dart.ORDER_NONE = 99; // (...) - -/** - * Initialise the database of variable names. - * @param {!Blockly.Workspace} workspace Workspace to generate code from. - */ -Blockly.Dart.init = function(workspace) { - // Create a dictionary of definitions to be printed before the code. - Blockly.Dart.definitions_ = Object.create(null); - // Create a dictionary mapping desired function names in definitions_ - // to actual function names (to avoid collisions with user functions). - Blockly.Dart.functionNames_ = Object.create(null); - - if (!Blockly.Dart.variableDB_) { - Blockly.Dart.variableDB_ = - new Blockly.Names(Blockly.Dart.RESERVED_WORDS_); - } else { - Blockly.Dart.variableDB_.reset(); - } - - var defvars = []; - var variables = Blockly.Variables.allVariables(workspace); - for (var i = 0; i < variables.length; i++) { - defvars[i] = 'var ' + - Blockly.Dart.variableDB_.getName(variables[i], - Blockly.Variables.NAME_TYPE) + ';'; - } - Blockly.Dart.definitions_['variables'] = defvars.join('\n'); -}; - -/** - * Prepend the generated code with the variable definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.Dart.finish = function(code) { - // Indent every line. - if (code) { - code = Blockly.Dart.prefixLines(code, Blockly.Dart.INDENT); - } - code = 'main() {\n' + code + '}'; - - // Convert the definitions dictionary into a list. - var imports = []; - var definitions = []; - for (var name in Blockly.Dart.definitions_) { - var def = Blockly.Dart.definitions_[name]; - if (def.match(/^import\s/)) { - imports.push(def); - } else { - definitions.push(def); - } - } - // Clean up temporary data. - delete Blockly.Dart.definitions_; - delete Blockly.Dart.functionNames_; - Blockly.Dart.variableDB_.reset(); - var allDefs = imports.join('\n') + '\n\n' + definitions.join('\n\n'); - return allDefs.replace(/\n\n+/g, '\n\n').replace(/\n*$/, '\n\n\n') + code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. A trailing semicolon is needed to make this legal. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.Dart.scrubNakedValue = function(line) { - return line + ';\n'; -}; - -/** - * Encode a string as a properly escaped Dart string, complete with quotes. - * @param {string} string Text to encode. - * @return {string} Dart string. - * @private - */ -Blockly.Dart.quote_ = function(string) { - // TODO: This is a quick hack. Replace with goog.string.quote - string = string.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\\n') - .replace(/\$/g, '\\$') - .replace(/'/g, '\\\''); - return '\'' + string + '\''; -}; - -/** - * Common tasks for generating Dart from blocks. - * Handles comments for the specified block and any connected value blocks. - * Calls any statements following this block. - * @param {!Blockly.Block} block The current block. - * @param {string} code The Dart code created for this block. - * @return {string} Dart code with comments and subsequent blocks added. - * @private - */ -Blockly.Dart.scrub_ = function(block, code) { - var commentCode = ''; - // Only collect comments for blocks that aren't inline. - if (!block.outputConnection || !block.outputConnection.targetConnection) { - // Collect comment for this block. - var comment = block.getCommentText(); - if (comment) { - commentCode += Blockly.Dart.prefixLines(comment, '// ') + '\n'; - } - // Collect comments for all value arguments. - // Don't collect comments for nested statements. - for (var x = 0; x < block.inputList.length; x++) { - if (block.inputList[x].type == Blockly.INPUT_VALUE) { - var childBlock = block.inputList[x].connection.targetBlock(); - if (childBlock) { - var comment = Blockly.Dart.allNestedComments(childBlock); - if (comment) { - commentCode += Blockly.Dart.prefixLines(comment, '// '); - } - } - } - } - } - var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); - var nextCode = Blockly.Dart.blockToCode(nextBlock); - return commentCode + code + nextCode; -}; diff --git a/generators/dart/colour.js b/generators/dart/colour.js deleted file mode 100644 index d734155224..0000000000 --- a/generators/dart/colour.js +++ /dev/null @@ -1,128 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Generating Dart for colour blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.colour'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart.addReservedWords('Math'); - -Blockly.Dart['colour_picker'] = function(block) { - // Colour picker. - var code = '\'' + block.getFieldValue('COLOUR') + '\''; - return [code, Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['colour_random'] = function(block) { - // Generate a random colour. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'colour_random', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' String hex = \'0123456789abcdef\';', - ' var rnd = new Math.Random();', - ' return \'#${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'', - ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\'', - ' \'${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}\';', - '}']); - var code = functionName + '()'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['colour_rgb'] = function(block) { - // Compose a colour from RGB components expressed as percentages. - var red = Blockly.Dart.valueToCode(block, 'RED', - Blockly.Dart.ORDER_NONE) || 0; - var green = Blockly.Dart.valueToCode(block, 'GREEN', - Blockly.Dart.ORDER_NONE) || 0; - var blue = Blockly.Dart.valueToCode(block, 'BLUE', - Blockly.Dart.ORDER_NONE) || 0; - - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'colour_rgb', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(num r, num g, num b) {', - ' num rn = (Math.max(Math.min(r, 1), 0) * 255).round();', - ' String rs = rn.toInt().toRadixString(16);', - ' rs = \'0$rs\';', - ' rs = rs.substring(rs.length - 2);', - ' num gn = (Math.max(Math.min(g, 1), 0) * 255).round();', - ' String gs = gn.toInt().toRadixString(16);', - ' gs = \'0$gs\';', - ' gs = gs.substring(gs.length - 2);', - ' num bn = (Math.max(Math.min(b, 1), 0) * 255).round();', - ' String bs = bn.toInt().toRadixString(16);', - ' bs = \'0$bs\';', - ' bs = bs.substring(bs.length - 2);', - ' return \'#$rs$gs$bs\';', - '}']); - var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['colour_blend'] = function(block) { - // Blend two colours together. - var c1 = Blockly.Dart.valueToCode(block, 'COLOUR1', - Blockly.Dart.ORDER_NONE) || '\'#000000\''; - var c2 = Blockly.Dart.valueToCode(block, 'COLOUR2', - Blockly.Dart.ORDER_NONE) || '\'#000000\''; - var ratio = Blockly.Dart.valueToCode(block, 'RATIO', - Blockly.Dart.ORDER_NONE) || 0.5; - - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'colour_blend', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String c1, String c2, num ratio) {', - ' ratio = Math.max(Math.min(ratio, 1), 0);', - ' int r1 = int.parse(\'0x${c1.substring(1, 3)}\');', - ' int g1 = int.parse(\'0x${c1.substring(3, 5)}\');', - ' int b1 = int.parse(\'0x${c1.substring(5, 7)}\');', - ' int r2 = int.parse(\'0x${c2.substring(1, 3)}\');', - ' int g2 = int.parse(\'0x${c2.substring(3, 5)}\');', - ' int b2 = int.parse(\'0x${c2.substring(5, 7)}\');', - ' num rn = (r1 * (1 - ratio) + r2 * ratio).round();', - ' String rs = rn.toInt().toRadixString(16);', - ' num gn = (g1 * (1 - ratio) + g2 * ratio).round();', - ' String gs = gn.toInt().toRadixString(16);', - ' num bn = (b1 * (1 - ratio) + b2 * ratio).round();', - ' String bs = bn.toInt().toRadixString(16);', - ' rs = \'0$rs\';', - ' rs = rs.substring(rs.length - 2);', - ' gs = \'0$gs\';', - ' gs = gs.substring(gs.length - 2);', - ' bs = \'0$bs\';', - ' bs = bs.substring(bs.length - 2);', - ' return \'#$rs$gs$bs\';', - '}']); - var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; diff --git a/generators/dart/lists.js b/generators/dart/lists.js deleted file mode 100644 index 57ac4dda14..0000000000 --- a/generators/dart/lists.js +++ /dev/null @@ -1,335 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Generating Dart for list blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.lists'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart.addReservedWords('Math'); - -Blockly.Dart['lists_create_empty'] = function(block) { - // Create an empty list. - return ['[]', Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['lists_create_with'] = function(block) { - // Create a list with any number of elements of any type. - var code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Dart.valueToCode(block, 'ADD' + n, - Blockly.Dart.ORDER_NONE) || 'null'; - } - code = '[' + code.join(', ') + ']'; - return [code, Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['lists_repeat'] = function(block) { - // Create a list with one element repeated. - var argument0 = Blockly.Dart.valueToCode(block, 'ITEM', - Blockly.Dart.ORDER_NONE) || 'null'; - var argument1 = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_NONE) || '0'; - var code = 'new List.filled(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_length'] = function(block) { - // String or array length. - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - return [argument0 + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - return [argument0 + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_indexOf'] = function(block) { - // Find an item in the list. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.Dart.valueToCode(block, 'FIND', - Blockly.Dart.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_getIndex'] = function(block) { - // Get element at index. - // Note: Until January 2013 this block did not have MODE or WHERE inputs. - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Dart.valueToCode(block, 'AT', - Blockly.Dart.ORDER_UNARY_PREFIX) || '1'; - var list = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - - if (where == 'FIRST') { - if (mode == 'GET') { - var code = list + '.first'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.removeAt(0)'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return list + '.removeAt(0);\n'; - } - } else if (where == 'LAST') { - if (mode == 'GET') { - var code = list + '.last'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.removeLast()'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return list + '.removeLast();\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'GET') { - var code = list + '[' + at + ']'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.removeAt(' + at + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return list + '.removeAt(' + at + ');\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'GET') { - var functionName = Blockly.Dart.provideFunction_( - 'lists_get_from_end', - [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList, num x) {', - ' x = myList.length - x;', - ' return myList.removeAt(x);', - '}']); - code = functionName + '(' + list + ', ' + at + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { - var functionName = Blockly.Dart.provideFunction_( - 'lists_remove_from_end', - [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList, num x) {', - ' x = myList.length - x;', - ' return myList.removeAt(x);', - '}']); - code = functionName + '(' + list + ', ' + at + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - } else if (where == 'RANDOM') { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'lists_get_random_item', - [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList, bool remove) {', - ' int x = new Math.Random().nextInt(myList.length);', - ' if (remove) {', - ' return myList.removeAt(x);', - ' } else {', - ' return myList[x];', - ' }', - '}']); - code = functionName + '(' + list + ', ' + (mode != 'GET') + ')'; - if (mode == 'GET' || mode == 'GET_REMOVE') { - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - throw 'Unhandled combination (lists_getIndex).'; -}; - -Blockly.Dart['lists_setIndex'] = function(block) { - // Set element at index. - // Note: Until February 2013 this block did not have MODE or WHERE inputs. - var list = Blockly.Dart.valueToCode(block, 'LIST', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Dart.valueToCode(block, 'AT', - Blockly.Dart.ORDER_ADDITIVE) || '1'; - var value = Blockly.Dart.valueToCode(block, 'TO', - Blockly.Dart.ORDER_ASSIGNMENT) || 'null'; - // Cache non-trivial values to variables to prevent repeated look-ups. - // Closure, which accesses and modifies 'list'. - function cacheList() { - if (list.match(/^\w+$/)) { - return ''; - } - var listVar = Blockly.Dart.variableDB_.getDistinctName( - 'tmp_list', Blockly.Variables.NAME_TYPE); - var code = 'List ' + listVar + ' = ' + list + ';\n'; - list = listVar; - return code; - } - if (where == 'FIRST') { - if (mode == 'SET') { - return list + '[0] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return list + '.insert(0, ' + value + ');\n'; - } - } else if (where == 'LAST') { - if (mode == 'SET') { - var code = cacheList(); - code += list + '[' + list + '.length - 1] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - return list + '.add(' + value + ');\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'SET') { - return list + '[' + at + '] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return list + '.insert(' + at + ', ' + value + ');\n'; - } - } else if (where == 'FROM_END') { - var code = cacheList(); - if (mode == 'SET') { - code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.insert(' + list + '.length - ' + at + ', ' + - value + ');\n'; - return code; - } - } else if (where == 'RANDOM') { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var code = cacheList(); - var xVar = Blockly.Dart.variableDB_.getDistinctName( - 'tmp_x', Blockly.Variables.NAME_TYPE); - code += 'int ' + xVar + - ' = new Math.Random().nextInt(' + list + '.length);'; - if (mode == 'SET') { - code += list + '[' + xVar + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.insert(' + xVar + ', ' + value + ');\n'; - return code; - } - } - throw 'Unhandled combination (lists_setIndex).'; -}; - -Blockly.Dart['lists_getSublist'] = function(block) { - // Get sublist. - var list = Blockly.Dart.valueToCode(block, 'LIST', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.Dart.valueToCode(block, 'AT1', - Blockly.Dart.ORDER_NONE) || '1'; - var at2 = Blockly.Dart.valueToCode(block, 'AT2', - Blockly.Dart.ORDER_NONE) || '1'; - if ((where1 == 'FIRST' || where1 == 'FROM_START' && Blockly.isNumber(at1)) && - (where2 == 'LAST' || where2 == 'FROM_START' && Blockly.isNumber(at2))) { - // Simple case that can be done inline. - at1 = where1 == 'FIRST' ? 0 : parseInt(at1, 10) - 1; - if (where2 == 'LAST') { - code = list + '.sublist(' + at1 + ')'; - } else { - at2 = parseInt(at2, 10); - code = list + '.sublist(' + at1 + ', ' + at2 + ')'; - } - } else { - var functionName = Blockly.Dart.provideFunction_( - 'lists_get_sublist', - [ 'List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(list, where1, at1, where2, at2) {', - ' int getAt(where, at) {', - ' if (where == \'FROM_START\') {', - ' at--;', - ' } else if (where == \'FROM_END\') {', - ' at = list.length - at;', - ' } else if (where == \'FIRST\') {', - ' at = 0;', - ' } else if (where == \'LAST\') {', - ' at = list.length - 1;', - ' } else {', - ' throw \'Unhandled option (lists_getSublist).\';', - ' }', - ' return at;', - ' }', - ' at1 = getAt(where1, at1);', - ' at2 = getAt(where2, at2) + 1;', - ' return list.sublist(at1, at2);', - '}']); - var code = functionName + '(' + list + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['lists_split'] = function(block) { - // Block for splitting text into a list, or joining a list into text. - var value_input = Blockly.Dart.valueToCode(block, 'INPUT', - Blockly.Dart.ORDER_UNARY_POSTFIX); - var value_delim = Blockly.Dart.valueToCode(block, 'DELIM', - Blockly.Dart.ORDER_NONE) || '\'\''; - var mode = block.getFieldValue('MODE'); - if (mode == 'SPLIT') { - if (!value_input) { - value_input = '\'\''; - } - var functionName = 'split'; - } else if (mode == 'JOIN') { - if (!value_input) { - value_input = '[]'; - } - var functionName = 'join'; - } else { - throw 'Unknown mode: ' + mode; - } - var code = value_input + '.' + functionName + '(' + value_delim + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; diff --git a/generators/dart/logic.js b/generators/dart/logic.js deleted file mode 100644 index 13f4e0a36d..0000000000 --- a/generators/dart/logic.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Generating Dart for logic blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Dart.logic'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart['controls_if'] = function(block) { - // If/elseif/else condition. - var n = 0; - var argument = Blockly.Dart.valueToCode(block, 'IF' + n, - Blockly.Dart.ORDER_NONE) || 'false'; - var branch = Blockly.Dart.statementToCode(block, 'DO' + n); - var code = 'if (' + argument + ') {\n' + branch + '}'; - for (n = 1; n <= block.elseifCount_; n++) { - argument = Blockly.Dart.valueToCode(block, 'IF' + n, - Blockly.Dart.ORDER_NONE) || 'false'; - branch = Blockly.Dart.statementToCode(block, 'DO' + n); - code += ' else if (' + argument + ') {\n' + branch + '}'; - } - if (block.elseCount_) { - branch = Blockly.Dart.statementToCode(block, 'ELSE'); - code += ' else {\n' + branch + '}'; - } - return code + '\n'; -}; - -Blockly.Dart['logic_compare'] = function(block) { - // Comparison operator. - var OPERATORS = { - 'EQ': '==', - 'NEQ': '!=', - 'LT': '<', - 'LTE': '<=', - 'GT': '>', - 'GTE': '>=' - }; - var operator = OPERATORS[block.getFieldValue('OP')]; - var order = (operator == '==' || operator == '!=') ? - Blockly.Dart.ORDER_EQUALITY : Blockly.Dart.ORDER_RELATIONAL; - var argument0 = Blockly.Dart.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'B', order) || '0'; - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Dart['logic_operation'] = function(block) { - // Operations 'and', 'or'. - var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; - var order = (operator == '&&') ? Blockly.Dart.ORDER_LOGICAL_AND : - Blockly.Dart.ORDER_LOGICAL_OR; - var argument0 = Blockly.Dart.valueToCode(block, 'A', order); - var argument1 = Blockly.Dart.valueToCode(block, 'B', order); - if (!argument0 && !argument1) { - // If there are no arguments, then the return value is false. - argument0 = 'false'; - argument1 = 'false'; - } else { - // Single missing arguments have no effect on the return value. - var defaultArgument = (operator == '&&') ? 'true' : 'false'; - if (!argument0) { - argument0 = defaultArgument; - } - if (!argument1) { - argument1 = defaultArgument; - } - } - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Dart['logic_negate'] = function(block) { - // Negation. - var order = Blockly.Dart.ORDER_UNARY_PREFIX; - var argument0 = Blockly.Dart.valueToCode(block, 'BOOL', order) || 'true'; - var code = '!' + argument0; - return [code, order]; -}; - -Blockly.Dart['logic_boolean'] = function(block) { - // Boolean values true and false. - var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; - return [code, Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['logic_null'] = function(block) { - // Null data type. - return ['null', Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['logic_ternary'] = function(block) { - // Ternary operator. - var value_if = Blockly.Dart.valueToCode(block, 'IF', - Blockly.Dart.ORDER_CONDITIONAL) || 'false'; - var value_then = Blockly.Dart.valueToCode(block, 'THEN', - Blockly.Dart.ORDER_CONDITIONAL) || 'null'; - var value_else = Blockly.Dart.valueToCode(block, 'ELSE', - Blockly.Dart.ORDER_CONDITIONAL) || 'null'; - var code = value_if + ' ? ' + value_then + ' : ' + value_else; - return [code, Blockly.Dart.ORDER_CONDITIONAL]; -}; diff --git a/generators/dart/loops.js b/generators/dart/loops.js deleted file mode 100644 index 2be30cc216..0000000000 --- a/generators/dart/loops.js +++ /dev/null @@ -1,163 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Generating Dart for loop blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.loops'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart['controls_repeat_ext'] = function(block) { - // Repeat n times. - if (block.getField('TIMES')) { - // Internal number. - var repeats = String(Number(block.getFieldValue('TIMES'))); - } else { - // External number. - var repeats = Blockly.Dart.valueToCode(block, 'TIMES', - Blockly.Dart.ORDER_ASSIGNMENT) || '0'; - } - var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); - var code = ''; - var loopVar = Blockly.Dart.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var endVar = repeats; - if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { - var endVar = Blockly.Dart.variableDB_.getDistinctName( - 'repeat_end', Blockly.Variables.NAME_TYPE); - code += 'var ' + endVar + ' = ' + repeats + ';\n'; - } - code += 'for (int ' + loopVar + ' = 0; ' + - loopVar + ' < ' + endVar + '; ' + - loopVar + '++) {\n' + - branch + '}\n'; - return code; -}; - -Blockly.Dart['controls_repeat'] = Blockly.Dart['controls_repeat_ext']; - -Blockly.Dart['controls_whileUntil'] = function(block) { - // Do while/until loop. - var until = block.getFieldValue('MODE') == 'UNTIL'; - var argument0 = Blockly.Dart.valueToCode(block, 'BOOL', - until ? Blockly.Dart.ORDER_UNARY_PREFIX : - Blockly.Dart.ORDER_NONE) || 'false'; - var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); - if (until) { - argument0 = '!' + argument0; - } - return 'while (' + argument0 + ') {\n' + branch + '}\n'; -}; - -Blockly.Dart['controls_for'] = function(block) { - // For loop. - var variable0 = Blockly.Dart.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Dart.valueToCode(block, 'FROM', - Blockly.Dart.ORDER_ASSIGNMENT) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'TO', - Blockly.Dart.ORDER_ASSIGNMENT) || '0'; - var increment = Blockly.Dart.valueToCode(block, 'BY', - Blockly.Dart.ORDER_ASSIGNMENT) || '1'; - var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); - var code; - if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && - Blockly.isNumber(increment)) { - // All arguments are simple numbers. - var up = parseFloat(argument0) <= parseFloat(argument1); - code = 'for (' + variable0 + ' = ' + argument0 + '; ' + - variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + - variable0; - var step = Math.abs(parseFloat(increment)); - if (step == 1) { - code += up ? '++' : '--'; - } else { - code += (up ? ' += ' : ' -= ') + step; - } - code += ') {\n' + branch + '}\n'; - } else { - code = ''; - // Cache non-trivial values to variables to prevent repeated look-ups. - var startVar = argument0; - if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { - var startVar = Blockly.Dart.variableDB_.getDistinctName( - variable0 + '_start', Blockly.Variables.NAME_TYPE); - code += 'var ' + startVar + ' = ' + argument0 + ';\n'; - } - var endVar = argument1; - if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { - var endVar = Blockly.Dart.variableDB_.getDistinctName( - variable0 + '_end', Blockly.Variables.NAME_TYPE); - code += 'var ' + endVar + ' = ' + argument1 + ';\n'; - } - // Determine loop direction at start, in case one of the bounds - // changes during loop execution. - var incVar = Blockly.Dart.variableDB_.getDistinctName( - variable0 + '_inc', Blockly.Variables.NAME_TYPE); - code += 'num ' + incVar + ' = '; - if (Blockly.isNumber(increment)) { - code += Math.abs(increment) + ';\n'; - } else { - code += '(' + increment + ').abs();\n'; - } - code += 'if (' + startVar + ' > ' + endVar + ') {\n'; - code += Blockly.Dart.INDENT + incVar + ' = -' + incVar + ';\n'; - code += '}\n'; - code += 'for (' + variable0 + ' = ' + startVar + ';\n' + - ' ' + incVar + ' >= 0 ? ' + - variable0 + ' <= ' + endVar + ' : ' + - variable0 + ' >= ' + endVar + ';\n' + - ' ' + variable0 + ' += ' + incVar + ') {\n' + - branch + '}\n'; - } - return code; -}; - -Blockly.Dart['controls_forEach'] = function(block) { - // For each loop. - var variable0 = Blockly.Dart.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Dart.valueToCode(block, 'LIST', - Blockly.Dart.ORDER_ASSIGNMENT) || '[]'; - var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); - var code = 'for (var ' + variable0 + ' in ' + argument0 + ') {\n' + - branch + '}\n'; - return code; -}; - -Blockly.Dart['controls_flow_statements'] = function(block) { - // Flow statements: continue, break. - switch (block.getFieldValue('FLOW')) { - case 'BREAK': - return 'break;\n'; - case 'CONTINUE': - return 'continue;\n'; - } - throw 'Unknown flow statement.'; -}; diff --git a/generators/dart/math.js b/generators/dart/math.js deleted file mode 100644 index aae008a2c7..0000000000 --- a/generators/dart/math.js +++ /dev/null @@ -1,487 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Generating Dart for math blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Dart.math'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart.addReservedWords('Math'); - -Blockly.Dart['math_number'] = function(block) { - // Numeric value. - var code = parseFloat(block.getFieldValue('NUM')); - var order; - if (code == Infinity) { - code = 'double.INFINITY'; - order = Blockly.Dart.ORDER_UNARY_POSTFIX; - } else if (code == -Infinity) { - code = '-double.INFINITY'; - order = Blockly.Dart.ORDER_UNARY_PREFIX; - } else { - // -4.abs() returns -4 in Dart due to strange order of operation choices. - // -4 is actually an operator and a number. Reflect this in the order. - order = code < 0 ? - Blockly.Dart.ORDER_UNARY_PREFIX : Blockly.Dart.ORDER_ATOMIC; - } - return [code, order]; -}; - -Blockly.Dart['math_arithmetic'] = function(block) { - // Basic arithmetic operators, and power. - var OPERATORS = { - 'ADD': [' + ', Blockly.Dart.ORDER_ADDITIVE], - 'MINUS': [' - ', Blockly.Dart.ORDER_ADDITIVE], - 'MULTIPLY': [' * ', Blockly.Dart.ORDER_MULTIPLICATIVE], - 'DIVIDE': [' / ', Blockly.Dart.ORDER_MULTIPLICATIVE], - 'POWER': [null, Blockly.Dart.ORDER_NONE] // Handle power separately. - }; - var tuple = OPERATORS[block.getFieldValue('OP')]; - var operator = tuple[0]; - var order = tuple[1]; - var argument0 = Blockly.Dart.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'B', order) || '0'; - var code; - // Power in Dart requires a special case since it has no operator. - if (!operator) { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - code = 'Math.pow(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } - code = argument0 + operator + argument1; - return [code, order]; -}; - -Blockly.Dart['math_single'] = function(block) { - // Math operators with single operand. - var operator = block.getFieldValue('OP'); - var code; - var arg; - if (operator == 'NEG') { - // Negation is a special case given its different operator precedence. - arg = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_UNARY_PREFIX) || '0'; - if (arg[0] == '-') { - // --3 is not legal in Dart. - arg = ' ' + arg; - } - code = '-' + arg; - return [code, Blockly.Dart.ORDER_UNARY_PREFIX]; - } - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - if (operator == 'ABS' || operator.substring(0, 5) == 'ROUND') { - arg = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '0'; - } else if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_MULTIPLICATIVE) || '0'; - } else { - arg = Blockly.Dart.valueToCode(block, 'NUM', - Blockly.Dart.ORDER_NONE) || '0'; - } - // First, handle cases which generate values that don't need parentheses - // wrapping the code. - switch (operator) { - case 'ABS': - code = arg + '.abs()'; - break; - case 'ROOT': - code = 'Math.sqrt(' + arg + ')'; - break; - case 'LN': - code = 'Math.log(' + arg + ')'; - break; - case 'EXP': - code = 'Math.exp(' + arg + ')'; - break; - case 'POW10': - code = 'Math.pow(10,' + arg + ')'; - break; - case 'ROUND': - code = arg + '.round()'; - break; - case 'ROUNDUP': - code = arg + '.ceil()'; - break; - case 'ROUNDDOWN': - code = arg + '.floor()'; - break; - case 'SIN': - code = 'Math.sin(' + arg + ' / 180 * Math.PI)'; - break; - case 'COS': - code = 'Math.cos(' + arg + ' / 180 * Math.PI)'; - break; - case 'TAN': - code = 'Math.tan(' + arg + ' / 180 * Math.PI)'; - break; - } - if (code) { - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } - // Second, handle cases which generate values that may need parentheses - // wrapping the code. - switch (operator) { - case 'LOG10': - code = 'Math.log(' + arg + ') / Math.log(10)'; - break; - case 'ASIN': - code = 'Math.asin(' + arg + ') / Math.PI * 180'; - break; - case 'ACOS': - code = 'Math.acos(' + arg + ') / Math.PI * 180'; - break; - case 'ATAN': - code = 'Math.atan(' + arg + ') / Math.PI * 180'; - break; - default: - throw 'Unknown math operator: ' + operator; - } - return [code, Blockly.Dart.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Dart['math_constant'] = function(block) { - // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - var CONSTANTS = { - 'PI': ['Math.PI', Blockly.Dart.ORDER_UNARY_POSTFIX], - 'E': ['Math.E', Blockly.Dart.ORDER_UNARY_POSTFIX], - 'GOLDEN_RATIO': - ['(1 + Math.sqrt(5)) / 2', Blockly.Dart.ORDER_MULTIPLICATIVE], - 'SQRT2': ['Math.SQRT2', Blockly.Dart.ORDER_UNARY_POSTFIX], - 'SQRT1_2': ['Math.SQRT1_2', Blockly.Dart.ORDER_UNARY_POSTFIX], - 'INFINITY': ['double.INFINITY', Blockly.Dart.ORDER_ATOMIC] - }; - var constant = block.getFieldValue('CONSTANT'); - if (constant != 'INFINITY') { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - } - return CONSTANTS[constant]; -}; - -Blockly.Dart['math_number_property'] = function(block) { - // Check if a number is even, odd, prime, whole, positive, or negative - // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.Dart.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.Dart.ORDER_MULTIPLICATIVE); - if (!number_to_check) { - return ['false', Blockly.Python.ORDER_ATOMIC]; - } - var dropdown_property = block.getFieldValue('PROPERTY'); - var code; - if (dropdown_property == 'PRIME') { - // Prime is a special case as it is not a one-liner test. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_isPrime', - [ 'bool ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(n) {', - ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', - ' if (n == 2 || n == 3) {', - ' return true;', - ' }', - ' // False if n is null, negative, is 1, or not whole.', - ' // And false if n is divisible by 2 or 3.', - ' if (n == null || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' + - ' n % 3 == 0) {', - ' return false;', - ' }', - ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', - ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {', - ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {', - ' return false;', - ' }', - ' }', - ' return true;', - '}']); - code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } - switch (dropdown_property) { - case 'EVEN': - code = number_to_check + ' % 2 == 0'; - break; - case 'ODD': - code = number_to_check + ' % 2 == 1'; - break; - case 'WHOLE': - code = number_to_check + ' % 1 == 0'; - break; - case 'POSITIVE': - code = number_to_check + ' > 0'; - break; - case 'NEGATIVE': - code = number_to_check + ' < 0'; - break; - case 'DIVISIBLE_BY': - var divisor = Blockly.Dart.valueToCode(block, 'DIVISOR', - Blockly.Dart.ORDER_MULTIPLICATIVE); - if (!divisor) { - return ['false', Blockly.Python.ORDER_ATOMIC]; - } - code = number_to_check + ' % ' + divisor + ' == 0'; - break; - } - return [code, Blockly.Dart.ORDER_EQUALITY]; -}; - -Blockly.Dart['math_change'] = function(block) { - // Add to a variable in place. - var argument0 = Blockly.Dart.valueToCode(block, 'DELTA', - Blockly.Dart.ORDER_ADDITIVE) || '0'; - var varName = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return varName + ' = (' + varName + ' is num ? ' + varName + ' : 0) + ' + - argument0 + ';\n'; -}; - -// Rounding functions have a single operand. -Blockly.Dart['math_round'] = Blockly.Dart['math_single']; -// Trigonometry functions have a single operand. -Blockly.Dart['math_trig'] = Blockly.Dart['math_single']; - -Blockly.Dart['math_on_list'] = function(block) { - // Math functions for lists. - var func = block.getFieldValue('OP'); - var list = Blockly.Dart.valueToCode(block, 'LIST', - Blockly.Dart.ORDER_NONE) || '[]'; - var code; - switch (func) { - case 'SUM': - var functionName = Blockly.Dart.provideFunction_( - 'math_sum', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' num sumVal = 0;', - ' myList.forEach((num entry) {sumVal += entry;});', - ' return sumVal;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'MIN': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_min', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' if (myList.isEmpty) return null;', - ' num minVal = myList[0];', - ' myList.forEach((num entry) ' + - '{minVal = Math.min(minVal, entry);});', - ' return minVal;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'MAX': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_max', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' if (myList.isEmpty) return null;', - ' num maxVal = myList[0];', - ' myList.forEach((num entry) ' + - '{maxVal = Math.max(maxVal, entry);});', - ' return maxVal;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'AVERAGE': - // This operation exclude null and values that are not int or float: - // math_mean([null,null,"aString",1,9]) == 5.0. - var functionName = Blockly.Dart.provideFunction_( - 'math_average', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' // First filter list for numbers only.', - ' List localList = new List.from(myList);', - ' localList.removeMatching((a) => a is! num);', - ' if (localList.isEmpty) return null;', - ' num sumVal = 0;', - ' localList.forEach((num entry) {sumVal += entry;});', - ' return sumVal / localList.length;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'MEDIAN': - var functionName = Blockly.Dart.provideFunction_( - 'math_median', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' // First filter list for numbers only, then sort, ' + - 'then return middle value', - ' // or the average of two middle values if list has an ' + - 'even number of elements.', - ' List localList = new List.from(myList);', - ' localList.removeMatching((a) => a is! num);', - ' if (localList.isEmpty) return null;', - ' localList.sort((a, b) => (a - b));', - ' int index = localList.length ~/ 2;', - ' if (localList.length % 2 == 1) {', - ' return localList[index];', - ' } else {', - ' return (localList[index - 1] + localList[index]) / 2;', - ' }', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'MODE': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - // As a list of numbers can contain more than one mode, - // the returned result is provided as an array. - // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. - var functionName = Blockly.Dart.provideFunction_( - 'math_modes', - [ 'List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List values) {', - ' List modes = [];', - ' List counts = [];', - ' int maxCount = 0;', - ' for (int i = 0; i < values.length; i++) {', - ' var value = values[i];', - ' bool found = false;', - ' int thisCount;', - ' for (int j = 0; j < counts.length; j++) {', - ' if (counts[j][0] == value) {', - ' thisCount = ++counts[j][1];', - ' found = true;', - ' break;', - ' }', - ' }', - ' if (!found) {', - ' counts.add([value, 1]);', - ' thisCount = 1;', - ' }', - ' maxCount = Math.max(thisCount, maxCount);', - ' }', - ' for (int j = 0; j < counts.length; j++) {', - ' if (counts[j][1] == maxCount) {', - ' modes.add(counts[j][0]);', - ' }', - ' }', - ' return modes;', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'STD_DEV': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_standard_deviation', - [ 'num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' // First filter list for numbers only.', - ' List numbers = new List.from(myList);', - ' numbers.removeMatching((a) => a is! num);', - ' if (numbers.isEmpty) return null;', - ' num n = numbers.length;', - ' num sum = 0;', - ' numbers.forEach((x) => sum += x);', - ' num mean = sum / n;', - ' num sumSquare = 0;', - ' numbers.forEach((x) => sumSquare += ' + - 'Math.pow(x - mean, 2));', - ' return Math.sqrt(sumSquare / n);', - '}']); - code = functionName + '(' + list + ')'; - break; - case 'RANDOM': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'math_random_item', - [ 'dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(List myList) {', - ' int x = new Math.Random().nextInt(myList.length);', - ' return myList[x];', - '}']); - code = functionName + '(' + list + ')'; - break; - default: - throw 'Unknown operator: ' + func; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['math_modulo'] = function(block) { - // Remainder computation. - var argument0 = Blockly.Dart.valueToCode(block, 'DIVIDEND', - Blockly.Dart.ORDER_MULTIPLICATIVE) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'DIVISOR', - Blockly.Dart.ORDER_MULTIPLICATIVE) || '0'; - var code = argument0 + ' % ' + argument1; - return [code, Blockly.Dart.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Dart['math_constrain'] = function(block) { - // Constrain a number between two limits. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_NONE) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'LOW', - Blockly.Dart.ORDER_NONE) || '0'; - var argument2 = Blockly.Dart.valueToCode(block, 'HIGH', - Blockly.Dart.ORDER_NONE) || 'double.INFINITY'; - var code = 'Math.min(Math.max(' + argument0 + ', ' + argument1 + '), ' + - argument2 + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['math_random_int'] = function(block) { - // Random integer between [X] and [Y]. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var argument0 = Blockly.Dart.valueToCode(block, 'FROM', - Blockly.Dart.ORDER_NONE) || '0'; - var argument1 = Blockly.Dart.valueToCode(block, 'TO', - Blockly.Dart.ORDER_NONE) || '0'; - var functionName = Blockly.Dart.provideFunction_( - 'math_random_int', - [ 'int ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '(num a, num b) {', - ' if (a > b) {', - ' // Swap a and b to ensure a is smaller.', - ' num c = a;', - ' a = b;', - ' b = c;', - ' }', - ' return new Math.Random().nextInt(b - a + 1) + a;', - '}']); - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['math_random_float'] = function(block) { - // Random fraction between 0 and 1. - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - return ['new Math.Random().nextDouble()', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; diff --git a/generators/dart/procedures.js b/generators/dart/procedures.js deleted file mode 100644 index 4f1b9789e2..0000000000 --- a/generators/dart/procedures.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Generating Dart for procedure blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.procedures'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart['procedures_defreturn'] = function(block) { - // Define a procedure with a return value. - var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var branch = Blockly.Dart.statementToCode(block, 'STACK'); - if (Blockly.Dart.STATEMENT_PREFIX) { - branch = Blockly.Dart.prefixLines( - Blockly.Dart.STATEMENT_PREFIX.replace(/%1/g, - '\'' + block.id + '\''), Blockly.Dart.INDENT) + branch; - } - if (Blockly.Dart.INFINITE_LOOP_TRAP) { - branch = Blockly.Dart.INFINITE_LOOP_TRAP.replace(/%1/g, - '\'' + block.id + '\'') + branch; - } - var returnValue = Blockly.Dart.valueToCode(block, 'RETURN', - Blockly.Dart.ORDER_NONE) || ''; - if (returnValue) { - returnValue = ' return ' + returnValue + ';\n'; - } - var returnType = returnValue ? 'dynamic' : 'void'; - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Dart.variableDB_.getName(block.arguments_[x], - Blockly.Variables.NAME_TYPE); - } - var code = returnType + ' ' + funcName + '(' + args.join(', ') + ') {\n' + - branch + returnValue + '}'; - code = Blockly.Dart.scrub_(block, code); - Blockly.Dart.definitions_[funcName] = code; - return null; -}; - -// Defining a procedure without a return value uses the same generator as -// a procedure with a return value. -Blockly.Dart['procedures_defnoreturn'] = Blockly.Dart['procedures_defreturn']; - -Blockly.Dart['procedures_callreturn'] = function(block) { - // Call a procedure with a return value. - var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Dart.valueToCode(block, 'ARG' + x, - Blockly.Dart.ORDER_NONE) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['procedures_callnoreturn'] = function(block) { - // Call a procedure with no return value. - var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Dart.valueToCode(block, 'ARG' + x, - Blockly.Dart.ORDER_NONE) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ');\n'; - return code; -}; - -Blockly.Dart['procedures_ifreturn'] = function(block) { - // Conditionally return value from a procedure. - var condition = Blockly.Dart.valueToCode(block, 'CONDITION', - Blockly.Dart.ORDER_NONE) || 'false'; - var code = 'if (' + condition + ') {\n'; - if (block.hasReturnValue_) { - var value = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_NONE) || 'null'; - code += ' return ' + value + ';\n'; - } else { - code += ' return;\n'; - } - code += '}\n'; - return code; -}; diff --git a/generators/dart/text.js b/generators/dart/text.js deleted file mode 100644 index 6a06c8241e..0000000000 --- a/generators/dart/text.js +++ /dev/null @@ -1,270 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Generating Dart for text blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.texts'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart.addReservedWords('Html,Math'); - -Blockly.Dart['text'] = function(block) { - // Text value. - var code = Blockly.Dart.quote_(block.getFieldValue('TEXT')); - return [code, Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['text_join'] = function(block) { - // Create a string made up of any number of elements of any type. - var code; - if (block.itemCount_ == 0) { - return ['\'\'', Blockly.Dart.ORDER_ATOMIC]; - } else if (block.itemCount_ == 1) { - var argument0 = Blockly.Dart.valueToCode(block, 'ADD0', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - code = argument0 + '.toString()'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } else { - code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Dart.valueToCode(block, 'ADD' + n, - Blockly.Dart.ORDER_NONE) || '\'\''; - } - code = '[' + code.join(',') + '].join()'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } -}; - -Blockly.Dart['text_append'] = function(block) { - // Append to a variable in place. - var varName = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - return varName + ' = [' + varName + ', ' + argument0 + '].join();\n'; -}; - -Blockly.Dart['text_length'] = function(block) { - // String or array length. - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - return [argument0 + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - return [argument0 + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_indexOf'] = function(block) { - // Search the text for a substring. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.Dart.valueToCode(block, 'FIND', - Blockly.Dart.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_charAt'] = function(block) { - // Get letter at index. - // Note: Until January 2013 this block did not have the WHERE input. - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Dart.valueToCode(block, 'AT', - Blockly.Dart.ORDER_NONE) || '1'; - var text = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - switch (where) { - case 'FIRST': - var code = text + '[0]'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - case 'FROM_START': - // Blockly uses one-based indicies. - if (at.match(/^-?\d+$/)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - var code = text + '[' + at + ']'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - case 'LAST': - at = 1; - // Fall through. - case 'FROM_END': - var functionName = Blockly.Dart.provideFunction_( - 'text_get_from_end', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String text, num x) {', - ' return text[text.length - x];', - '}']); - code = functionName + '(' + text + ', ' + at + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - case 'RANDOM': - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - var functionName = Blockly.Dart.provideFunction_( - 'text_random_letter', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String text) {', - ' int x = new Math.Random().nextInt(text.length);', - ' return text[x];', - '}']); - code = functionName + '(' + text + ')'; - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; - } - throw 'Unhandled option (text_charAt).'; -}; - -Blockly.Dart['text_getSubstring'] = function(block) { - // Get substring. - var text = Blockly.Dart.valueToCode(block, 'STRING', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.Dart.valueToCode(block, 'AT1', - Blockly.Dart.ORDER_NONE) || '1'; - var at2 = Blockly.Dart.valueToCode(block, 'AT2', - Blockly.Dart.ORDER_NONE) || '1'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = text; - } else { - var functionName = Blockly.Dart.provideFunction_( - 'text_get_substring', - [ 'function ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(text, where1, at1, where2, at2) {', - ' function getAt(where, at) {', - ' if (where == \'FROM_START\') {', - ' at--;', - ' } else if (where == \'FROM_END\') {', - ' at = text.length - at;', - ' } else if (where == \'FIRST\') {', - ' at = 0;', - ' } else if (where == \'LAST\') {', - ' at = text.length - 1;', - ' } else {', - ' throw \'Unhandled option (text_getSubstring).\';', - ' }', - ' return at;', - ' }', - ' at1 = getAt(where1, at1);', - ' at2 = getAt(where2, at2) + 1;', - ' return text.substring(at1, at2);', - '}']); - var code = functionName + '(' + text + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_changeCase'] = function(block) { - // Change capitalization. - var OPERATORS = { - 'UPPERCASE': '.toUpperCase()', - 'LOWERCASE': '.toLowerCase()', - 'TITLECASE': null - }; - var operator = OPERATORS[block.getFieldValue('CASE')]; - var code; - if (operator) { - // Upper and lower case are functions built into Dart. - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - code = argument0 + operator; - } else { - // Title case is not a native Dart function. Define one. - var functionName = Blockly.Dart.provideFunction_( - 'text_toTitleCase', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String str) {', - ' RegExp exp = new RegExp(r\'\\b\');', - ' List list = str.split(exp);', - ' final title = new StringBuffer();', - ' for (String part in list) {', - ' if (part.length > 0) {', - ' title.write(part[0].toUpperCase());', - ' if (part.length > 0) {', - ' title.write(part.substring(1).toLowerCase());', - ' }', - ' }', - ' }', - ' return title.toString();', - '}']); - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_NONE) || '\'\''; - code = functionName + '(' + argument0 + ')'; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_trim'] = function(block) { - // Trim spaces. - var OPERATORS = { - 'LEFT': '.replaceFirst(new RegExp(r\'^\\s+\'), \'\')', - 'RIGHT': '.replaceFirst(new RegExp(r\'\\s+$\'), \'\')', - 'BOTH': '.trim()' - }; - var operator = OPERATORS[block.getFieldValue('MODE')]; - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; - return [argument0 + operator, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_NONE) || '\'\''; - return 'print(' + argument0 + ');\n'; -}; - -Blockly.Dart['text_prompt_ext'] = function(block) { - // Prompt function. - Blockly.Dart.definitions_['import_dart_html'] = - 'import \'dart:html\' as Html;'; - if (block.getField('TEXT')) { - // Internal message. - var msg = Blockly.Dart.quote_(block.getFieldValue('TEXT')); - } else { - // External message. - var msg = Blockly.Dart.valueToCode(block, 'TEXT', - Blockly.Dart.ORDER_NONE) || '\'\''; - } - var code = 'Html.window.prompt(' + msg + ', \'\')'; - var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; - if (toNumber) { - Blockly.Dart.definitions_['import_dart_math'] = - 'import \'dart:math\' as Math;'; - code = 'Math.parseDouble(' + code + ')'; - } - return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; -}; - -Blockly.Dart['text_prompt'] = Blockly.Dart['text_prompt_ext']; diff --git a/generators/dart/variables.js b/generators/dart/variables.js deleted file mode 100644 index 446f7aa15c..0000000000 --- a/generators/dart/variables.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Generating Dart for variable blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Dart.variables'); - -goog.require('Blockly.Dart'); - - -Blockly.Dart['variables_get'] = function(block) { - // Variable getter. - var code = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return [code, Blockly.Dart.ORDER_ATOMIC]; -}; - -Blockly.Dart['variables_set'] = function(block) { - // Variable setter. - var argument0 = Blockly.Dart.valueToCode(block, 'VALUE', - Blockly.Dart.ORDER_ASSIGNMENT) || '0'; - var varName = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return varName + ' = ' + argument0 + ';\n'; -}; diff --git a/generators/javascript.js b/generators/javascript.js deleted file mode 100644 index baa398a87c..0000000000 --- a/generators/javascript.js +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Helper functions for generating JavaScript for blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript'); - -goog.require('Blockly.Generator'); - - -/** - * JavaScript code generator. - * @type {!Blockly.Generator} - */ -Blockly.JavaScript = new Blockly.Generator('JavaScript'); - -/** - * List of illegal variable names. - * This is not intended to be a security feature. Blockly is 100% client-side, - * so bypassing this list is trivial. This is intended to prevent users from - * accidentally clobbering a built-in object or function. - * @private - */ -Blockly.JavaScript.addReservedWords( - 'Blockly,' + // In case JS is evaled in the current window. - // https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words - 'break,case,catch,continue,debugger,default,delete,do,else,finally,for,function,if,in,instanceof,new,return,switch,this,throw,try,typeof,var,void,while,with,' + - 'class,enum,export,extends,import,super,implements,interface,let,package,private,protected,public,static,yield,' + - 'const,null,true,false,' + - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects - 'Array,ArrayBuffer,Boolean,Date,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Error,eval,EvalError,Float32Array,Float64Array,Function,Infinity,Int16Array,Int32Array,Int8Array,isFinite,isNaN,Iterator,JSON,Math,NaN,Number,Object,parseFloat,parseInt,RangeError,ReferenceError,RegExp,StopIteration,String,SyntaxError,TypeError,Uint16Array,Uint32Array,Uint8Array,Uint8ClampedArray,undefined,uneval,URIError,' + - // https://developer.mozilla.org/en/DOM/window - 'applicationCache,closed,Components,content,_content,controllers,crypto,defaultStatus,dialogArguments,directories,document,frameElement,frames,fullScreen,globalStorage,history,innerHeight,innerWidth,length,location,locationbar,localStorage,menubar,messageManager,mozAnimationStartTime,mozInnerScreenX,mozInnerScreenY,mozPaintCount,name,navigator,opener,outerHeight,outerWidth,pageXOffset,pageYOffset,parent,performance,personalbar,pkcs11,returnValue,screen,screenX,screenY,scrollbars,scrollMaxX,scrollMaxY,scrollX,scrollY,self,sessionStorage,sidebar,status,statusbar,toolbar,top,URL,window,' + - 'addEventListener,alert,atob,back,blur,btoa,captureEvents,clearImmediate,clearInterval,clearTimeout,close,confirm,disableExternalCapture,dispatchEvent,dump,enableExternalCapture,escape,find,focus,forward,GeckoActiveXObject,getAttention,getAttentionWithCycleCount,getComputedStyle,getSelection,home,matchMedia,maximize,minimize,moveBy,moveTo,mozRequestAnimationFrame,open,openDialog,postMessage,print,prompt,QueryInterface,releaseEvents,removeEventListener,resizeBy,resizeTo,restore,routeEvent,scroll,scrollBy,scrollByLines,scrollByPages,scrollTo,setCursor,setImmediate,setInterval,setResizable,setTimeout,showModalDialog,sizeToContent,stop,unescape,updateCommands,XPCNativeWrapper,XPCSafeJSObjectWrapper,' + - 'onabort,onbeforeunload,onblur,onchange,onclick,onclose,oncontextmenu,ondevicemotion,ondeviceorientation,ondragdrop,onerror,onfocus,onhashchange,onkeydown,onkeypress,onkeyup,onload,onmousedown,onmousemove,onmouseout,onmouseover,onmouseup,onmozbeforepaint,onpaint,onpopstate,onreset,onresize,onscroll,onselect,onsubmit,onunload,onpageshow,onpagehide,' + - 'Image,Option,Worker,' + - // https://developer.mozilla.org/en/Gecko_DOM_Reference - 'Event,Range,File,FileReader,Blob,BlobBuilder,' + - 'Attr,CDATASection,CharacterData,Comment,console,DocumentFragment,DocumentType,DomConfiguration,DOMError,DOMErrorHandler,DOMException,DOMImplementation,DOMImplementationList,DOMImplementationRegistry,DOMImplementationSource,DOMLocator,DOMObject,DOMString,DOMStringList,DOMTimeStamp,DOMUserData,Entity,EntityReference,MediaQueryList,MediaQueryListListener,NameList,NamedNodeMap,Node,NodeFilter,NodeIterator,NodeList,Notation,Plugin,PluginArray,ProcessingInstruction,SharedWorker,Text,TimeRanges,Treewalker,TypeInfo,UserDataHandler,Worker,WorkerGlobalScope,' + - 'HTMLDocument,HTMLElement,HTMLAnchorElement,HTMLAppletElement,HTMLAudioElement,HTMLAreaElement,HTMLBaseElement,HTMLBaseFontElement,HTMLBodyElement,HTMLBRElement,HTMLButtonElement,HTMLCanvasElement,HTMLDirectoryElement,HTMLDivElement,HTMLDListElement,HTMLEmbedElement,HTMLFieldSetElement,HTMLFontElement,HTMLFormElement,HTMLFrameElement,HTMLFrameSetElement,HTMLHeadElement,HTMLHeadingElement,HTMLHtmlElement,HTMLHRElement,HTMLIFrameElement,HTMLImageElement,HTMLInputElement,HTMLKeygenElement,HTMLLabelElement,HTMLLIElement,HTMLLinkElement,HTMLMapElement,HTMLMenuElement,HTMLMetaElement,HTMLModElement,HTMLObjectElement,HTMLOListElement,HTMLOptGroupElement,HTMLOptionElement,HTMLOutputElement,HTMLParagraphElement,HTMLParamElement,HTMLPreElement,HTMLQuoteElement,HTMLScriptElement,HTMLSelectElement,HTMLSourceElement,HTMLSpanElement,HTMLStyleElement,HTMLTableElement,HTMLTableCaptionElement,HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement,HTMLTableColElement,HTMLTableRowElement,HTMLTableSectionElement,HTMLTextAreaElement,HTMLTimeElement,HTMLTitleElement,HTMLTrackElement,HTMLUListElement,HTMLUnknownElement,HTMLVideoElement,' + - 'HTMLCanvasElement,CanvasRenderingContext2D,CanvasGradient,CanvasPattern,TextMetrics,ImageData,CanvasPixelArray,HTMLAudioElement,HTMLVideoElement,NotifyAudioAvailableEvent,HTMLCollection,HTMLAllCollection,HTMLFormControlsCollection,HTMLOptionsCollection,HTMLPropertiesCollection,DOMTokenList,DOMSettableTokenList,DOMStringMap,RadioNodeList,' + - 'SVGDocument,SVGElement,SVGAElement,SVGAltGlyphElement,SVGAltGlyphDefElement,SVGAltGlyphItemElement,SVGAnimationElement,SVGAnimateElement,SVGAnimateColorElement,SVGAnimateMotionElement,SVGAnimateTransformElement,SVGSetElement,SVGCircleElement,SVGClipPathElement,SVGColorProfileElement,SVGCursorElement,SVGDefsElement,SVGDescElement,SVGEllipseElement,SVGFilterElement,SVGFilterPrimitiveStandardAttributes,SVGFEBlendElement,SVGFEColorMatrixElement,SVGFEComponentTransferElement,SVGFECompositeElement,SVGFEConvolveMatrixElement,SVGFEDiffuseLightingElement,SVGFEDisplacementMapElement,SVGFEDistantLightElement,SVGFEFloodElement,SVGFEGaussianBlurElement,SVGFEImageElement,SVGFEMergeElement,SVGFEMergeNodeElement,SVGFEMorphologyElement,SVGFEOffsetElement,SVGFEPointLightElement,SVGFESpecularLightingElement,SVGFESpotLightElement,SVGFETileElement,SVGFETurbulenceElement,SVGComponentTransferFunctionElement,SVGFEFuncRElement,SVGFEFuncGElement,SVGFEFuncBElement,SVGFEFuncAElement,SVGFontElement,SVGFontFaceElement,SVGFontFaceFormatElement,SVGFontFaceNameElement,SVGFontFaceSrcElement,SVGFontFaceUriElement,SVGForeignObjectElement,SVGGElement,SVGGlyphElement,SVGGlyphRefElement,SVGGradientElement,SVGLinearGradientElement,SVGRadialGradientElement,SVGHKernElement,SVGImageElement,SVGLineElement,SVGMarkerElement,SVGMaskElement,SVGMetadataElement,SVGMissingGlyphElement,SVGMPathElement,SVGPathElement,SVGPatternElement,SVGPolylineElement,SVGPolygonElement,SVGRectElement,SVGScriptElement,SVGStopElement,SVGStyleElement,SVGSVGElement,SVGSwitchElement,SVGSymbolElement,SVGTextElement,SVGTextPathElement,SVGTitleElement,SVGTRefElement,SVGTSpanElement,SVGUseElement,SVGViewElement,SVGVKernElement,' + - 'SVGAngle,SVGColor,SVGICCColor,SVGElementInstance,SVGElementInstanceList,SVGLength,SVGLengthList,SVGMatrix,SVGNumber,SVGNumberList,SVGPaint,SVGPoint,SVGPointList,SVGPreserveAspectRatio,SVGRect,SVGStringList,SVGTransform,SVGTransformList,' + - 'SVGAnimatedAngle,SVGAnimatedBoolean,SVGAnimatedEnumeration,SVGAnimatedInteger,SVGAnimatedLength,SVGAnimatedLengthList,SVGAnimatedNumber,SVGAnimatedNumberList,SVGAnimatedPreserveAspectRatio,SVGAnimatedRect,SVGAnimatedString,SVGAnimatedTransformList,' + - 'SVGPathSegList,SVGPathSeg,SVGPathSegArcAbs,SVGPathSegArcRel,SVGPathSegClosePath,SVGPathSegCurvetoCubicAbs,SVGPathSegCurvetoCubicRel,SVGPathSegCurvetoCubicSmoothAbs,SVGPathSegCurvetoCubicSmoothRel,SVGPathSegCurvetoQuadraticAbs,SVGPathSegCurvetoQuadraticRel,SVGPathSegCurvetoQuadraticSmoothAbs,SVGPathSegCurvetoQuadraticSmoothRel,SVGPathSegLinetoAbs,SVGPathSegLinetoHorizontalAbs,SVGPathSegLinetoHorizontalRel,SVGPathSegLinetoRel,SVGPathSegLinetoVerticalAbs,SVGPathSegLinetoVerticalRel,SVGPathSegMovetoAbs,SVGPathSegMovetoRel,ElementTimeControl,TimeEvent,SVGAnimatedPathData,' + - 'SVGAnimatedPoints,SVGColorProfileRule,SVGCSSRule,SVGExternalResourcesRequired,SVGFitToViewBox,SVGLangSpace,SVGLocatable,SVGRenderingIntent,SVGStylable,SVGTests,SVGTextContentElement,SVGTextPositioningElement,SVGTransformable,SVGUnitTypes,SVGURIReference,SVGViewSpec,SVGZoomAndPan'); - -/** - * Order of operation ENUMs. - * https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence - */ -Blockly.JavaScript.ORDER_ATOMIC = 0; // 0 "" ... -Blockly.JavaScript.ORDER_MEMBER = 1; // . [] -Blockly.JavaScript.ORDER_NEW = 1; // new -Blockly.JavaScript.ORDER_FUNCTION_CALL = 2; // () -Blockly.JavaScript.ORDER_INCREMENT = 3; // ++ -Blockly.JavaScript.ORDER_DECREMENT = 3; // -- -Blockly.JavaScript.ORDER_LOGICAL_NOT = 4; // ! -Blockly.JavaScript.ORDER_BITWISE_NOT = 4; // ~ -Blockly.JavaScript.ORDER_UNARY_PLUS = 4; // + -Blockly.JavaScript.ORDER_UNARY_NEGATION = 4; // - -Blockly.JavaScript.ORDER_TYPEOF = 4; // typeof -Blockly.JavaScript.ORDER_VOID = 4; // void -Blockly.JavaScript.ORDER_DELETE = 4; // delete -Blockly.JavaScript.ORDER_MULTIPLICATION = 5; // * -Blockly.JavaScript.ORDER_DIVISION = 5; // / -Blockly.JavaScript.ORDER_MODULUS = 5; // % -Blockly.JavaScript.ORDER_ADDITION = 6; // + -Blockly.JavaScript.ORDER_SUBTRACTION = 6; // - -Blockly.JavaScript.ORDER_BITWISE_SHIFT = 7; // << >> >>> -Blockly.JavaScript.ORDER_RELATIONAL = 8; // < <= > >= -Blockly.JavaScript.ORDER_IN = 8; // in -Blockly.JavaScript.ORDER_INSTANCEOF = 8; // instanceof -Blockly.JavaScript.ORDER_EQUALITY = 9; // == != === !== -Blockly.JavaScript.ORDER_BITWISE_AND = 10; // & -Blockly.JavaScript.ORDER_BITWISE_XOR = 11; // ^ -Blockly.JavaScript.ORDER_BITWISE_OR = 12; // | -Blockly.JavaScript.ORDER_LOGICAL_AND = 13; // && -Blockly.JavaScript.ORDER_LOGICAL_OR = 14; // || -Blockly.JavaScript.ORDER_CONDITIONAL = 15; // ?: -Blockly.JavaScript.ORDER_ASSIGNMENT = 16; // = += -= *= /= %= <<= >>= ... -Blockly.JavaScript.ORDER_COMMA = 17; // , -Blockly.JavaScript.ORDER_NONE = 99; // (...) - -/** - * Initialise the database of variable names. - * @param {!Blockly.Workspace} workspace Workspace to generate code from. - */ -Blockly.JavaScript.init = function(workspace) { - // Create a dictionary of definitions to be printed before the code. - Blockly.JavaScript.definitions_ = Object.create(null); - // Create a dictionary mapping desired function names in definitions_ - // to actual function names (to avoid collisions with user functions). - Blockly.JavaScript.functionNames_ = Object.create(null); - - if (!Blockly.JavaScript.variableDB_) { - Blockly.JavaScript.variableDB_ = - new Blockly.Names(Blockly.JavaScript.RESERVED_WORDS_); - } else { - Blockly.JavaScript.variableDB_.reset(); - } - - var defvars = []; - var variables = Blockly.Variables.allVariables(workspace); - for (var i = 0; i < variables.length; i++) { - defvars[i] = 'var ' + - Blockly.JavaScript.variableDB_.getName(variables[i], - Blockly.Variables.NAME_TYPE) + ';'; - } - Blockly.JavaScript.definitions_['variables'] = defvars.join('\n'); -}; - -/** - * Prepend the generated code with the variable definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.JavaScript.finish = function(code) { - // Convert the definitions dictionary into a list. - var definitions = []; - for (var name in Blockly.JavaScript.definitions_) { - definitions.push(Blockly.JavaScript.definitions_[name]); - } - // Clean up temporary data. - delete Blockly.JavaScript.definitions_; - delete Blockly.JavaScript.functionNames_; - Blockly.JavaScript.variableDB_.reset(); - return definitions.join('\n\n') + '\n\n\n' + code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. A trailing semicolon is needed to make this legal. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.JavaScript.scrubNakedValue = function(line) { - return line + ';\n'; -}; - -/** - * Encode a string as a properly escaped JavaScript string, complete with - * quotes. - * @param {string} string Text to encode. - * @return {string} JavaScript string. - * @private - */ -Blockly.JavaScript.quote_ = function(string) { - // TODO: This is a quick hack. Replace with goog.string.quote - string = string.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\\n') - .replace(/'/g, '\\\''); - return '\'' + string + '\''; -}; - -/** - * Common tasks for generating JavaScript from blocks. - * Handles comments for the specified block and any connected value blocks. - * Calls any statements following this block. - * @param {!Blockly.Block} block The current block. - * @param {string} code The JavaScript code created for this block. - * @return {string} JavaScript code with comments and subsequent blocks added. - * @private - */ -Blockly.JavaScript.scrub_ = function(block, code) { - var commentCode = ''; - // Only collect comments for blocks that aren't inline. - if (!block.outputConnection || !block.outputConnection.targetConnection) { - // Collect comment for this block. - var comment = block.getCommentText(); - if (comment) { - commentCode += Blockly.JavaScript.prefixLines(comment, '// ') + '\n'; - } - // Collect comments for all value arguments. - // Don't collect comments for nested statements. - for (var x = 0; x < block.inputList.length; x++) { - if (block.inputList[x].type == Blockly.INPUT_VALUE) { - var childBlock = block.inputList[x].connection.targetBlock(); - if (childBlock) { - var comment = Blockly.JavaScript.allNestedComments(childBlock); - if (comment) { - commentCode += Blockly.JavaScript.prefixLines(comment, '// '); - } - } - } - } - } - var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); - var nextCode = Blockly.JavaScript.blockToCode(nextBlock); - return commentCode + code + nextCode; -}; diff --git a/generators/javascript/colour.js b/generators/javascript/colour.js deleted file mode 100644 index 205bbf2939..0000000000 --- a/generators/javascript/colour.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating JavaScript for colour blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.colour'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['colour_picker'] = function(block) { - // Colour picker. - var code = '\'' + block.getFieldValue('COLOUR') + '\''; - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['colour_random'] = function(block) { - // Generate a random colour. - var functionName = Blockly.JavaScript.provideFunction_( - 'colour_random', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' var num = Math.floor(Math.random() * Math.pow(2, 24));', - ' return \'#\' + (\'00000\' + num.toString(16)).substr(-6);', - '}']); - var code = functionName + '()'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['colour_rgb'] = function(block) { - // Compose a colour from RGB components expressed as percentages. - var red = Blockly.JavaScript.valueToCode(block, 'RED', - Blockly.JavaScript.ORDER_COMMA) || 0; - var green = Blockly.JavaScript.valueToCode(block, 'GREEN', - Blockly.JavaScript.ORDER_COMMA) || 0; - var blue = Blockly.JavaScript.valueToCode(block, 'BLUE', - Blockly.JavaScript.ORDER_COMMA) || 0; - var functionName = Blockly.JavaScript.provideFunction_( - 'colour_rgb', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(r, g, b) {', - ' r = Math.max(Math.min(Number(r), 100), 0) * 2.55;', - ' g = Math.max(Math.min(Number(g), 100), 0) * 2.55;', - ' b = Math.max(Math.min(Number(b), 100), 0) * 2.55;', - ' r = (\'0\' + (Math.round(r) || 0).toString(16)).slice(-2);', - ' g = (\'0\' + (Math.round(g) || 0).toString(16)).slice(-2);', - ' b = (\'0\' + (Math.round(b) || 0).toString(16)).slice(-2);', - ' return \'#\' + r + g + b;', - '}']); - var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['colour_blend'] = function(block) { - // Blend two colours together. - var c1 = Blockly.JavaScript.valueToCode(block, 'COLOUR1', - Blockly.JavaScript.ORDER_COMMA) || '\'#000000\''; - var c2 = Blockly.JavaScript.valueToCode(block, 'COLOUR2', - Blockly.JavaScript.ORDER_COMMA) || '\'#000000\''; - var ratio = Blockly.JavaScript.valueToCode(block, 'RATIO', - Blockly.JavaScript.ORDER_COMMA) || 0.5; - var functionName = Blockly.JavaScript.provideFunction_( - 'colour_blend', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(c1, c2, ratio) {', - ' ratio = Math.max(Math.min(Number(ratio), 1), 0);', - ' var r1 = parseInt(c1.substring(1, 3), 16);', - ' var g1 = parseInt(c1.substring(3, 5), 16);', - ' var b1 = parseInt(c1.substring(5, 7), 16);', - ' var r2 = parseInt(c2.substring(1, 3), 16);', - ' var g2 = parseInt(c2.substring(3, 5), 16);', - ' var b2 = parseInt(c2.substring(5, 7), 16);', - ' var r = Math.round(r1 * (1 - ratio) + r2 * ratio);', - ' var g = Math.round(g1 * (1 - ratio) + g2 * ratio);', - ' var b = Math.round(b1 * (1 - ratio) + b2 * ratio);', - ' r = (\'0\' + (r || 0).toString(16)).slice(-2);', - ' g = (\'0\' + (g || 0).toString(16)).slice(-2);', - ' b = (\'0\' + (b || 0).toString(16)).slice(-2);', - ' return \'#\' + r + g + b;', - '}']); - var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; diff --git a/generators/javascript/lists.js b/generators/javascript/lists.js deleted file mode 100644 index a309a28ea1..0000000000 --- a/generators/javascript/lists.js +++ /dev/null @@ -1,324 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating JavaScript for list blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.lists'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['lists_create_empty'] = function(block) { - // Create an empty list. - return ['[]', Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['lists_create_with'] = function(block) { - // Create a list with any number of elements of any type. - var code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.JavaScript.valueToCode(block, 'ADD' + n, - Blockly.JavaScript.ORDER_COMMA) || 'null'; - } - code = '[' + code.join(', ') + ']'; - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['lists_repeat'] = function(block) { - // Create a list with one element repeated. - var functionName = Blockly.JavaScript.provideFunction_( - 'lists_repeat', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(value, n) {', - ' var array = [];', - ' for (var i = 0; i < n; i++) {', - ' array[i] = value;', - ' }', - ' return array;', - '}']); - var argument0 = Blockly.JavaScript.valueToCode(block, 'ITEM', - Blockly.JavaScript.ORDER_COMMA) || 'null'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'NUM', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['lists_length'] = function(block) { - // String or array length. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_FUNCTION_CALL) || '[]'; - return [argument0 + '.length', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.JavaScript['lists_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - return ['!' + argument0 + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT]; -}; - -Blockly.JavaScript['lists_indexOf'] = function(block) { - // Find an item in the list. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.JavaScript.valueToCode(block, 'FIND', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - var argument1 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.JavaScript['lists_getIndex'] = function(block) { - // Get element at index. - // Note: Until January 2013 this block did not have MODE or WHERE inputs. - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.JavaScript.valueToCode(block, 'AT', - Blockly.JavaScript.ORDER_UNARY_NEGATION) || '1'; - var list = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - - if (where == 'FIRST') { - if (mode == 'GET') { - var code = list + '[0]'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.shift()'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'REMOVE') { - return list + '.shift();\n'; - } - } else if (where == 'LAST') { - if (mode == 'GET') { - var code = list + '.slice(-1)[0]'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.pop()'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'REMOVE') { - return list + '.pop();\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'GET') { - var code = list + '[' + at + ']'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; - } else if (mode == 'GET_REMOVE') { - var code = list + '.splice(' + at + ', 1)[0]'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return list + '.splice(' + at + ', 1);\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'GET') { - var code = list + '.slice(-' + at + ')[0]'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { - var functionName = Blockly.JavaScript.provideFunction_( - 'lists_remove_from_end', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(list, x) {', - ' x = list.length - x;', - ' return list.splice(x, 1)[0];', - '}']); - code = functionName + '(' + list + ', ' + at + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - } else if (where == 'RANDOM') { - var functionName = Blockly.JavaScript.provideFunction_( - 'lists_get_random_item', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(list, remove) {', - ' var x = Math.floor(Math.random() * list.length);', - ' if (remove) {', - ' return list.splice(x, 1)[0];', - ' } else {', - ' return list[x];', - ' }', - '}']); - code = functionName + '(' + list + ', ' + (mode != 'GET') + ')'; - if (mode == 'GET' || mode == 'GET_REMOVE') { - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - throw 'Unhandled combination (lists_getIndex).'; -}; - -Blockly.JavaScript['lists_setIndex'] = function(block) { - // Set element at index. - // Note: Until February 2013 this block did not have MODE or WHERE inputs. - var list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.JavaScript.valueToCode(block, 'AT', - Blockly.JavaScript.ORDER_NONE) || '1'; - var value = Blockly.JavaScript.valueToCode(block, 'TO', - Blockly.JavaScript.ORDER_ASSIGNMENT) || 'null'; - // Cache non-trivial values to variables to prevent repeated look-ups. - // Closure, which accesses and modifies 'list'. - function cacheList() { - if (list.match(/^\w+$/)) { - return ''; - } - var listVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'tmp_list', Blockly.Variables.NAME_TYPE); - var code = 'var ' + listVar + ' = ' + list + ';\n'; - list = listVar; - return code; - } - if (where == 'FIRST') { - if (mode == 'SET') { - return list + '[0] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return list + '.unshift(' + value + ');\n'; - } - } else if (where == 'LAST') { - if (mode == 'SET') { - var code = cacheList(); - code += list + '[' + list + '.length - 1] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - return list + '.push(' + value + ');\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'SET') { - return list + '[' + at + '] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return list + '.splice(' + at + ', 0, ' + value + ');\n'; - } - } else if (where == 'FROM_END') { - var code = cacheList(); - if (mode == 'SET') { - code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.splice(' + list + '.length - ' + at + ', 0, ' + value + - ');\n'; - return code; - } - } else if (where == 'RANDOM') { - var code = cacheList(); - var xVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'tmp_x', Blockly.Variables.NAME_TYPE); - code += 'var ' + xVar + ' = Math.floor(Math.random() * ' + list + - '.length);\n'; - if (mode == 'SET') { - code += list + '[' + xVar + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.splice(' + xVar + ', 0, ' + value + ');\n'; - return code; - } - } - throw 'Unhandled combination (lists_setIndex).'; -}; - -Blockly.JavaScript['lists_getSublist'] = function(block) { - // Get sublist. - var list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.JavaScript.valueToCode(block, 'AT1', - Blockly.JavaScript.ORDER_NONE) || '1'; - var at2 = Blockly.JavaScript.valueToCode(block, 'AT2', - Blockly.JavaScript.ORDER_NONE) || '1'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = list + '.concat()'; - } else { - var functionName = Blockly.JavaScript.provideFunction_( - 'lists_get_sublist', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(list, where1, at1, where2, at2) {', - ' function getAt(where, at) {', - ' if (where == \'FROM_START\') {', - ' at--;', - ' } else if (where == \'FROM_END\') {', - ' at = list.length - at;', - ' } else if (where == \'FIRST\') {', - ' at = 0;', - ' } else if (where == \'LAST\') {', - ' at = list.length - 1;', - ' } else {', - ' throw \'Unhandled option (lists_getSublist).\';', - ' }', - ' return at;', - ' }', - ' at1 = getAt(where1, at1);', - ' at2 = getAt(where2, at2) + 1;', - ' return list.slice(at1, at2);', - '}']); - var code = functionName + '(' + list + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['lists_split'] = function(block) { - // Block for splitting text into a list, or joining a list into text. - var value_input = Blockly.JavaScript.valueToCode(block, 'INPUT', - Blockly.JavaScript.ORDER_MEMBER); - var value_delim = Blockly.JavaScript.valueToCode(block, 'DELIM', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - var mode = block.getFieldValue('MODE'); - if (mode == 'SPLIT') { - if (!value_input) { - value_input = '\'\''; - } - var functionName = 'split'; - } else if (mode == 'JOIN') { - if (!value_input) { - value_input = '[]'; - } - var functionName = 'join'; - } else { - throw 'Unknown mode: ' + mode; - } - var code = value_input + '.' + functionName + '(' + value_delim + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; diff --git a/generators/javascript/logic.js b/generators/javascript/logic.js deleted file mode 100644 index 07ee35b6cf..0000000000 --- a/generators/javascript/logic.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating JavaScript for logic blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.logic'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['controls_if'] = function(block) { - // If/elseif/else condition. - var n = 0; - var argument = Blockly.JavaScript.valueToCode(block, 'IF' + n, - Blockly.JavaScript.ORDER_NONE) || 'false'; - var branch = Blockly.JavaScript.statementToCode(block, 'DO' + n); - var code = 'if (' + argument + ') {\n' + branch + '}'; - for (n = 1; n <= block.elseifCount_; n++) { - argument = Blockly.JavaScript.valueToCode(block, 'IF' + n, - Blockly.JavaScript.ORDER_NONE) || 'false'; - branch = Blockly.JavaScript.statementToCode(block, 'DO' + n); - code += ' else if (' + argument + ') {\n' + branch + '}'; - } - if (block.elseCount_) { - branch = Blockly.JavaScript.statementToCode(block, 'ELSE'); - code += ' else {\n' + branch + '}'; - } - return code + '\n'; -}; - -Blockly.JavaScript['logic_compare'] = function(block) { - // Comparison operator. - var OPERATORS = { - 'EQ': '==', - 'NEQ': '!=', - 'LT': '<', - 'LTE': '<=', - 'GT': '>', - 'GTE': '>=' - }; - var operator = OPERATORS[block.getFieldValue('OP')]; - var order = (operator == '==' || operator == '!=') ? - Blockly.JavaScript.ORDER_EQUALITY : Blockly.JavaScript.ORDER_RELATIONAL; - var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order) || '0'; - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.JavaScript['logic_operation'] = function(block) { - // Operations 'and', 'or'. - var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; - var order = (operator == '&&') ? Blockly.JavaScript.ORDER_LOGICAL_AND : - Blockly.JavaScript.ORDER_LOGICAL_OR; - var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order); - var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order); - if (!argument0 && !argument1) { - // If there are no arguments, then the return value is false. - argument0 = 'false'; - argument1 = 'false'; - } else { - // Single missing arguments have no effect on the return value. - var defaultArgument = (operator == '&&') ? 'true' : 'false'; - if (!argument0) { - argument0 = defaultArgument; - } - if (!argument1) { - argument1 = defaultArgument; - } - } - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.JavaScript['logic_negate'] = function(block) { - // Negation. - var order = Blockly.JavaScript.ORDER_LOGICAL_NOT; - var argument0 = Blockly.JavaScript.valueToCode(block, 'BOOL', order) || - 'true'; - var code = '!' + argument0; - return [code, order]; -}; - -Blockly.JavaScript['logic_boolean'] = function(block) { - // Boolean values true and false. - var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['logic_null'] = function(block) { - // Null data type. - return ['null', Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['logic_ternary'] = function(block) { - // Ternary operator. - var value_if = Blockly.JavaScript.valueToCode(block, 'IF', - Blockly.JavaScript.ORDER_CONDITIONAL) || 'false'; - var value_then = Blockly.JavaScript.valueToCode(block, 'THEN', - Blockly.JavaScript.ORDER_CONDITIONAL) || 'null'; - var value_else = Blockly.JavaScript.valueToCode(block, 'ELSE', - Blockly.JavaScript.ORDER_CONDITIONAL) || 'null'; - var code = value_if + ' ? ' + value_then + ' : ' + value_else; - return [code, Blockly.JavaScript.ORDER_CONDITIONAL]; -}; diff --git a/generators/javascript/loops.js b/generators/javascript/loops.js deleted file mode 100644 index 944580403a..0000000000 --- a/generators/javascript/loops.js +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating JavaScript for loop blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.loops'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['controls_repeat_ext'] = function(block) { - // Repeat n times. - if (block.getField('TIMES')) { - // Internal number. - var repeats = String(Number(block.getFieldValue('TIMES'))); - } else { - // External number. - var repeats = Blockly.JavaScript.valueToCode(block, 'TIMES', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; - } - var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); - var code = ''; - var loopVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var endVar = repeats; - if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { - var endVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'repeat_end', Blockly.Variables.NAME_TYPE); - code += 'var ' + endVar + ' = ' + repeats + ';\n'; - } - code += 'for (var ' + loopVar + ' = 0; ' + - loopVar + ' < ' + endVar + '; ' + - loopVar + '++) {\n' + - branch + '}\n'; - return code; -}; - -Blockly.JavaScript['controls_repeat'] = - Blockly.JavaScript['controls_repeat_ext']; - -Blockly.JavaScript['controls_whileUntil'] = function(block) { - // Do while/until loop. - var until = block.getFieldValue('MODE') == 'UNTIL'; - var argument0 = Blockly.JavaScript.valueToCode(block, 'BOOL', - until ? Blockly.JavaScript.ORDER_LOGICAL_NOT : - Blockly.JavaScript.ORDER_NONE) || 'false'; - var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); - if (until) { - argument0 = '!' + argument0; - } - return 'while (' + argument0 + ') {\n' + branch + '}\n'; -}; - -Blockly.JavaScript['controls_for'] = function(block) { - // For loop. - var variable0 = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.JavaScript.valueToCode(block, 'FROM', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'TO', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; - var increment = Blockly.JavaScript.valueToCode(block, 'BY', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '1'; - var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); - var code; - if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && - Blockly.isNumber(increment)) { - // All arguments are simple numbers. - var up = parseFloat(argument0) <= parseFloat(argument1); - code = 'for (' + variable0 + ' = ' + argument0 + '; ' + - variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + - variable0; - var step = Math.abs(parseFloat(increment)); - if (step == 1) { - code += up ? '++' : '--'; - } else { - code += (up ? ' += ' : ' -= ') + step; - } - code += ') {\n' + branch + '}\n'; - } else { - code = ''; - // Cache non-trivial values to variables to prevent repeated look-ups. - var startVar = argument0; - if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { - startVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_start', Blockly.Variables.NAME_TYPE); - code += 'var ' + startVar + ' = ' + argument0 + ';\n'; - } - var endVar = argument1; - if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { - var endVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_end', Blockly.Variables.NAME_TYPE); - code += 'var ' + endVar + ' = ' + argument1 + ';\n'; - } - // Determine loop direction at start, in case one of the bounds - // changes during loop execution. - var incVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_inc', Blockly.Variables.NAME_TYPE); - code += 'var ' + incVar + ' = '; - if (Blockly.isNumber(increment)) { - code += Math.abs(increment) + ';\n'; - } else { - code += 'Math.abs(' + increment + ');\n'; - } - code += 'if (' + startVar + ' > ' + endVar + ') {\n'; - code += Blockly.JavaScript.INDENT + incVar + ' = -' + incVar + ';\n'; - code += '}\n'; - code += 'for (' + variable0 + ' = ' + startVar + ';\n' + - ' ' + incVar + ' >= 0 ? ' + - variable0 + ' <= ' + endVar + ' : ' + - variable0 + ' >= ' + endVar + ';\n' + - ' ' + variable0 + ' += ' + incVar + ') {\n' + - branch + '}\n'; - } - return code; -}; - -Blockly.JavaScript['controls_forEach'] = function(block) { - // For each loop. - var variable0 = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '[]'; - var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); - var code = ''; - // Cache non-trivial values to variables to prevent repeated look-ups. - var listVar = argument0; - if (!argument0.match(/^\w+$/)) { - listVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_list', Blockly.Variables.NAME_TYPE); - code += 'var ' + listVar + ' = ' + argument0 + ';\n'; - } - var indexVar = Blockly.JavaScript.variableDB_.getDistinctName( - variable0 + '_index', Blockly.Variables.NAME_TYPE); - branch = Blockly.JavaScript.INDENT + variable0 + ' = ' + - listVar + '[' + indexVar + '];\n' + branch; - code += 'for (var ' + indexVar + ' in ' + listVar + ') {\n' + branch + '}\n'; - return code; -}; - -Blockly.JavaScript['controls_flow_statements'] = function(block) { - // Flow statements: continue, break. - switch (block.getFieldValue('FLOW')) { - case 'BREAK': - return 'break;\n'; - case 'CONTINUE': - return 'continue;\n'; - } - throw 'Unknown flow statement.'; -}; diff --git a/generators/javascript/math.js b/generators/javascript/math.js deleted file mode 100644 index f0ecc62559..0000000000 --- a/generators/javascript/math.js +++ /dev/null @@ -1,411 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating JavaScript for math blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.math'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['math_number'] = function(block) { - // Numeric value. - var code = parseFloat(block.getFieldValue('NUM')); - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['math_arithmetic'] = function(block) { - // Basic arithmetic operators, and power. - var OPERATORS = { - 'ADD': [' + ', Blockly.JavaScript.ORDER_ADDITION], - 'MINUS': [' - ', Blockly.JavaScript.ORDER_SUBTRACTION], - 'MULTIPLY': [' * ', Blockly.JavaScript.ORDER_MULTIPLICATION], - 'DIVIDE': [' / ', Blockly.JavaScript.ORDER_DIVISION], - 'POWER': [null, Blockly.JavaScript.ORDER_COMMA] // Handle power separately. - }; - var tuple = OPERATORS[block.getFieldValue('OP')]; - var operator = tuple[0]; - var order = tuple[1]; - var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order) || '0'; - var code; - // Power in JavaScript requires a special case since it has no operator. - if (!operator) { - code = 'Math.pow(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - code = argument0 + operator + argument1; - return [code, order]; -}; - -Blockly.JavaScript['math_single'] = function(block) { - // Math operators with single operand. - var operator = block.getFieldValue('OP'); - var code; - var arg; - if (operator == 'NEG') { - // Negation is a special case given its different operator precedence. - arg = Blockly.JavaScript.valueToCode(block, 'NUM', - Blockly.JavaScript.ORDER_UNARY_NEGATION) || '0'; - if (arg[0] == '-') { - // --3 is not legal in JS. - arg = ' ' + arg; - } - code = '-' + arg; - return [code, Blockly.JavaScript.ORDER_UNARY_NEGATION]; - } - if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.JavaScript.valueToCode(block, 'NUM', - Blockly.JavaScript.ORDER_DIVISION) || '0'; - } else { - arg = Blockly.JavaScript.valueToCode(block, 'NUM', - Blockly.JavaScript.ORDER_NONE) || '0'; - } - // First, handle cases which generate values that don't need parentheses - // wrapping the code. - switch (operator) { - case 'ABS': - code = 'Math.abs(' + arg + ')'; - break; - case 'ROOT': - code = 'Math.sqrt(' + arg + ')'; - break; - case 'LN': - code = 'Math.log(' + arg + ')'; - break; - case 'EXP': - code = 'Math.exp(' + arg + ')'; - break; - case 'POW10': - code = 'Math.pow(10,' + arg + ')'; - break; - case 'ROUND': - code = 'Math.round(' + arg + ')'; - break; - case 'ROUNDUP': - code = 'Math.ceil(' + arg + ')'; - break; - case 'ROUNDDOWN': - code = 'Math.floor(' + arg + ')'; - break; - case 'SIN': - code = 'Math.sin(' + arg + ' / 180 * Math.PI)'; - break; - case 'COS': - code = 'Math.cos(' + arg + ' / 180 * Math.PI)'; - break; - case 'TAN': - code = 'Math.tan(' + arg + ' / 180 * Math.PI)'; - break; - } - if (code) { - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - // Second, handle cases which generate values that may need parentheses - // wrapping the code. - switch (operator) { - case 'LOG10': - code = 'Math.log(' + arg + ') / Math.log(10)'; - break; - case 'ASIN': - code = 'Math.asin(' + arg + ') / Math.PI * 180'; - break; - case 'ACOS': - code = 'Math.acos(' + arg + ') / Math.PI * 180'; - break; - case 'ATAN': - code = 'Math.atan(' + arg + ') / Math.PI * 180'; - break; - default: - throw 'Unknown math operator: ' + operator; - } - return [code, Blockly.JavaScript.ORDER_DIVISION]; -}; - -Blockly.JavaScript['math_constant'] = function(block) { - // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - var CONSTANTS = { - 'PI': ['Math.PI', Blockly.JavaScript.ORDER_MEMBER], - 'E': ['Math.E', Blockly.JavaScript.ORDER_MEMBER], - 'GOLDEN_RATIO': - ['(1 + Math.sqrt(5)) / 2', Blockly.JavaScript.ORDER_DIVISION], - 'SQRT2': ['Math.SQRT2', Blockly.JavaScript.ORDER_MEMBER], - 'SQRT1_2': ['Math.SQRT1_2', Blockly.JavaScript.ORDER_MEMBER], - 'INFINITY': ['Infinity', Blockly.JavaScript.ORDER_ATOMIC] - }; - return CONSTANTS[block.getFieldValue('CONSTANT')]; -}; - -Blockly.JavaScript['math_number_property'] = function(block) { - // Check if a number is even, odd, prime, whole, positive, or negative - // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.JavaScript.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.JavaScript.ORDER_MODULUS) || '0'; - var dropdown_property = block.getFieldValue('PROPERTY'); - var code; - if (dropdown_property == 'PRIME') { - // Prime is a special case as it is not a one-liner test. - var functionName = Blockly.JavaScript.provideFunction_( - 'math_isPrime', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '(n) {', - ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', - ' if (n == 2 || n == 3) {', - ' return true;', - ' }', - ' // False if n is NaN, negative, is 1, or not whole.', - ' // And false if n is divisible by 2 or 3.', - ' if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' + - ' n % 3 == 0) {', - ' return false;', - ' }', - ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', - ' for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {', - ' if (n % (x - 1) == 0 || n % (x + 1) == 0) {', - ' return false;', - ' }', - ' }', - ' return true;', - '}']); - code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - switch (dropdown_property) { - case 'EVEN': - code = number_to_check + ' % 2 == 0'; - break; - case 'ODD': - code = number_to_check + ' % 2 == 1'; - break; - case 'WHOLE': - code = number_to_check + ' % 1 == 0'; - break; - case 'POSITIVE': - code = number_to_check + ' > 0'; - break; - case 'NEGATIVE': - code = number_to_check + ' < 0'; - break; - case 'DIVISIBLE_BY': - var divisor = Blockly.JavaScript.valueToCode(block, 'DIVISOR', - Blockly.JavaScript.ORDER_MODULUS) || '0'; - code = number_to_check + ' % ' + divisor + ' == 0'; - break; - } - return [code, Blockly.JavaScript.ORDER_EQUALITY]; -}; - -Blockly.JavaScript['math_change'] = function(block) { - // Add to a variable in place. - var argument0 = Blockly.JavaScript.valueToCode(block, 'DELTA', - Blockly.JavaScript.ORDER_ADDITION) || '0'; - var varName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - return varName + ' = (typeof ' + varName + ' == \'number\' ? ' + varName + - ' : 0) + ' + argument0 + ';\n'; -}; - -// Rounding functions have a single operand. -Blockly.JavaScript['math_round'] = Blockly.JavaScript['math_single']; -// Trigonometry functions have a single operand. -Blockly.JavaScript['math_trig'] = Blockly.JavaScript['math_single']; - -Blockly.JavaScript['math_on_list'] = function(block) { - // Math functions for lists. - var func = block.getFieldValue('OP'); - var list, code; - switch (func) { - case 'SUM': - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_MEMBER) || '[]'; - code = list + '.reduce(function(x, y) {return x + y;})'; - break; - case 'MIN': - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_COMMA) || '[]'; - code = 'Math.min.apply(null, ' + list + ')'; - break; - case 'MAX': - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_COMMA) || '[]'; - code = 'Math.max.apply(null, ' + list + ')'; - break; - case 'AVERAGE': - // math_median([null,null,1,3]) == 2.0. - var functionName = Blockly.JavaScript.provideFunction_( - 'math_mean', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(myList) {', - ' return myList.reduce(function(x, y) {return x + y;}) / ' + - 'myList.length;', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'MEDIAN': - // math_median([null,null,1,3]) == 2.0. - var functionName = Blockly.JavaScript.provideFunction_( - 'math_median', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(myList) {', - ' var localList = myList.filter(function (x) ' + - '{return typeof x == \'number\';});', - ' if (!localList.length) return null;', - ' localList.sort(function(a, b) {return b - a;});', - ' if (localList.length % 2 == 0) {', - ' return (localList[localList.length / 2 - 1] + ' + - 'localList[localList.length / 2]) / 2;', - ' } else {', - ' return localList[(localList.length - 1) / 2];', - ' }', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'MODE': - // As a list of numbers can contain more than one mode, - // the returned result is provided as an array. - // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. - var functionName = Blockly.JavaScript.provideFunction_( - 'math_modes', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(values) {', - ' var modes = [];', - ' var counts = [];', - ' var maxCount = 0;', - ' for (var i = 0; i < values.length; i++) {', - ' var value = values[i];', - ' var found = false;', - ' var thisCount;', - ' for (var j = 0; j < counts.length; j++) {', - ' if (counts[j][0] === value) {', - ' thisCount = ++counts[j][1];', - ' found = true;', - ' break;', - ' }', - ' }', - ' if (!found) {', - ' counts.push([value, 1]);', - ' thisCount = 1;', - ' }', - ' maxCount = Math.max(thisCount, maxCount);', - ' }', - ' for (var j = 0; j < counts.length; j++) {', - ' if (counts[j][1] == maxCount) {', - ' modes.push(counts[j][0]);', - ' }', - ' }', - ' return modes;', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'STD_DEV': - var functionName = Blockly.JavaScript.provideFunction_( - 'math_standard_deviation', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(numbers) {', - ' var n = numbers.length;', - ' if (!n) return null;', - ' var mean = numbers.reduce(function(x, y) {return x + y;}) / n;', - ' var variance = 0;', - ' for (var j = 0; j < n; j++) {', - ' variance += Math.pow(numbers[j] - mean, 2);', - ' }', - ' variance = variance / n;', - ' return Math.sqrt(variance);', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'RANDOM': - var functionName = Blockly.JavaScript.provideFunction_( - 'math_random_list', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(list) {', - ' var x = Math.floor(Math.random() * list.length);', - ' return list[x];', - '}']); - list = Blockly.JavaScript.valueToCode(block, 'LIST', - Blockly.JavaScript.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - default: - throw 'Unknown operator: ' + func; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['math_modulo'] = function(block) { - // Remainder computation. - var argument0 = Blockly.JavaScript.valueToCode(block, 'DIVIDEND', - Blockly.JavaScript.ORDER_MODULUS) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'DIVISOR', - Blockly.JavaScript.ORDER_MODULUS) || '0'; - var code = argument0 + ' % ' + argument1; - return [code, Blockly.JavaScript.ORDER_MODULUS]; -}; - -Blockly.JavaScript['math_constrain'] = function(block) { - // Constrain a number between two limits. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'LOW', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var argument2 = Blockly.JavaScript.valueToCode(block, 'HIGH', - Blockly.JavaScript.ORDER_COMMA) || 'Infinity'; - var code = 'Math.min(Math.max(' + argument0 + ', ' + argument1 + '), ' + - argument2 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['math_random_int'] = function(block) { - // Random integer between [X] and [Y]. - var argument0 = Blockly.JavaScript.valueToCode(block, 'FROM', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var argument1 = Blockly.JavaScript.valueToCode(block, 'TO', - Blockly.JavaScript.ORDER_COMMA) || '0'; - var functionName = Blockly.JavaScript.provideFunction_( - 'math_random_int', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(a, b) {', - ' if (a > b) {', - ' // Swap a and b to ensure a is smaller.', - ' var c = a;', - ' a = b;', - ' b = c;', - ' }', - ' return Math.floor(Math.random() * (b - a + 1) + a);', - '}']); - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['math_random_float'] = function(block) { - // Random fraction between 0 and 1. - return ['Math.random()', Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; diff --git a/generators/javascript/procedures.js b/generators/javascript/procedures.js deleted file mode 100644 index f2ca15ac15..0000000000 --- a/generators/javascript/procedures.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating JavaScript for procedure blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.procedures'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['procedures_defreturn'] = function(block) { - // Define a procedure with a return value. - var funcName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var branch = Blockly.JavaScript.statementToCode(block, 'STACK'); - if (Blockly.JavaScript.STATEMENT_PREFIX) { - branch = Blockly.JavaScript.prefixLines( - Blockly.JavaScript.STATEMENT_PREFIX.replace(/%1/g, - '\'' + block.id + '\''), Blockly.JavaScript.INDENT) + branch; - } - if (Blockly.JavaScript.INFINITE_LOOP_TRAP) { - branch = Blockly.JavaScript.INFINITE_LOOP_TRAP.replace(/%1/g, - '\'' + block.id + '\'') + branch; - } - var returnValue = Blockly.JavaScript.valueToCode(block, 'RETURN', - Blockly.JavaScript.ORDER_NONE) || ''; - if (returnValue) { - returnValue = ' return ' + returnValue + ';\n'; - } - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.JavaScript.variableDB_.getName(block.arguments_[x], - Blockly.Variables.NAME_TYPE); - } - var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + - branch + returnValue + '}'; - code = Blockly.JavaScript.scrub_(block, code); - Blockly.JavaScript.definitions_[funcName] = code; - return null; -}; - -// Defining a procedure without a return value uses the same generator as -// a procedure with a return value. -Blockly.JavaScript['procedures_defnoreturn'] = - Blockly.JavaScript['procedures_defreturn']; - -Blockly.JavaScript['procedures_callreturn'] = function(block) { - // Call a procedure with a return value. - var funcName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.JavaScript.valueToCode(block, 'ARG' + x, - Blockly.JavaScript.ORDER_COMMA) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['procedures_callnoreturn'] = function(block) { - // Call a procedure with no return value. - var funcName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.JavaScript.valueToCode(block, 'ARG' + x, - Blockly.JavaScript.ORDER_COMMA) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ');\n'; - return code; -}; - -Blockly.JavaScript['procedures_ifreturn'] = function(block) { - // Conditionally return value from a procedure. - var condition = Blockly.JavaScript.valueToCode(block, 'CONDITION', - Blockly.JavaScript.ORDER_NONE) || 'false'; - var code = 'if (' + condition + ') {\n'; - if (block.hasReturnValue_) { - var value = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_NONE) || 'null'; - code += ' return ' + value + ';\n'; - } else { - code += ' return;\n'; - } - code += '}\n'; - return code; -}; diff --git a/generators/javascript/text.js b/generators/javascript/text.js deleted file mode 100644 index 481aed48ae..0000000000 --- a/generators/javascript/text.js +++ /dev/null @@ -1,254 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating JavaScript for text blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.texts'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['text'] = function(block) { - // Text value. - var code = Blockly.JavaScript.quote_(block.getFieldValue('TEXT')); - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['text_join'] = function(block) { - // Create a string made up of any number of elements of any type. - var code; - if (block.itemCount_ == 0) { - return ['\'\'', Blockly.JavaScript.ORDER_ATOMIC]; - } else if (block.itemCount_ == 1) { - var argument0 = Blockly.JavaScript.valueToCode(block, 'ADD0', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - code = 'String(' + argument0 + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } else if (block.itemCount_ == 2) { - var argument0 = Blockly.JavaScript.valueToCode(block, 'ADD0', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - var argument1 = Blockly.JavaScript.valueToCode(block, 'ADD1', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - code = 'String(' + argument0 + ') + String(' + argument1 + ')'; - return [code, Blockly.JavaScript.ORDER_ADDITION]; - } else { - code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.JavaScript.valueToCode(block, 'ADD' + n, - Blockly.JavaScript.ORDER_COMMA) || '\'\''; - } - code = '[' + code.join(',') + '].join(\'\')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } -}; - -Blockly.JavaScript['text_append'] = function(block) { - // Append to a variable in place. - var varName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - return varName + ' = String(' + varName + ') + String(' + argument0 + ');\n'; -}; - -Blockly.JavaScript['text_length'] = function(block) { - // String or array length. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\''; - return [argument0 + '.length', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.JavaScript['text_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - return ['!' + argument0 + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT]; -}; - -Blockly.JavaScript['text_indexOf'] = function(block) { - // Search the text for a substring. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.JavaScript.valueToCode(block, 'FIND', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - var argument1 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.JavaScript['text_charAt'] = function(block) { - // Get letter at index. - // Note: Until January 2013 this block did not have the WHERE input. - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.JavaScript.valueToCode(block, 'AT', - Blockly.JavaScript.ORDER_UNARY_NEGATION) || '1'; - var text = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - switch (where) { - case 'FIRST': - var code = text + '.charAt(0)'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - case 'LAST': - var code = text + '.slice(-1)'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - case 'FROM_START': - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - var code = text + '.charAt(' + at + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - case 'FROM_END': - var code = text + '.slice(-' + at + ').charAt(0)'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - case 'RANDOM': - var functionName = Blockly.JavaScript.provideFunction_( - 'text_random_letter', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(text) {', - ' var x = Math.floor(Math.random() * text.length);', - ' return text[x];', - '}']); - code = functionName + '(' + text + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - throw 'Unhandled option (text_charAt).'; -}; - -Blockly.JavaScript['text_getSubstring'] = function(block) { - // Get substring. - var text = Blockly.JavaScript.valueToCode(block, 'STRING', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.JavaScript.valueToCode(block, 'AT1', - Blockly.JavaScript.ORDER_NONE) || '1'; - var at2 = Blockly.JavaScript.valueToCode(block, 'AT2', - Blockly.JavaScript.ORDER_NONE) || '1'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = text; - } else { - var functionName = Blockly.JavaScript.provideFunction_( - 'text_get_substring', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(text, where1, at1, where2, at2) {', - ' function getAt(where, at) {', - ' if (where == \'FROM_START\') {', - ' at--;', - ' } else if (where == \'FROM_END\') {', - ' at = text.length - at;', - ' } else if (where == \'FIRST\') {', - ' at = 0;', - ' } else if (where == \'LAST\') {', - ' at = text.length - 1;', - ' } else {', - ' throw \'Unhandled option (text_getSubstring).\';', - ' }', - ' return at;', - ' }', - ' at1 = getAt(where1, at1);', - ' at2 = getAt(where2, at2) + 1;', - ' return text.slice(at1, at2);', - '}']); - var code = functionName + '(' + text + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['text_changeCase'] = function(block) { - // Change capitalization. - var OPERATORS = { - 'UPPERCASE': '.toUpperCase()', - 'LOWERCASE': '.toLowerCase()', - 'TITLECASE': null - }; - var operator = OPERATORS[block.getFieldValue('CASE')]; - var code; - if (operator) { - // Upper and lower case are functions built into JavaScript. - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - code = argument0 + operator; - } else { - // Title case is not a native JavaScript function. Define one. - var functionName = Blockly.JavaScript.provideFunction_( - 'text_toTitleCase', - [ 'function ' + - Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '(str) {', - ' return str.replace(/\\S+/g,', - ' function(txt) {return txt[0].toUpperCase() + ' + - 'txt.substring(1).toLowerCase();});', - '}']); - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - code = functionName + '(' + argument0 + ')'; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['text_trim'] = function(block) { - // Trim spaces. - var OPERATORS = { - 'LEFT': ".replace(/^[\\s\\xa0]+/, '')", - 'RIGHT': ".replace(/[\\s\\xa0]+$/, '')", - 'BOTH': '.trim()' - }; - var operator = OPERATORS[block.getFieldValue('MODE')]; - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_MEMBER) || '\'\''; - return [argument0 + operator, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - return 'window.alert(' + argument0 + ');\n'; -}; - -Blockly.JavaScript['text_prompt_ext'] = function(block) { - // Prompt function. - if (block.getField('TEXT')) { - // Internal message. - var msg = Blockly.JavaScript.quote_(block.getFieldValue('TEXT')); - } else { - // External message. - var msg = Blockly.JavaScript.valueToCode(block, 'TEXT', - Blockly.JavaScript.ORDER_NONE) || '\'\''; - } - var code = 'window.prompt(' + msg + ')'; - var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; - if (toNumber) { - code = 'parseFloat(' + code + ')'; - } - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; -}; - -Blockly.JavaScript['text_prompt'] = Blockly.JavaScript['text_prompt_ext']; diff --git a/generators/javascript/variables.js b/generators/javascript/variables.js deleted file mode 100644 index fe0135b12e..0000000000 --- a/generators/javascript/variables.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating JavaScript for variable blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.JavaScript.variables'); - -goog.require('Blockly.JavaScript'); - - -Blockly.JavaScript['variables_get'] = function(block) { - // Variable getter. - var code = Blockly.JavaScript.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; - -Blockly.JavaScript['variables_set'] = function(block) { - // Variable setter. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; - var varName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - return varName + ' = ' + argument0 + ';\n'; -}; diff --git a/generators/php.js b/generators/php.js deleted file mode 100644 index 85af77d5b7..0000000000 --- a/generators/php.js +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Helper functions for generating PHP for blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP'); - -goog.require('Blockly.Generator'); - - -/** - * PHP code generator. - * @type {!Blockly.Generator} - */ -Blockly.PHP = new Blockly.Generator('PHP'); - -/** - * List of illegal variable names. - * This is not intended to be a security feature. Blockly is 100% client-side, - * so bypassing this list is trivial. This is intended to prevent users from - * accidentally clobbering a built-in object or function. - * @private - */ -Blockly.PHP.addReservedWords( - // http://php.net/manual/en/reserved.keywords.php - '__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,clone,const,continue,declare,default,die,do,echo,else,elseif,empty,enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,final,for,foreach,function,global,goto,if,implements,include,include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,print,private,protected,public,require,require_once,return,static,switch,throw,trait,try,unset,use,var,while,xor,' + - // http://php.net/manual/en/reserved.constants.php - 'PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__'); - -/** - * Order of operation ENUMs. - * http://php.net/manual/en/language.operators.precedence.php - */ -Blockly.PHP.ORDER_ATOMIC = 0; // 0 "" ... -Blockly.PHP.ORDER_CLONE = 1; // clone -Blockly.PHP.ORDER_NEW = 1; // new -Blockly.PHP.ORDER_MEMBER = 2; // () -Blockly.PHP.ORDER_FUNCTION_CALL = 2; // () -Blockly.PHP.ORDER_INCREMENT = 3; // ++ -Blockly.PHP.ORDER_DECREMENT = 3; // -- -Blockly.PHP.ORDER_LOGICAL_NOT = 4; // ! -Blockly.PHP.ORDER_BITWISE_NOT = 4; // ~ -Blockly.PHP.ORDER_UNARY_PLUS = 4; // + -Blockly.PHP.ORDER_UNARY_NEGATION = 4; // - -Blockly.PHP.ORDER_MULTIPLICATION = 5; // * -Blockly.PHP.ORDER_DIVISION = 5; // / -Blockly.PHP.ORDER_MODULUS = 5; // % -Blockly.PHP.ORDER_ADDITION = 6; // + -Blockly.PHP.ORDER_SUBTRACTION = 6; // - -Blockly.PHP.ORDER_BITWISE_SHIFT = 7; // << >> >>> -Blockly.PHP.ORDER_RELATIONAL = 8; // < <= > >= -Blockly.PHP.ORDER_IN = 8; // in -Blockly.PHP.ORDER_INSTANCEOF = 8; // instanceof -Blockly.PHP.ORDER_EQUALITY = 9; // == != === !== -Blockly.PHP.ORDER_BITWISE_AND = 10; // & -Blockly.PHP.ORDER_BITWISE_XOR = 11; // ^ -Blockly.PHP.ORDER_BITWISE_OR = 12; // | -Blockly.PHP.ORDER_CONDITIONAL = 13; // ?: -Blockly.PHP.ORDER_ASSIGNMENT = 14; // = += -= *= /= %= <<= >>= ... -Blockly.PHP.ORDER_LOGICAL_AND = 15; // && -Blockly.PHP.ORDER_LOGICAL_OR = 16; // || -Blockly.PHP.ORDER_COMMA = 17; // , -Blockly.PHP.ORDER_NONE = 99; // (...) - -/** - * Initialise the database of variable names. - * @param {!Blockly.Workspace} workspace Workspace to generate code from. - */ -Blockly.PHP.init = function(workspace) { - // Create a dictionary of definitions to be printed before the code. - Blockly.PHP.definitions_ = Object.create(null); - // Create a dictionary mapping desired function names in definitions_ - // to actual function names (to avoid collisions with user functions). - Blockly.PHP.functionNames_ = Object.create(null); - - if (!Blockly.PHP.variableDB_) { - Blockly.PHP.variableDB_ = - new Blockly.Names(Blockly.PHP.RESERVED_WORDS_, '$'); - } else { - Blockly.PHP.variableDB_.reset(); - } - - var defvars = []; - var variables = Blockly.Variables.allVariables(workspace); - for (var i = 0; i < variables.length; i++) { - defvars[i] = Blockly.PHP.variableDB_.getName(variables[i], - Blockly.Variables.NAME_TYPE) + ';'; - } - Blockly.PHP.definitions_['variables'] = defvars.join('\n'); -}; - -/** - * Prepend the generated code with the variable definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.PHP.finish = function(code) { - // Convert the definitions dictionary into a list. - var definitions = []; - for (var name in Blockly.PHP.definitions_) { - definitions.push(Blockly.PHP.definitions_[name]); - } - // Clean up temporary data. - delete Blockly.PHP.definitions_; - delete Blockly.PHP.functionNames_; - Blockly.PHP.variableDB_.reset(); - return definitions.join('\n\n') + '\n\n\n' + code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. A trailing semicolon is needed to make this legal. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.PHP.scrubNakedValue = function(line) { - return line + ';\n'; -}; - -/** - * Encode a string as a properly escaped PHP string, complete with - * quotes. - * @param {string} string Text to encode. - * @return {string} PHP string. - * @private - */ -Blockly.PHP.quote_ = function(string) { - // TODO: This is a quick hack. Replace with goog.string.quote - string = string.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\\n') - .replace(/'/g, '\\\''); - return '\'' + string + '\''; -}; - -/** - * Common tasks for generating PHP from blocks. - * Handles comments for the specified block and any connected value blocks. - * Calls any statements following this block. - * @param {!Blockly.Block} block The current block. - * @param {string} code The PHP code created for this block. - * @return {string} PHP code with comments and subsequent blocks added. - * @private - */ -Blockly.PHP.scrub_ = function(block, code) { - var commentCode = ''; - // Only collect comments for blocks that aren't inline. - if (!block.outputConnection || !block.outputConnection.targetConnection) { - // Collect comment for this block. - var comment = block.getCommentText(); - if (comment) { - commentCode += Blockly.PHP.prefixLines(comment, '// ') + '\n'; - } - // Collect comments for all value arguments. - // Don't collect comments for nested statements. - for (var x = 0; x < block.inputList.length; x++) { - if (block.inputList[x].type == Blockly.INPUT_VALUE) { - var childBlock = block.inputList[x].connection.targetBlock(); - if (childBlock) { - var comment = Blockly.PHP.allNestedComments(childBlock); - if (comment) { - commentCode += Blockly.PHP.prefixLines(comment, '// '); - } - } - } - } - } - var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); - var nextCode = Blockly.PHP.blockToCode(nextBlock); - return commentCode + code + nextCode; -}; diff --git a/generators/php/colour.js b/generators/php/colour.js deleted file mode 100644 index bc1789c359..0000000000 --- a/generators/php/colour.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Generating PHP for colour blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.colour'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['colour_picker'] = function(block) { - // Colour picker. - var code = '\'' + block.getFieldValue('COLOUR') + '\''; - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['colour_random'] = function(block) { - // Generate a random colour. - var functionName = Blockly.PHP.provideFunction_( - 'colour_random', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' return \'#\' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), ' + - '6, \'0\', STR_PAD_LEFT);', - '}']); - var code = functionName + '()'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['colour_rgb'] = function(block) { - // Compose a colour from RGB components expressed as percentages. - var red = Blockly.PHP.valueToCode(block, 'RED', - Blockly.PHP.ORDER_COMMA) || 0; - var green = Blockly.PHP.valueToCode(block, 'GREEN', - Blockly.PHP.ORDER_COMMA) || 0; - var blue = Blockly.PHP.valueToCode(block, 'BLUE', - Blockly.PHP.ORDER_COMMA) || 0; - var functionName = Blockly.PHP.provideFunction_( - 'colour_rgb', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($r, $g, $b) {', - ' $r = round(max(min($r, 100), 0) * 2.55);', - ' $g = round(max(min($g, 100), 0) * 2.55);', - ' $b = round(max(min($b, 100), 0) * 2.55);', - ' $hex = "#";', - ' $hex .= str_pad(dechex($r), 2, "0", STR_PAD_LEFT);', - ' $hex .= str_pad(dechex($g), 2, "0", STR_PAD_LEFT);', - ' $hex .= str_pad(dechex($b), 2, "0", STR_PAD_LEFT);', - ' return $hex;', - '}']); - var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['colour_blend'] = function(block) { - // Blend two colours together. - var c1 = Blockly.PHP.valueToCode(block, 'COLOUR1', - Blockly.PHP.ORDER_COMMA) || '\'#000000\''; - var c2 = Blockly.PHP.valueToCode(block, 'COLOUR2', - Blockly.PHP.ORDER_COMMA) || '\'#000000\''; - var ratio = Blockly.PHP.valueToCode(block, 'RATIO', - Blockly.PHP.ORDER_COMMA) || 0.5; - var functionName = Blockly.PHP.provideFunction_( - 'colour_blend', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($c1, $c2, $ratio) {', - ' $ratio = max(min($ratio, 1), 0);', - ' $r1 = hexdec(substr($c1, 1, 2));', - ' $g1 = hexdec(substr($c1, 3, 2));', - ' $b1 = hexdec(substr($c1, 5, 2));', - ' $r2 = hexdec(substr($c2, 1, 2));', - ' $g2 = hexdec(substr($c2, 3, 2));', - ' $b2 = hexdec(substr($c2, 5, 2));', - ' $r = round($r1 * (1 - $ratio) + $r2 * $ratio);', - ' $g = round($g1 * (1 - $ratio) + $g2 * $ratio);', - ' $b = round($b1 * (1 - $ratio) + $b2 * $ratio);', - ' $hex = "#";', - ' $hex .= str_pad(dechex($r), 2, "0", STR_PAD_LEFT);', - ' $hex .= str_pad(dechex($g), 2, "0", STR_PAD_LEFT);', - ' $hex .= str_pad(dechex($b), 2, "0", STR_PAD_LEFT);', - ' return $hex;', - '}']); - var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; diff --git a/generators/php/lists.js b/generators/php/lists.js deleted file mode 100644 index 1173da5542..0000000000 --- a/generators/php/lists.js +++ /dev/null @@ -1,381 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Generating PHP for list blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.lists'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['lists_create_empty'] = function(block) { - // Create an empty list. - return ['array()', Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['lists_create_with'] = function(block) { - // Create a list with any number of elements of any type. - var code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.PHP.valueToCode(block, 'ADD' + n, - Blockly.PHP.ORDER_COMMA) || 'null'; - } - code = 'array(' + code.join(', ') + ')'; - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['lists_repeat'] = function(block) { - // Create a list with one element repeated. - var functionName = Blockly.PHP.provideFunction_( - 'lists_repeat', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($value, $count) {', - ' $array = array();', - ' for ($index = 0; $index < $count; $index++) {', - ' $array[] = $value;', - ' }', - ' return $array;', - '}']); - var argument0 = Blockly.PHP.valueToCode(block, 'ITEM', - Blockly.PHP.ORDER_COMMA) || 'null'; - var argument1 = Blockly.PHP.valueToCode(block, 'NUM', - Blockly.PHP.ORDER_COMMA) || '0'; - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_length'] = function(block) { - // String or array length. - var functionName = Blockly.PHP.provideFunction_( - 'length', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {', - ' if (is_string($value)) {', - ' return strlen($value);', - ' } else {', - ' return count($value);', - ' }', - '}']); - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - return [functionName + '(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - return ['empty(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_indexOf'] = function(block) { - // Find an item in the list. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'indexOf' : 'lastIndexOf'; - var argument0 = Blockly.PHP.valueToCode(block, 'FIND', - Blockly.PHP.ORDER_NONE) || '\'\''; - var argument1 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_MEMBER) || '[]'; - var functionName; - if (block.getFieldValue('END') == 'FIRST'){ - // indexOf - functionName = Blockly.PHP.provideFunction_( - 'indexOf', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($haystack, $needle) {', - ' for ($index = 0; $index < count($haystack); $index++) {', - ' if ($haystack[$index] == $needle) return $index+1;', - ' }', - ' return 0;', - '}']); - } else { - // lastIndexOf - functionName = Blockly.PHP.provideFunction_( - 'lastIndexOf', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($haystack, $needle) {', - ' $last = 0;', - ' for ($index = 0; $index < count($haystack); $index++) {', - ' if ($haystack[$index] == $needle) $last = $index+1;', - ' }', - ' return $last;', - '}']); - } - - var code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_getIndex'] = function(block) { - // Get element at index. - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.PHP.valueToCode(block, 'AT', - Blockly.PHP.ORDER_UNARY_NEGATION) || '1'; - var list = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - - if (where == 'FIRST') { - if (mode == 'GET') { - var code = list + '[0]'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE') { - var code = 'array_shift(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return 'array_shift(' + list + ');\n'; - } - } else if (where == 'LAST') { - if (mode == 'GET') { - var code = 'end(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE') { - var code = 'array_pop(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return 'array_pop(' + list + ');\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'GET') { - var code = list + '[' + at + ']'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE') { - var code = 'array_splice(' + list + ', ' + at + ', 1)[0]'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return 'array_splice(' + list + ', ' + at + ', 1);\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'GET') { - var code = 'array_slice(' + list + ', -' + at + ', 1)[0]'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { - code = 'array_splice(' + list + - ', count(' + list + ') - ' + at + ', 1)[0]'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + ';\n'; - } - } - } else if (where == 'RANDOM') { - if (mode == 'GET'){ - var functionName = Blockly.PHP.provideFunction_( - 'lists_get_random_item', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($list) {', - ' return $list[rand(0,count($list)-1)];', - '}']); - code = functionName + '(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'GET_REMOVE'){ - var functionName = Blockly.PHP.provideFunction_( - 'lists_get_remove_random_item', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list) {', - ' $x = rand(0,count($list)-1);', - ' unset($list[$x]);', - ' return array_values($list);', - '}']); - code = functionName + '(' + list + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - var functionName = Blockly.PHP.provideFunction_( - 'lists_remove_random_item', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list) {', - ' unset($list[rand(0,count($list)-1)]);', - '}']); - return functionName + '(' + list + ');\n'; - } - } - throw 'Unhandled combination (lists_getIndex).'; -}; - -Blockly.PHP['lists_setIndex'] = function(block) { - // Set element at index. - // Note: Until February 2013 this block did not have MODE or WHERE inputs. - var list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_MEMBER) || 'array()'; - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.PHP.valueToCode(block, 'AT', - Blockly.PHP.ORDER_NONE) || '1'; - var value = Blockly.PHP.valueToCode(block, 'TO', - Blockly.PHP.ORDER_ASSIGNMENT) || 'null'; - // Cache non-trivial values to variables to prevent repeated look-ups. - // Closure, which accesses and modifies 'list'. - function cacheList() { - if (list.match(/^\w+$/)) { - return ''; - } - var listVar = Blockly.PHP.variableDB_.getDistinctName( - 'tmp_list', Blockly.Variables.NAME_TYPE); - var code = listVar + ' = &' + list + ';\n'; - list = listVar; - return code; - } - if (where == 'FIRST') { - if (mode == 'SET') { - return list + '[0] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return 'array_unshift(' + list + ', ' + value + ');\n'; - } - } else if (where == 'LAST') { - if (mode == 'SET') { - var functionName = Blockly.PHP.provideFunction_( - 'lists_set_last_item', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list, $value) {', - ' $list[count($list) - 1] = $value;', - '}']); - return functionName + '(' + list + ', ' + value + ');\n'; - } else if (mode == 'INSERT') { - return 'array_push(' + list + ', ' + value + ');\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - if (mode == 'SET') { - return list + '[' + at + '] = ' + value + ';\n'; - } else if (mode == 'INSERT') { - return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'SET') { - var functionName = Blockly.PHP.provideFunction_( - 'lists_set_from_end', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list, $at, $value) {', - ' $list[count($list) - $at] = $value;', - '}']); - return functionName + '(' + list + ', ' + at + ', ' + value + ');\n'; - } else if (mode == 'INSERT') { - var functionName = Blockly.PHP.provideFunction_( - 'lists_insert_from_end', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '(&$list, $at, $value) {', - ' return array_splice($list, count($list) - $at, 0, $value);', - '}']); - return functionName + '(' + list + ', ' + at + ', ' + value + ');\n'; - } - } else if (where == 'RANDOM') { - var code = cacheList(); - var xVar = Blockly.PHP.variableDB_.getDistinctName( - 'tmp_x', Blockly.Variables.NAME_TYPE); - code += xVar + ' = rand(0, count(' + list + ')-1);\n'; - if (mode == 'SET') { - code += list + '[' + xVar + '] = ' + value + ';\n'; - return code; - } else if (mode == 'INSERT') { - code += 'array_splice(' + list + ', ' + xVar + ', 0, ' + value + ');\n'; - return code; - } - } - throw 'Unhandled combination (lists_setIndex).'; -}; - -Blockly.PHP['lists_getSublist'] = function(block) { - // Get sublist. - var list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_MEMBER) || 'array()'; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.PHP.valueToCode(block, 'AT1', - Blockly.PHP.ORDER_NONE) || '1'; - var at2 = Blockly.PHP.valueToCode(block, 'AT2', - Blockly.PHP.ORDER_NONE) || '1'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = list; - } else { - var functionName = Blockly.PHP.provideFunction_( - 'lists_get_sublist', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($list, $where1, $at1, $where2, $at2) {', - ' if ($where2 == \'FROM_START\') {', - ' $at2--;', - ' } else if ($where2 == \'FROM_END\') {', - ' $at2 = $at2 - $at1;', - ' } else if ($where2 == \'FIRST\') {', - ' $at2 = 0;', - ' } else if ($where2 == \'LAST\') {', - ' $at2 = count($list);', - ' } else {', - ' throw \'Unhandled option (lists_getSublist).\';', - ' }', - ' if ($where1 == \'FROM_START\') {', - ' $at1--;', - ' } else if ($where1 == \'FROM_END\') {', - ' $at1 = count($list) - $at1;', - ' } else if ($where1 == \'FIRST\') {', - ' $at1 = 0;', - ' } else if ($where1 == \'LAST\') {', - ' $at1 = count($list) - 1;', - ' } else {', - ' throw \'Unhandled option (lists_getSublist).\';', - ' }', - ' return array_slice($list, $at1, $at2);', - '}']); - var code = functionName + '(' + list + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['lists_split'] = function(block) { - // Block for splitting text into a list, or joining a list into text. - var value_input = Blockly.PHP.valueToCode(block, 'INPUT', - Blockly.PHP.ORDER_MEMBER); - var value_delim = Blockly.PHP.valueToCode(block, 'DELIM', - Blockly.PHP.ORDER_NONE) || '\'\''; - var mode = block.getFieldValue('MODE'); - if (mode == 'SPLIT') { - if (!value_input) { - value_input = '\'\''; - } - var functionName = 'explode'; - } else if (mode == 'JOIN') { - if (!value_input) { - value_input = 'array()'; - } - var functionName = 'implode'; - } else { - throw 'Unknown mode: ' + mode; - } - var code = functionName + '(' + value_delim + ', ' + value_input + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; diff --git a/generators/php/logic.js b/generators/php/logic.js deleted file mode 100644 index 59389239ff..0000000000 --- a/generators/php/logic.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Generating PHP for logic blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.logic'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['controls_if'] = function(block) { - // If/elseif/else condition. - var n = 0; - var argument = Blockly.PHP.valueToCode(block, 'IF' + n, - Blockly.PHP.ORDER_NONE) || 'false'; - var branch = Blockly.PHP.statementToCode(block, 'DO' + n); - var code = 'if (' + argument + ') {\n' + branch + '}'; - for (n = 1; n <= block.elseifCount_; n++) { - argument = Blockly.PHP.valueToCode(block, 'IF' + n, - Blockly.PHP.ORDER_NONE) || 'false'; - branch = Blockly.PHP.statementToCode(block, 'DO' + n); - code += ' else if (' + argument + ') {\n' + branch + '}'; - } - if (block.elseCount_) { - branch = Blockly.PHP.statementToCode(block, 'ELSE'); - code += ' else {\n' + branch + '}'; - } - return code + '\n'; -}; - -Blockly.PHP['logic_compare'] = function(block) { - // Comparison operator. - var OPERATORS = { - 'EQ': '==', - 'NEQ': '!=', - 'LT': '<', - 'LTE': '<=', - 'GT': '>', - 'GTE': '>=' - }; - var operator = OPERATORS[block.getFieldValue('OP')]; - var order = (operator == '==' || operator == '!=') ? - Blockly.PHP.ORDER_EQUALITY : Blockly.PHP.ORDER_RELATIONAL; - var argument0 = Blockly.PHP.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'B', order) || '0'; - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.PHP['logic_operation'] = function(block) { - // Operations 'and', 'or'. - var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; - var order = (operator == '&&') ? Blockly.PHP.ORDER_LOGICAL_AND : - Blockly.PHP.ORDER_LOGICAL_OR; - var argument0 = Blockly.PHP.valueToCode(block, 'A', order); - var argument1 = Blockly.PHP.valueToCode(block, 'B', order); - if (!argument0 && !argument1) { - // If there are no arguments, then the return value is false. - argument0 = 'false'; - argument1 = 'false'; - } else { - // Single missing arguments have no effect on the return value. - var defaultArgument = (operator == '&&') ? 'true' : 'false'; - if (!argument0) { - argument0 = defaultArgument; - } - if (!argument1) { - argument1 = defaultArgument; - } - } - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.PHP['logic_negate'] = function(block) { - // Negation. - var order = Blockly.PHP.ORDER_LOGICAL_NOT; - var argument0 = Blockly.PHP.valueToCode(block, 'BOOL', order) || - 'true'; - var code = '!' + argument0; - return [code, order]; -}; - -Blockly.PHP['logic_boolean'] = function(block) { - // Boolean values true and false. - var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['logic_null'] = function(block) { - // Null data type. - return ['null', Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['logic_ternary'] = function(block) { - // Ternary operator. - var value_if = Blockly.PHP.valueToCode(block, 'IF', - Blockly.PHP.ORDER_CONDITIONAL) || 'false'; - var value_then = Blockly.PHP.valueToCode(block, 'THEN', - Blockly.PHP.ORDER_CONDITIONAL) || 'null'; - var value_else = Blockly.PHP.valueToCode(block, 'ELSE', - Blockly.PHP.ORDER_CONDITIONAL) || 'null'; - var code = value_if + ' ? ' + value_then + ' : ' + value_else; - return [code, Blockly.PHP.ORDER_CONDITIONAL]; -}; diff --git a/generators/php/loops.js b/generators/php/loops.js deleted file mode 100644 index 4a905b4e01..0000000000 --- a/generators/php/loops.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Generating PHP for loop blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.loops'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['controls_repeat_ext'] = function(block) { - // Repeat n times. - if (block.getField('TIMES')) { - // Internal number. - var repeats = String(Number(block.getFieldValue('TIMES'))); - } else { - // External number. - var repeats = Blockly.PHP.valueToCode(block, 'TIMES', - Blockly.PHP.ORDER_ASSIGNMENT) || '0'; - } - var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); - var code = ''; - var loopVar = Blockly.PHP.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var endVar = repeats; - if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { - var endVar = Blockly.PHP.variableDB_.getDistinctName( - 'repeat_end', Blockly.Variables.NAME_TYPE); - code += endVar + ' = ' + repeats + ';\n'; - } - code += 'for (' + loopVar + ' = 0; ' + - loopVar + ' < ' + endVar + '; ' + - loopVar + '++) {\n' + - branch + '}\n'; - return code; -}; - -Blockly.PHP['controls_repeat'] = Blockly.PHP['controls_repeat_ext']; - -Blockly.PHP['controls_whileUntil'] = function(block) { - // Do while/until loop. - var until = block.getFieldValue('MODE') == 'UNTIL'; - var argument0 = Blockly.PHP.valueToCode(block, 'BOOL', - until ? Blockly.PHP.ORDER_LOGICAL_NOT : - Blockly.PHP.ORDER_NONE) || 'false'; - var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); - if (until) { - argument0 = '!' + argument0; - } - return 'while (' + argument0 + ') {\n' + branch + '}\n'; -}; - -Blockly.PHP['controls_for'] = function(block) { - // For loop. - var variable0 = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.PHP.valueToCode(block, 'FROM', - Blockly.PHP.ORDER_ASSIGNMENT) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'TO', - Blockly.PHP.ORDER_ASSIGNMENT) || '0'; - var increment = Blockly.PHP.valueToCode(block, 'BY', - Blockly.PHP.ORDER_ASSIGNMENT) || '1'; - var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); - var code; - if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && - Blockly.isNumber(increment)) { - // All arguments are simple numbers. - var up = parseFloat(argument0) <= parseFloat(argument1); - code = 'for (' + variable0 + ' = ' + argument0 + '; ' + - variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + - variable0; - var step = Math.abs(parseFloat(increment)); - if (step == 1) { - code += up ? '++' : '--'; - } else { - code += (up ? ' += ' : ' -= ') + step; - } - code += ') {\n' + branch + '}\n'; - } else { - code = ''; - // Cache non-trivial values to variables to prevent repeated look-ups. - var startVar = argument0; - if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { - startVar = Blockly.PHP.variableDB_.getDistinctName( - variable0 + '_start', Blockly.Variables.NAME_TYPE); - code += startVar + ' = ' + argument0 + ';\n'; - } - var endVar = argument1; - if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { - var endVar = Blockly.PHP.variableDB_.getDistinctName( - variable0 + '_end', Blockly.Variables.NAME_TYPE); - code += endVar + ' = ' + argument1 + ';\n'; - } - // Determine loop direction at start, in case one of the bounds - // changes during loop execution. - var incVar = Blockly.PHP.variableDB_.getDistinctName( - variable0 + '_inc', Blockly.Variables.NAME_TYPE); - code += incVar + ' = '; - if (Blockly.isNumber(increment)) { - code += Math.abs(increment) + ';\n'; - } else { - code += 'abs(' + increment + ');\n'; - } - code += 'if (' + startVar + ' > ' + endVar + ') {\n'; - code += Blockly.PHP.INDENT + incVar + ' = -' + incVar + ';\n'; - code += '}\n'; - code += 'for (' + variable0 + ' = ' + startVar + ';\n' + - ' ' + incVar + ' >= 0 ? ' + - variable0 + ' <= ' + endVar + ' : ' + - variable0 + ' >= ' + endVar + ';\n' + - ' ' + variable0 + ' += ' + incVar + ') {\n' + - branch + '}\n'; - } - return code; -}; - -Blockly.PHP['controls_forEach'] = function(block) { - // For each loop. - var variable0 = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_ASSIGNMENT) || '[]'; - var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); - var code = ''; - code += 'foreach (' + argument0 + ' as ' + variable0 + - ') {\n' + branch + '}\n'; - return code; -}; - -Blockly.PHP['controls_flow_statements'] = function(block) { - // Flow statements: continue, break. - switch (block.getFieldValue('FLOW')) { - case 'BREAK': - return 'break;\n'; - case 'CONTINUE': - return 'continue;\n'; - } - throw 'Unknown flow statement.'; -}; diff --git a/generators/php/math.js b/generators/php/math.js deleted file mode 100644 index f0bb9fa798..0000000000 --- a/generators/php/math.js +++ /dev/null @@ -1,375 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Generating PHP for math blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.math'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['math_number'] = function(block) { - // Numeric value. - var code = parseFloat(block.getFieldValue('NUM')); - if (code == Infinity) { - code = 'INF'; - } else if (code == -Infinity) { - code = '-INF'; - } - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['math_arithmetic'] = function(block) { - // Basic arithmetic operators, and power. - var OPERATORS = { - 'ADD': [' + ', Blockly.PHP.ORDER_ADDITION], - 'MINUS': [' - ', Blockly.PHP.ORDER_SUBTRACTION], - 'MULTIPLY': [' * ', Blockly.PHP.ORDER_MULTIPLICATION], - 'DIVIDE': [' / ', Blockly.PHP.ORDER_DIVISION], - 'POWER': [null, Blockly.PHP.ORDER_COMMA] // Handle power separately. - }; - var tuple = OPERATORS[block.getFieldValue('OP')]; - var operator = tuple[0]; - var order = tuple[1]; - var argument0 = Blockly.PHP.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'B', order) || '0'; - var code; - // Power in PHP requires a special case since it has no operator. - if (!operator) { - code = 'pow(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } - code = argument0 + operator + argument1; - return [code, order]; -}; - -Blockly.PHP['math_single'] = function(block) { - // Math operators with single operand. - var operator = block.getFieldValue('OP'); - var code; - var arg; - if (operator == 'NEG') { - // Negation is a special case given its different operator precedence. - arg = Blockly.PHP.valueToCode(block, 'NUM', - Blockly.PHP.ORDER_UNARY_NEGATION) || '0'; - if (arg[0] == '-') { - // --3 is not legal in JS. - arg = ' ' + arg; - } - code = '-' + arg; - return [code, Blockly.PHP.ORDER_UNARY_NEGATION]; - } - if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.PHP.valueToCode(block, 'NUM', - Blockly.PHP.ORDER_DIVISION) || '0'; - } else { - arg = Blockly.PHP.valueToCode(block, 'NUM', - Blockly.PHP.ORDER_NONE) || '0'; - } - // First, handle cases which generate values that don't need parentheses - // wrapping the code. - switch (operator) { - case 'ABS': - code = 'abs(' + arg + ')'; - break; - case 'ROOT': - code = 'sqrt(' + arg + ')'; - break; - case 'LN': - code = 'log(' + arg + ')'; - break; - case 'EXP': - code = 'exp(' + arg + ')'; - break; - case 'POW10': - code = 'pow(10,' + arg + ')'; - break; - case 'ROUND': - code = 'round(' + arg + ')'; - break; - case 'ROUNDUP': - code = 'ceil(' + arg + ')'; - break; - case 'ROUNDDOWN': - code = 'floor(' + arg + ')'; - break; - case 'SIN': - code = 'sin(' + arg + ' / 180 * pi())'; - break; - case 'COS': - code = 'cos(' + arg + ' / 180 * pi())'; - break; - case 'TAN': - code = 'tan(' + arg + ' / 180 * pi())'; - break; - } - if (code) { - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } - // Second, handle cases which generate values that may need parentheses - // wrapping the code. - switch (operator) { - case 'LOG10': - code = 'log(' + arg + ') / log(10)'; - break; - case 'ASIN': - code = 'asin(' + arg + ') / pi() * 180'; - break; - case 'ACOS': - code = 'acos(' + arg + ') / pi() * 180'; - break; - case 'ATAN': - code = 'atan(' + arg + ') / pi() * 180'; - break; - default: - throw 'Unknown math operator: ' + operator; - } - return [code, Blockly.PHP.ORDER_DIVISION]; -}; - -Blockly.PHP['math_constant'] = function(block) { - // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - var CONSTANTS = { - 'PI': ['M_PI', Blockly.PHP.ORDER_ATOMIC], - 'E': ['M_E', Blockly.PHP.ORDER_ATOMIC], - 'GOLDEN_RATIO': ['(1 + sqrt(5)) / 2', Blockly.PHP.ORDER_DIVISION], - 'SQRT2': ['M_SQRT2', Blockly.PHP.ORDER_ATOMIC], - 'SQRT1_2': ['M_SQRT1_2', Blockly.PHP.ORDER_ATOMIC], - 'INFINITY': ['INF', Blockly.PHP.ORDER_ATOMIC] - }; - return CONSTANTS[block.getFieldValue('CONSTANT')]; -}; - -Blockly.PHP['math_number_property'] = function(block) { - // Check if a number is even, odd, prime, whole, positive, or negative - // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.PHP.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.PHP.ORDER_MODULUS) || '0'; - var dropdown_property = block.getFieldValue('PROPERTY'); - var code; - if (dropdown_property == 'PRIME') { - // Prime is a special case as it is not a one-liner test. - var functionName = Blockly.PHP.provideFunction_( - 'math_isPrime', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($n) {', - ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', - ' if ($n == 2 || $n == 3) {', - ' return true;', - ' }', - ' // False if n is NaN, negative, is 1, or not whole.', - ' // And false if n is divisible by 2 or 3.', - ' if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 ||' + - ' $n % 3 == 0) {', - ' return false;', - ' }', - ' // Check all the numbers of form 6k +/- 1, up to sqrt(n).', - ' for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {', - ' if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {', - ' return false;', - ' }', - ' }', - ' return true;', - '}']); - code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; - } - switch (dropdown_property) { - case 'EVEN': - code = number_to_check + ' % 2 == 0'; - break; - case 'ODD': - code = number_to_check + ' % 2 == 1'; - break; - case 'WHOLE': - code = 'is_int(' + number_to_check + ')'; - break; - case 'POSITIVE': - code = number_to_check + ' > 0'; - break; - case 'NEGATIVE': - code = number_to_check + ' < 0'; - break; - case 'DIVISIBLE_BY': - var divisor = Blockly.PHP.valueToCode(block, 'DIVISOR', - Blockly.PHP.ORDER_MODULUS) || '0'; - code = number_to_check + ' % ' + divisor + ' == 0'; - break; - } - return [code, Blockly.PHP.ORDER_EQUALITY]; -}; - -Blockly.PHP['math_change'] = function(block) { - // Add to a variable in place. - var argument0 = Blockly.PHP.valueToCode(block, 'DELTA', - Blockly.PHP.ORDER_ADDITION) || '0'; - var varName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - return varName + ' += ' + argument0 + ';\n'; -}; - -// Rounding functions have a single operand. -Blockly.PHP['math_round'] = Blockly.PHP['math_single']; -// Trigonometry functions have a single operand. -Blockly.PHP['math_trig'] = Blockly.PHP['math_single']; - -Blockly.PHP['math_on_list'] = function(block) { - // Math functions for lists. - var func = block.getFieldValue('OP'); - var list, code; - switch (func) { - case 'SUM': - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - code = 'array_sum(' + list + ')'; - break; - case 'MIN': - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - code = 'min(' + list + ')'; - break; - case 'MAX': - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_FUNCTION_CALL) || 'array()'; - code = 'max(' + list + ')'; - break; - case 'AVERAGE': - var functionName = Blockly.PHP.provideFunction_( - 'math_mean', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($myList) {', - ' return array_sum($myList) / count($myList);', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || 'array()'; - code = functionName + '(' + list + ')'; - break; - case 'MEDIAN': - var functionName = Blockly.PHP.provideFunction_( - 'math_median', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($arr) {', - ' sort($arr,SORT_NUMERIC);', - ' return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : ', - ' ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2) - 1]) / 2;', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'MODE': - // As a list of numbers can contain more than one mode, - // the returned result is provided as an array. - // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. - var functionName = Blockly.PHP.provideFunction_( - 'math_modes', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($values) {', - ' $v = array_count_values($values);', - ' arsort($v);', - ' foreach($v as $k => $v){$total = $k; break;}', - ' return array($total);', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'STD_DEV': - var functionName = Blockly.PHP.provideFunction_( - 'math_standard_deviation', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($numbers) {', - ' $n = count($numbers);', - ' if (!$n) return null;', - ' $mean = array_sum($numbers) / count($numbers);', - ' foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);', - ' return sqrt(array_sum($devs) / (count($devs) - 1));', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - case 'RANDOM': - var functionName = Blockly.PHP.provideFunction_( - 'math_random_list', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($list) {', - ' $x = rand(0, count($list)-1);', - ' return $list[$x];', - '}']); - list = Blockly.PHP.valueToCode(block, 'LIST', - Blockly.PHP.ORDER_NONE) || '[]'; - code = functionName + '(' + list + ')'; - break; - default: - throw 'Unknown operator: ' + func; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['math_modulo'] = function(block) { - // Remainder computation. - var argument0 = Blockly.PHP.valueToCode(block, 'DIVIDEND', - Blockly.PHP.ORDER_MODULUS) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'DIVISOR', - Blockly.PHP.ORDER_MODULUS) || '0'; - var code = argument0 + ' % ' + argument1; - return [code, Blockly.PHP.ORDER_MODULUS]; -}; - -Blockly.PHP['math_constrain'] = function(block) { - // Constrain a number between two limits. - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_COMMA) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'LOW', - Blockly.PHP.ORDER_COMMA) || '0'; - var argument2 = Blockly.PHP.valueToCode(block, 'HIGH', - Blockly.PHP.ORDER_COMMA) || 'Infinity'; - var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + - argument2 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['math_random_int'] = function(block) { - // Random integer between [X] and [Y]. - var argument0 = Blockly.PHP.valueToCode(block, 'FROM', - Blockly.PHP.ORDER_COMMA) || '0'; - var argument1 = Blockly.PHP.valueToCode(block, 'TO', - Blockly.PHP.ORDER_COMMA) || '0'; - var functionName = Blockly.PHP.provideFunction_( - 'math_random_int', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($a, $b) {', - ' if ($a > $b) {', - ' return rand($b, $a);', - ' }', - ' return rand($a, $b);', - '}']); - var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['math_random_float'] = function(block) { - // Random fraction between 0 and 1. - return ['(float)rand()/(float)getrandmax()', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; diff --git a/generators/php/procedures.js b/generators/php/procedures.js deleted file mode 100644 index 75903e31c0..0000000000 --- a/generators/php/procedures.js +++ /dev/null @@ -1,122 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Generating PHP for procedure blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.procedures'); - -goog.require('Blockly.PHP'); - -Blockly.PHP['procedures_defreturn'] = function(block) { - // Define a procedure with a return value. - // First, add a 'global' statement for every variable that is assigned. - var globals = Blockly.Variables.allVariables(block); - for (var i = globals.length - 1; i >= 0; i--) { - var varName = globals[i]; - if (block.arguments_.indexOf(varName) == -1) { - globals[i] = Blockly.PHP.variableDB_.getName(varName, - Blockly.Variables.NAME_TYPE); - } else { - // This variable is actually a parameter name. Do not include it in - // the list of globals, thus allowing it be of local scope. - globals.splice(i, 1); - } - } - globals = globals.length ? ' global ' + globals.join(', ') + ';\n' : ''; - - var funcName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var branch = Blockly.PHP.statementToCode(block, 'STACK'); - if (Blockly.PHP.STATEMENT_PREFIX) { - branch = Blockly.PHP.prefixLines( - Blockly.PHP.STATEMENT_PREFIX.replace(/%1/g, - '\'' + block.id + '\''), Blockly.PHP.INDENT) + branch; - } - if (Blockly.PHP.INFINITE_LOOP_TRAP) { - branch = Blockly.PHP.INFINITE_LOOP_TRAP.replace(/%1/g, - '\'' + block.id + '\'') + branch; - } - var returnValue = Blockly.PHP.valueToCode(block, 'RETURN', - Blockly.PHP.ORDER_NONE) || ''; - if (returnValue) { - returnValue = ' return ' + returnValue + ';\n'; - } - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.PHP.variableDB_.getName(block.arguments_[x], - Blockly.Variables.NAME_TYPE); - } - var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + - globals + branch + returnValue + '}'; - code = Blockly.PHP.scrub_(block, code); - Blockly.PHP.definitions_[funcName] = code; - return null; -}; - -// Defining a procedure without a return value uses the same generator as -// a procedure with a return value. -Blockly.PHP['procedures_defnoreturn'] = - Blockly.PHP['procedures_defreturn']; - -Blockly.PHP['procedures_callreturn'] = function(block) { - // Call a procedure with a return value. - var funcName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.PHP.valueToCode(block, 'ARG' + x, - Blockly.PHP.ORDER_COMMA) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['procedures_callnoreturn'] = function(block) { - // Call a procedure with no return value. - var funcName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.PHP.valueToCode(block, 'ARG' + x, - Blockly.PHP.ORDER_COMMA) || 'null'; - } - var code = funcName + '(' + args.join(', ') + ');\n'; - return code; -}; - -Blockly.PHP['procedures_ifreturn'] = function(block) { - // Conditionally return value from a procedure. - var condition = Blockly.PHP.valueToCode(block, 'CONDITION', - Blockly.PHP.ORDER_NONE) || 'false'; - var code = 'if (' + condition + ') {\n'; - if (block.hasReturnValue_) { - var value = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_NONE) || 'null'; - code += ' return ' + value + ';\n'; - } else { - code += ' return;\n'; - } - code += '}\n'; - return code; -}; diff --git a/generators/php/text.js b/generators/php/text.js deleted file mode 100644 index 561b4997c1..0000000000 --- a/generators/php/text.js +++ /dev/null @@ -1,260 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Generating PHP for text blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.texts'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['text'] = function(block) { - // Text value. - var code = Blockly.PHP.quote_(block.getFieldValue('TEXT')); - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['text_join'] = function(block) { - // Create a string made up of any number of elements of any type. - var code; - if (block.itemCount_ == 0) { - return ['\'\'', Blockly.PHP.ORDER_ATOMIC]; - } else if (block.itemCount_ == 1) { - var argument0 = Blockly.PHP.valueToCode(block, 'ADD0', - Blockly.PHP.ORDER_NONE) || '\'\''; - code = argument0; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } else if (block.itemCount_ == 2) { - var argument0 = Blockly.PHP.valueToCode(block, 'ADD0', - Blockly.PHP.ORDER_NONE) || '\'\''; - var argument1 = Blockly.PHP.valueToCode(block, 'ADD1', - Blockly.PHP.ORDER_NONE) || '\'\''; - code = argument0 + ' . ' + argument1; - return [code, Blockly.PHP.ORDER_ADDITION]; - } else { - code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.PHP.valueToCode(block, 'ADD' + n, - Blockly.PHP.ORDER_COMMA) || '\'\''; - } - code = 'implode(\'\', array(' + code.join(',') + '))'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } -}; - -Blockly.PHP['text_append'] = function(block) { - // Append to a variable in place. - var varName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_NONE) || '\'\''; - return varName + ' .= ' + argument0 + ';\n'; -}; - -Blockly.PHP['text_length'] = function(block) { - // String or array length. - var functionName = Blockly.PHP.provideFunction_( - 'length', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {', - ' if (is_string($value)) {', - ' return strlen($value);', - ' } else {', - ' return count($value);', - ' }', - '}']); - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - return [functionName + '(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - return ['empty(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_indexOf'] = function(block) { - // Search the text for a substring. - var operator = block.getFieldValue('END') == 'FIRST' ? - 'strpos' : 'strrpos'; - var argument0 = Blockly.PHP.valueToCode(block, 'FIND', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - var argument1 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - var code = operator + '(' + argument1 + ', ' + argument0 + ') + 1'; - - var functionName = Blockly.PHP.provideFunction_( - block.getFieldValue('END') == 'FIRST' ? - 'text_indexOf' : 'text_lastIndexOf', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($text, $search) {', - ' $pos = ' + operator + '($text, $search);', - ' return $pos === false ? 0 : $pos + 1;', - '}']); - code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_charAt'] = function(block) { - // Get letter at index. - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.PHP.valueToCode(block, 'AT', - Blockly.PHP.ORDER_FUNCTION_CALL) || '0'; - var text = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - switch (where) { - case 'FIRST': - var code = text + '[0]'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - case 'LAST': - var code = 'substr(' + text + ', -1, 1)'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - case 'FROM_START': - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseFloat(at) - 1; - } else { - // If the index is dynamic, decrement it in code. - at += ' - 1'; - } - var code = 'substr(' + text + ', ' + at + ', 1)'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - case 'FROM_END': - var code = 'substr(' + text + ', -' + at + ', 1)'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - case 'RANDOM': - var functionName = Blockly.PHP.provideFunction_( - 'text_random_letter', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($text) {', - ' return $text[rand(0, strlen($text) - 1)];', - '}']); - code = functionName + '(' + text + ')'; - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; - } - throw 'Unhandled option (text_charAt).'; -}; - -Blockly.PHP['text_getSubstring'] = function(block) { - // Get substring. - var text = Blockly.PHP.valueToCode(block, 'STRING', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.PHP.valueToCode(block, 'AT1', - Blockly.PHP.ORDER_FUNCTION_CALL) || '0'; - var at2 = Blockly.PHP.valueToCode(block, 'AT2', - Blockly.PHP.ORDER_FUNCTION_CALL) || '0'; - if (where1 == 'FIRST' && where2 == 'LAST') { - var code = text; - } else { - var functionName = Blockly.PHP.provideFunction_( - 'text_get_substring', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($text, $where1, $at1, $where2, $at2) {', - ' if ($where2 == \'FROM_START\') {', - ' $at2--;', - ' } else if ($where2 == \'FROM_END\') {', - ' $at2 = $at2 - $at1;', - ' } else if ($where2 == \'FIRST\') {', - ' $at2 = 0;', - ' } else if ($where2 == \'LAST\') {', - ' $at2 = strlen($text);', - ' } else { $at2 = 0; }', - ' if ($where1 == \'FROM_START\') {', - ' $at1--;', - ' } else if ($where1 == \'FROM_END\') {', - ' $at1 = strlen($text) - $at1;', - ' } else if ($where1 == \'FIRST\') {', - ' $at1 = 0;', - ' } else if ($where1 == \'LAST\') {', - ' $at1 = strlen($text) - 1;', - ' } else { $at1 = 0; }', - ' return substr($text, $at1, $at2);', - '}']); - var code = functionName + '(' + text + ', \'' + - where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_changeCase'] = function(block) { - // Change capitalization. - var code; - if (block.getFieldValue('CASE') == 'UPPERCASE') { - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - code = 'strtoupper(' + argument0 + ')'; - } else if (block.getFieldValue('CASE') == 'LOWERCASE') { - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - code = 'strtolower(' + argument0 + ')'; - } else if (block.getFieldValue('CASE') == 'TITLECASE') { - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_FUNCTION_CALL) || '\'\''; - code = 'ucwords(strtolower(' + argument0 + '))'; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_trim'] = function(block) { - // Trim spaces. - var OPERATORS = { - 'LEFT': 'ltrim', - 'RIGHT': 'rtrim', - 'BOTH': 'trim' - }; - var operator = OPERATORS[block.getFieldValue('MODE')]; - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_NONE) || '\'\''; - return [ operator + '(' + argument0 + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_NONE) || '\'\''; - return 'print(' + argument0 + ');\n'; -}; - -Blockly.PHP['text_prompt_ext'] = function(block) { - // Prompt function. - if (block.getField('TEXT')) { - // Internal message. - var msg = Blockly.PHP.quote_(block.getFieldValue('TEXT')); - } else { - // External message. - var msg = Blockly.PHP.valueToCode(block, 'TEXT', - Blockly.PHP.ORDER_NONE) || '\'\''; - } - var code = 'readline(' + msg + ')'; - var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; - if (toNumber) { - code = 'floatval(' + code + ')'; - } - return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; -}; - -Blockly.PHP['text_prompt'] = Blockly.PHP['text_prompt_ext']; diff --git a/generators/php/variables.js b/generators/php/variables.js deleted file mode 100644 index dd68f4ead5..0000000000 --- a/generators/php/variables.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Generating PHP for variable blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -goog.provide('Blockly.PHP.variables'); - -goog.require('Blockly.PHP'); - - -Blockly.PHP['variables_get'] = function(block) { - // Variable getter. - var code = Blockly.PHP.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return [code, Blockly.PHP.ORDER_ATOMIC]; -}; - -Blockly.PHP['variables_set'] = function(block) { - // Variable setter. - var argument0 = Blockly.PHP.valueToCode(block, 'VALUE', - Blockly.PHP.ORDER_ASSIGNMENT) || '0'; - var varName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - return varName + ' = ' + argument0 + ';\n'; -}; \ No newline at end of file diff --git a/generators/python.js b/generators/python.js deleted file mode 100644 index 9a227b2bf9..0000000000 --- a/generators/python.js +++ /dev/null @@ -1,199 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Helper functions for generating Python for blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Python'); - -goog.require('Blockly.Generator'); - - -/** - * Python code generator. - * @type {!Blockly.Generator} - */ -Blockly.Python = new Blockly.Generator('Python'); - -/** - * List of illegal variable names. - * This is not intended to be a security feature. Blockly is 100% client-side, - * so bypassing this list is trivial. This is intended to prevent users from - * accidentally clobbering a built-in object or function. - * @private - */ -Blockly.Python.addReservedWords( - // import keyword - // print ','.join(keyword.kwlist) - // http://docs.python.org/reference/lexical_analysis.html#keywords - 'and,as,assert,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lambda,not,or,pass,print,raise,return,try,while,with,yield,' + - //http://docs.python.org/library/constants.html - 'True,False,None,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,' + - // http://docs.python.org/library/functions.html - 'abs,divmod,input,open,staticmethod,all,enumerate,int,ord,str,any,eval,isinstance,pow,sum,basestring,execfile,issubclass,print,super,bin,file,iter,property,tuple,bool,filter,len,range,type,bytearray,float,list,raw_input,unichr,callable,format,locals,reduce,unicode,chr,frozenset,long,reload,vars,classmethod,getattr,map,repr,xrange,cmp,globals,max,reversed,zip,compile,hasattr,memoryview,round,__import__,complex,hash,min,set,apply,delattr,help,next,setattr,buffer,dict,hex,object,slice,coerce,dir,id,oct,sorted,intern'); - -/** - * Order of operation ENUMs. - * http://docs.python.org/reference/expressions.html#summary - */ -Blockly.Python.ORDER_ATOMIC = 0; // 0 "" ... -Blockly.Python.ORDER_COLLECTION = 1; // tuples, lists, dictionaries -Blockly.Python.ORDER_STRING_CONVERSION = 1; // `expression...` -Blockly.Python.ORDER_MEMBER = 2; // . [] -Blockly.Python.ORDER_FUNCTION_CALL = 2; // () -Blockly.Python.ORDER_EXPONENTIATION = 3; // ** -Blockly.Python.ORDER_UNARY_SIGN = 4; // + - -Blockly.Python.ORDER_BITWISE_NOT = 4; // ~ -Blockly.Python.ORDER_MULTIPLICATIVE = 5; // * / // % -Blockly.Python.ORDER_ADDITIVE = 6; // + - -Blockly.Python.ORDER_BITWISE_SHIFT = 7; // << >> -Blockly.Python.ORDER_BITWISE_AND = 8; // & -Blockly.Python.ORDER_BITWISE_XOR = 9; // ^ -Blockly.Python.ORDER_BITWISE_OR = 10; // | -Blockly.Python.ORDER_RELATIONAL = 11; // in, not in, is, is not, - // <, <=, >, >=, <>, !=, == -Blockly.Python.ORDER_LOGICAL_NOT = 12; // not -Blockly.Python.ORDER_LOGICAL_AND = 13; // and -Blockly.Python.ORDER_LOGICAL_OR = 14; // or -Blockly.Python.ORDER_CONDITIONAL = 15; // if else -Blockly.Python.ORDER_LAMBDA = 16; // lambda -Blockly.Python.ORDER_NONE = 99; // (...) - -/** - * Empty loops or conditionals are not allowed in Python. - */ -Blockly.Python.PASS = ' pass\n'; - -/** - * Initialise the database of variable names. - * @param {!Blockly.Workspace} workspace Workspace to generate code from. - */ -Blockly.Python.init = function(workspace) { - // Create a dictionary of definitions to be printed before the code. - Blockly.Python.definitions_ = Object.create(null); - // Create a dictionary mapping desired function names in definitions_ - // to actual function names (to avoid collisions with user functions). - Blockly.Python.functionNames_ = Object.create(null); - - if (!Blockly.Python.variableDB_) { - Blockly.Python.variableDB_ = - new Blockly.Names(Blockly.Python.RESERVED_WORDS_); - } else { - Blockly.Python.variableDB_.reset(); - } - - var defvars = []; - var variables = Blockly.Variables.allVariables(workspace); - for (var i = 0; i < variables.length; i++) { - defvars[i] = Blockly.Python.variableDB_.getName(variables[i], - Blockly.Variables.NAME_TYPE) + ' = None'; - } - Blockly.Python.definitions_['variables'] = defvars.join('\n'); -}; - -/** - * Prepend the generated code with the variable definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.Python.finish = function(code) { - // Convert the definitions dictionary into a list. - var imports = []; - var definitions = []; - for (var name in Blockly.Python.definitions_) { - var def = Blockly.Python.definitions_[name]; - if (def.match(/^(from\s+\S+\s+)?import\s+\S+/)) { - imports.push(def); - } else { - definitions.push(def); - } - } - // Clean up temporary data. - delete Blockly.Python.definitions_; - delete Blockly.Python.functionNames_; - Blockly.Python.variableDB_.reset(); - var allDefs = imports.join('\n') + '\n\n' + definitions.join('\n\n'); - return allDefs.replace(/\n\n+/g, '\n\n').replace(/\n*$/, '\n\n\n') + code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.Python.scrubNakedValue = function(line) { - return line + '\n'; -}; - -/** - * Encode a string as a properly escaped Python string, complete with quotes. - * @param {string} string Text to encode. - * @return {string} Python string. - * @private - */ -Blockly.Python.quote_ = function(string) { - // TODO: This is a quick hack. Replace with goog.string.quote - string = string.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\\n') - .replace(/\%/g, '\\%') - .replace(/'/g, '\\\''); - return '\'' + string + '\''; -}; - -/** - * Common tasks for generating Python from blocks. - * Handles comments for the specified block and any connected value blocks. - * Calls any statements following this block. - * @param {!Blockly.Block} block The current block. - * @param {string} code The Python code created for this block. - * @return {string} Python code with comments and subsequent blocks added. - * @private - */ -Blockly.Python.scrub_ = function(block, code) { - var commentCode = ''; - // Only collect comments for blocks that aren't inline. - if (!block.outputConnection || !block.outputConnection.targetConnection) { - // Collect comment for this block. - var comment = block.getCommentText(); - if (comment) { - commentCode += Blockly.Python.prefixLines(comment, '# ') + '\n'; - } - // Collect comments for all value arguments. - // Don't collect comments for nested statements. - for (var x = 0; x < block.inputList.length; x++) { - if (block.inputList[x].type == Blockly.INPUT_VALUE) { - var childBlock = block.inputList[x].connection.targetBlock(); - if (childBlock) { - var comment = Blockly.Python.allNestedComments(childBlock); - if (comment) { - commentCode += Blockly.Python.prefixLines(comment, '# '); - } - } - } - } - } - var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); - var nextCode = Blockly.Python.blockToCode(nextBlock); - return commentCode + code + nextCode; -}; diff --git a/generators/python/colour.js b/generators/python/colour.js deleted file mode 100644 index 49505ac86d..0000000000 --- a/generators/python/colour.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating Python for colour blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Python.colour'); - -goog.require('Blockly.Python'); - - -Blockly.Python['colour_picker'] = function(block) { - // Colour picker. - var code = '\'' + block.getFieldValue('COLOUR') + '\''; - return [code, Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['colour_random'] = function(block) { - // Generate a random colour. - Blockly.Python.definitions_['import_random'] = 'import random'; - var code = '\'#%06x\' % random.randint(0, 2**24 - 1)'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['colour_rgb'] = function(block) { - // Compose a colour from RGB components expressed as percentages. - var functionName = Blockly.Python.provideFunction_( - 'colour_rgb', - [ 'def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(r, g, b):', - ' r = round(min(100, max(0, r)) * 2.55)', - ' g = round(min(100, max(0, g)) * 2.55)', - ' b = round(min(100, max(0, b)) * 2.55)', - ' return \'#%02x%02x%02x\' % (r, g, b)']); - var r = Blockly.Python.valueToCode(block, 'RED', - Blockly.Python.ORDER_NONE) || 0; - var g = Blockly.Python.valueToCode(block, 'GREEN', - Blockly.Python.ORDER_NONE) || 0; - var b = Blockly.Python.valueToCode(block, 'BLUE', - Blockly.Python.ORDER_NONE) || 0; - var code = functionName + '(' + r + ', ' + g + ', ' + b + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['colour_blend'] = function(block) { - // Blend two colours together. - var functionName = Blockly.Python.provideFunction_( - 'colour_blend', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + - '(colour1, colour2, ratio):', - ' r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)', - ' g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)', - ' b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)', - ' ratio = min(1, max(0, ratio))', - ' r = round(r1 * (1 - ratio) + r2 * ratio)', - ' g = round(g1 * (1 - ratio) + g2 * ratio)', - ' b = round(b1 * (1 - ratio) + b2 * ratio)', - ' return \'#%02x%02x%02x\' % (r, g, b)']); - var colour1 = Blockly.Python.valueToCode(block, 'COLOUR1', - Blockly.Python.ORDER_NONE) || '\'#000000\''; - var colour2 = Blockly.Python.valueToCode(block, 'COLOUR2', - Blockly.Python.ORDER_NONE) || '\'#000000\''; - var ratio = Blockly.Python.valueToCode(block, 'RATIO', - Blockly.Python.ORDER_NONE) || 0; - var code = functionName + '(' + colour1 + ', ' + colour2 + ', ' + ratio + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; diff --git a/generators/python/lists.js b/generators/python/lists.js deleted file mode 100644 index 05ed4d23ed..0000000000 --- a/generators/python/lists.js +++ /dev/null @@ -1,334 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating Python for list blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.lists'); - -goog.require('Blockly.Python'); - - -Blockly.Python['lists_create_empty'] = function(block) { - // Create an empty list. - return ['[]', Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['lists_create_with'] = function(block) { - // Create a list with any number of elements of any type. - var code = new Array(block.itemCount_); - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Python.valueToCode(block, 'ADD' + n, - Blockly.Python.ORDER_NONE) || 'None'; - } - code = '[' + code.join(', ') + ']'; - return [code, Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['lists_repeat'] = function(block) { - // Create a list with one element repeated. - var argument0 = Blockly.Python.valueToCode(block, 'ITEM', - Blockly.Python.ORDER_NONE) || 'None'; - var argument1 = Blockly.Python.valueToCode(block, 'NUM', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - var code = '[' + argument0 + '] * ' + argument1; - return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Python['lists_length'] = function(block) { - // String or array length. - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '[]'; - return ['len(' + argument0 + ')', Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['lists_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '[]'; - var code = 'not len(' + argument0 + ')'; - return [code, Blockly.Python.ORDER_LOGICAL_NOT]; -}; - -Blockly.Python['lists_indexOf'] = function(block) { - // Find an item in the list. - var argument0 = Blockly.Python.valueToCode(block, 'FIND', - Blockly.Python.ORDER_NONE) || '[]'; - var argument1 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code; - if (block.getFieldValue('END') == 'FIRST') { - var functionName = Blockly.Python.provideFunction_( - 'first_index', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList, elem):', - ' try: theIndex = myList.index(elem) + 1', - ' except: theIndex = 0', - ' return theIndex']); - code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else { - var functionName = Blockly.Python.provideFunction_( - 'last_index', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList, elem):', - ' try: theIndex = len(myList) - myList[::-1].index(elem)', - ' except: theIndex = 0', - ' return theIndex']); - code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } -}; - -Blockly.Python['lists_getIndex'] = function(block) { - // Get element at index. - // Note: Until January 2013 this block did not have MODE or WHERE inputs. - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Python.valueToCode(block, 'AT', - Blockly.Python.ORDER_UNARY_SIGN) || '1'; - var list = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_MEMBER) || '[]'; - - if (where == 'FIRST') { - if (mode == 'GET') { - var code = list + '[0]'; - return [code, Blockly.Python.ORDER_MEMBER]; - } else { - var code = list + '.pop(0)'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } else if (where == 'LAST') { - if (mode == 'GET') { - var code = list + '[-1]'; - return [code, Blockly.Python.ORDER_MEMBER]; - } else { - var code = list + '.pop()'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at = 'int(' + at + ' - 1)'; - } - if (mode == 'GET') { - var code = list + '[' + at + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; - } else { - var code = list + '.pop(' + at + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } else if (where == 'FROM_END') { - if (mode == 'GET') { - var code = list + '[-' + at + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; - } else { - var code = list + '.pop(-' + at + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } else if (where == 'RANDOM') { - Blockly.Python.definitions_['import_random'] = 'import random'; - if (mode == 'GET') { - code = 'random.choice(' + list + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else { - var functionName = Blockly.Python.provideFunction_( - 'lists_remove_random_item', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', - ' x = int(random.random() * len(myList))', - ' return myList.pop(x)']); - code = functionName + '(' + list + ')'; - if (mode == 'GET_REMOVE') { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (mode == 'REMOVE') { - return code + '\n'; - } - } - } - throw 'Unhandled combination (lists_getIndex).'; -}; - -Blockly.Python['lists_setIndex'] = function(block) { - // Set element at index. - // Note: Until February 2013 this block did not have MODE or WHERE inputs. - var list = Blockly.Python.valueToCode(block, 'LIST', - Blockly.Python.ORDER_MEMBER) || '[]'; - var mode = block.getFieldValue('MODE') || 'GET'; - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Python.valueToCode(block, 'AT', - Blockly.Python.ORDER_NONE) || '1'; - var value = Blockly.Python.valueToCode(block, 'TO', - Blockly.Python.ORDER_NONE) || 'None'; - // Cache non-trivial values to variables to prevent repeated look-ups. - // Closure, which accesses and modifies 'list'. - function cacheList() { - if (list.match(/^\w+$/)) { - return ''; - } - var listVar = Blockly.Python.variableDB_.getDistinctName( - 'tmp_list', Blockly.Variables.NAME_TYPE); - var code = listVar + ' = ' + list + '\n'; - list = listVar; - return code; - } - if (where == 'FIRST') { - if (mode == 'SET') { - return list + '[0] = ' + value + '\n'; - } else if (mode == 'INSERT') { - return list + '.insert(0, ' + value + ')\n'; - } - } else if (where == 'LAST') { - if (mode == 'SET') { - return list + '[-1] = ' + value + '\n'; - } else if (mode == 'INSERT') { - return list + '.append(' + value + ')\n'; - } - } else if (where == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at = 'int(' + at + ' - 1)'; - } - if (mode == 'SET') { - return list + '[' + at + '] = ' + value + '\n'; - } else if (mode == 'INSERT') { - return list + '.insert(' + at + ', ' + value + ')\n'; - } - } else if (where == 'FROM_END') { - if (mode == 'SET') { - return list + '[-' + at + '] = ' + value + '\n'; - } else if (mode == 'INSERT') { - return list + '.insert(-' + at + ', ' + value + ')\n'; - } - } else if (where == 'RANDOM') { - Blockly.Python.definitions_['import_random'] = 'import random'; - var code = cacheList(); - var xVar = Blockly.Python.variableDB_.getDistinctName( - 'tmp_x', Blockly.Variables.NAME_TYPE); - code += xVar + ' = int(random.random() * len(' + list + '))\n'; - if (mode == 'SET') { - code += list + '[' + xVar + '] = ' + value + '\n'; - return code; - } else if (mode == 'INSERT') { - code += list + '.insert(' + xVar + ', ' + value + ')\n'; - return code; - } - } - throw 'Unhandled combination (lists_setIndex).'; -}; - -Blockly.Python['lists_getSublist'] = function(block) { - // Get sublist. - var list = Blockly.Python.valueToCode(block, 'LIST', - Blockly.Python.ORDER_MEMBER) || '[]'; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.Python.valueToCode(block, 'AT1', - Blockly.Python.ORDER_ADDITIVE) || '1'; - var at2 = Blockly.Python.valueToCode(block, 'AT2', - Blockly.Python.ORDER_ADDITIVE) || '1'; - if (where1 == 'FIRST' || (where1 == 'FROM_START' && at1 == '1')) { - at1 = ''; - } else if (where1 == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at1)) { - // If the index is a naked number, decrement it right now. - at1 = parseInt(at1, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at1 = 'int(' + at1 + ' - 1)'; - } - } else if (where1 == 'FROM_END') { - if (Blockly.isNumber(at1)) { - at1 = -parseInt(at1, 10); - } else { - at1 = '-int(' + at1 + ')'; - } - } - if (where2 == 'LAST' || (where2 == 'FROM_END' && at2 == '1')) { - at2 = ''; - } else if (where1 == 'FROM_START') { - if (Blockly.isNumber(at2)) { - at2 = parseInt(at2, 10); - } else { - at2 = 'int(' + at2 + ')'; - } - } else if (where1 == 'FROM_END') { - if (Blockly.isNumber(at2)) { - // If the index is a naked number, increment it right now. - // Add special case for -0. - at2 = 1 - parseInt(at2, 10); - if (at2 == 0) { - at2 = ''; - } - } else { - // If the index is dynamic, increment it in code. - Blockly.Python.definitions_['import_sys'] = 'import sys'; - at2 = 'int(1 - ' + at2 + ') or sys.maxsize'; - } - } - var code = list + '[' + at1 + ' : ' + at2 + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['lists_split'] = function(block) { - // Block for splitting text into a list, or joining a list into text. - var mode = block.getFieldValue('MODE'); - if (mode == 'SPLIT') { - var value_input = Blockly.Python.valueToCode(block, 'INPUT', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var value_delim = Blockly.Python.valueToCode(block, 'DELIM', - Blockly.Python.ORDER_NONE); - var code = value_input + '.split(' + value_delim + ')'; - } else if (mode == 'JOIN') { - var value_input = Blockly.Python.valueToCode(block, 'INPUT', - Blockly.Python.ORDER_NONE) || '[]'; - var value_delim = Blockly.Python.valueToCode(block, 'DELIM', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code = value_delim + '.join(' + value_input + ')'; - } else { - throw 'Unknown mode: ' + mode; - } - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; diff --git a/generators/python/logic.js b/generators/python/logic.js deleted file mode 100644 index a485e5c9e6..0000000000 --- a/generators/python/logic.js +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating Python for logic blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.logic'); - -goog.require('Blockly.Python'); - - -Blockly.Python['controls_if'] = function(block) { - // If/elseif/else condition. - var n = 0; - var argument = Blockly.Python.valueToCode(block, 'IF' + n, - Blockly.Python.ORDER_NONE) || 'False'; - var branch = Blockly.Python.statementToCode(block, 'DO' + n) || - Blockly.Python.PASS; - var code = 'if ' + argument + ':\n' + branch; - for (n = 1; n <= block.elseifCount_; n++) { - argument = Blockly.Python.valueToCode(block, 'IF' + n, - Blockly.Python.ORDER_NONE) || 'False'; - branch = Blockly.Python.statementToCode(block, 'DO' + n) || - Blockly.Python.PASS; - code += 'elif ' + argument + ':\n' + branch; - } - if (block.elseCount_) { - branch = Blockly.Python.statementToCode(block, 'ELSE') || - Blockly.Python.PASS; - code += 'else:\n' + branch; - } - return code; -}; - -Blockly.Python['logic_compare'] = function(block) { - // Comparison operator. - var OPERATORS = { - 'EQ': '==', - 'NEQ': '!=', - 'LT': '<', - 'LTE': '<=', - 'GT': '>', - 'GTE': '>=' - }; - var operator = OPERATORS[block.getFieldValue('OP')]; - var order = Blockly.Python.ORDER_RELATIONAL; - var argument0 = Blockly.Python.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'B', order) || '0'; - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Python['logic_operation'] = function(block) { - // Operations 'and', 'or'. - var operator = (block.getFieldValue('OP') == 'AND') ? 'and' : 'or'; - var order = (operator == 'and') ? Blockly.Python.ORDER_LOGICAL_AND : - Blockly.Python.ORDER_LOGICAL_OR; - var argument0 = Blockly.Python.valueToCode(block, 'A', order); - var argument1 = Blockly.Python.valueToCode(block, 'B', order); - if (!argument0 && !argument1) { - // If there are no arguments, then the return value is false. - argument0 = 'False'; - argument1 = 'False'; - } else { - // Single missing arguments have no effect on the return value. - var defaultArgument = (operator == 'and') ? 'True' : 'False'; - if (!argument0) { - argument0 = defaultArgument; - } - if (!argument1) { - argument1 = defaultArgument; - } - } - var code = argument0 + ' ' + operator + ' ' + argument1; - return [code, order]; -}; - -Blockly.Python['logic_negate'] = function(block) { - // Negation. - var argument0 = Blockly.Python.valueToCode(block, 'BOOL', - Blockly.Python.ORDER_LOGICAL_NOT) || 'True'; - var code = 'not ' + argument0; - return [code, Blockly.Python.ORDER_LOGICAL_NOT]; -}; - -Blockly.Python['logic_boolean'] = function(block) { - // Boolean values true and false. - var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'True' : 'False'; - return [code, Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['logic_null'] = function(block) { - // Null data type. - return ['None', Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['logic_ternary'] = function(block) { - // Ternary operator. - var value_if = Blockly.Python.valueToCode(block, 'IF', - Blockly.Python.ORDER_CONDITIONAL) || 'False'; - var value_then = Blockly.Python.valueToCode(block, 'THEN', - Blockly.Python.ORDER_CONDITIONAL) || 'None'; - var value_else = Blockly.Python.valueToCode(block, 'ELSE', - Blockly.Python.ORDER_CONDITIONAL) || 'None'; - var code = value_then + ' if ' + value_if + ' else ' + value_else; - return [code, Blockly.Python.ORDER_CONDITIONAL]; -}; diff --git a/generators/python/loops.js b/generators/python/loops.js deleted file mode 100644 index 3cb1ab9008..0000000000 --- a/generators/python/loops.js +++ /dev/null @@ -1,211 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating Python for loop blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.loops'); - -goog.require('Blockly.Python'); - - -Blockly.Python['controls_repeat_ext'] = function(block) { - // Repeat n times. - if (block.getField('TIMES')) { - // Internal number. - var repeats = String(parseInt(block.getFieldValue('TIMES'), 10)); - } else { - // External number. - var repeats = Blockly.Python.valueToCode(block, 'TIMES', - Blockly.Python.ORDER_NONE) || '0'; - } - if (Blockly.isNumber(repeats)) { - repeats = parseInt(repeats, 10); - } else { - repeats = 'int(' + repeats + ')'; - } - var branch = Blockly.Python.statementToCode(block, 'DO'); - branch = Blockly.Python.addLoopTrap(branch, block.id) || - Blockly.Python.PASS; - var loopVar = Blockly.Python.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var code = 'for ' + loopVar + ' in range(' + repeats + '):\n' + branch; - return code; -}; - -Blockly.Python['controls_repeat'] = Blockly.Python['controls_repeat_ext']; - -Blockly.Python['controls_whileUntil'] = function(block) { - // Do while/until loop. - var until = block.getFieldValue('MODE') == 'UNTIL'; - var argument0 = Blockly.Python.valueToCode(block, 'BOOL', - until ? Blockly.Python.ORDER_LOGICAL_NOT : - Blockly.Python.ORDER_NONE) || 'False'; - var branch = Blockly.Python.statementToCode(block, 'DO'); - branch = Blockly.Python.addLoopTrap(branch, block.id) || - Blockly.Python.PASS; - if (until) { - argument0 = 'not ' + argument0; - } - return 'while ' + argument0 + ':\n' + branch; -}; - -Blockly.Python['controls_for'] = function(block) { - // For loop. - var variable0 = Blockly.Python.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Python.valueToCode(block, 'FROM', - Blockly.Python.ORDER_NONE) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'TO', - Blockly.Python.ORDER_NONE) || '0'; - var increment = Blockly.Python.valueToCode(block, 'BY', - Blockly.Python.ORDER_NONE) || '1'; - var branch = Blockly.Python.statementToCode(block, 'DO'); - branch = Blockly.Python.addLoopTrap(branch, block.id) || - Blockly.Python.PASS; - - var code = ''; - var range; - - // Helper functions. - var defineUpRange = function() { - return Blockly.Python.provideFunction_( - 'upRange', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + - '(start, stop, step):', - ' while start <= stop:', - ' yield start', - ' start += abs(step)']); - }; - var defineDownRange = function() { - return Blockly.Python.provideFunction_( - 'downRange', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + - '(start, stop, step):', - ' while start >= stop:', - ' yield start', - ' start -= abs(step)']); - }; - // Arguments are legal Python code (numbers or strings returned by scrub()). - var generateUpDownRange = function(start, end, inc) { - return '(' + start + ' <= ' + end + ') and ' + - defineUpRange() + '(' + start + ', ' + end + ', ' + inc + ') or ' + - defineDownRange() + '(' + start + ', ' + end + ', ' + inc + ')'; - }; - - if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && - Blockly.isNumber(increment)) { - // All parameters are simple numbers. - argument0 = parseFloat(argument0); - argument1 = parseFloat(argument1); - increment = Math.abs(parseFloat(increment)); - if (argument0 % 1 === 0 && argument1 % 1 === 0 && increment % 1 === 0) { - // All parameters are integers. - if (argument0 <= argument1) { - // Count up. - argument1++; - if (argument0 == 0 && increment == 1) { - // If starting index is 0, omit it. - range = argument1; - } else { - range = argument0 + ', ' + argument1; - } - // If increment isn't 1, it must be explicit. - if (increment != 1) { - range += ', ' + increment; - } - } else { - // Count down. - argument1--; - range = argument0 + ', ' + argument1 + ', -' + increment; - } - range = 'range(' + range + ')'; - } else { - // At least one of the parameters is not an integer. - if (argument0 < argument1) { - range = defineUpRange(); - } else { - range = defineDownRange(); - } - range += '(' + argument0 + ', ' + argument1 + ', ' + increment + ')'; - } - } else { - // Cache non-trivial values to variables to prevent repeated look-ups. - var scrub = function(arg, suffix) { - if (Blockly.isNumber(arg)) { - // Simple number. - arg = parseFloat(arg); - } else if (arg.match(/^\w+$/)) { - // Variable. - arg = 'float(' + arg + ')'; - } else { - // It's complicated. - var varName = Blockly.Python.variableDB_.getDistinctName( - variable0 + suffix, Blockly.Variables.NAME_TYPE); - code += varName + ' = float(' + arg + ')\n'; - arg = varName; - } - return arg; - }; - var startVar = scrub(argument0, '_start'); - var endVar = scrub(argument1, '_end'); - var incVar = scrub(increment, '_inc'); - - if (typeof startVar == 'number' && typeof endVar == 'number') { - if (startVar < endVar) { - range = defineUpRange(startVar, endVar, increment); - } else { - range = defineDownRange(startVar, endVar, increment); - } - } else { - // We cannot determine direction statically. - range = generateUpDownRange(startVar, endVar, increment); - } - } - code += 'for ' + variable0 + ' in ' + range + ':\n' + branch; - return code; -}; - -Blockly.Python['controls_forEach'] = function(block) { - // For each loop. - var variable0 = Blockly.Python.variableDB_.getName( - block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Python.valueToCode(block, 'LIST', - Blockly.Python.ORDER_RELATIONAL) || '[]'; - var branch = Blockly.Python.statementToCode(block, 'DO'); - branch = Blockly.Python.addLoopTrap(branch, block.id) || - Blockly.Python.PASS; - var code = 'for ' + variable0 + ' in ' + argument0 + ':\n' + branch; - return code; -}; - -Blockly.Python['controls_flow_statements'] = function(block) { - // Flow statements: continue, break. - switch (block.getFieldValue('FLOW')) { - case 'BREAK': - return 'break\n'; - case 'CONTINUE': - return 'continue\n'; - } - throw 'Unknown flow statement.'; -}; diff --git a/generators/python/math.js b/generators/python/math.js deleted file mode 100644 index a2595e00c8..0000000000 --- a/generators/python/math.js +++ /dev/null @@ -1,388 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating Python for math blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.math'); - -goog.require('Blockly.Python'); - - -// If any new block imports any library, add that library name here. -Blockly.Python.addReservedWords('math,random,Number'); - -Blockly.Python['math_number'] = function(block) { - // Numeric value. - var code = parseFloat(block.getFieldValue('NUM')); - var order; - if (code == Infinity) { - code = 'float("inf")'; - order = Blockly.Python.ORDER_FUNCTION_CALL; - } else if (code == -Infinity) { - code = '-float("inf")'; - order = Blockly.Python.ORDER_UNARY_SIGN; - } else { - order = code < 0 ? Blockly.Python.ORDER_UNARY_SIGN : - Blockly.Python.ORDER_ATOMIC; - } - return [code, order]; -}; - -Blockly.Python['math_arithmetic'] = function(block) { - // Basic arithmetic operators, and power. - var OPERATORS = { - 'ADD': [' + ', Blockly.Python.ORDER_ADDITIVE], - 'MINUS': [' - ', Blockly.Python.ORDER_ADDITIVE], - 'MULTIPLY': [' * ', Blockly.Python.ORDER_MULTIPLICATIVE], - 'DIVIDE': [' / ', Blockly.Python.ORDER_MULTIPLICATIVE], - 'POWER': [' ** ', Blockly.Python.ORDER_EXPONENTIATION] - }; - var tuple = OPERATORS[block.getFieldValue('OP')]; - var operator = tuple[0]; - var order = tuple[1]; - var argument0 = Blockly.Python.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'B', order) || '0'; - var code = argument0 + operator + argument1; - return [code, order]; - // In case of 'DIVIDE', division between integers returns different results - // in Python 2 and 3. However, is not an issue since Blockly does not - // guarantee identical results in all languages. To do otherwise would - // require every operator to be wrapped in a function call. This would kill - // legibility of the generated code. -}; - -Blockly.Python['math_single'] = function(block) { - // Math operators with single operand. - var operator = block.getFieldValue('OP'); - var code; - var arg; - if (operator == 'NEG') { - // Negation is a special case given its different operator precedence. - var code = Blockly.Python.valueToCode(block, 'NUM', - Blockly.Python.ORDER_UNARY_SIGN) || '0'; - return ['-' + code, Blockly.Python.ORDER_UNARY_SIGN]; - } - Blockly.Python.definitions_['import_math'] = 'import math'; - if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.Python.valueToCode(block, 'NUM', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - } else { - arg = Blockly.Python.valueToCode(block, 'NUM', - Blockly.Python.ORDER_NONE) || '0'; - } - // First, handle cases which generate values that don't need parentheses - // wrapping the code. - switch (operator) { - case 'ABS': - code = 'math.fabs(' + arg + ')'; - break; - case 'ROOT': - code = 'math.sqrt(' + arg + ')'; - break; - case 'LN': - code = 'math.log(' + arg + ')'; - break; - case 'LOG10': - code = 'math.log10(' + arg + ')'; - break; - case 'EXP': - code = 'math.exp(' + arg + ')'; - break; - case 'POW10': - code = 'math.pow(10,' + arg + ')'; - break; - case 'ROUND': - code = 'round(' + arg + ')'; - break; - case 'ROUNDUP': - code = 'math.ceil(' + arg + ')'; - break; - case 'ROUNDDOWN': - code = 'math.floor(' + arg + ')'; - break; - case 'SIN': - code = 'math.sin(' + arg + ' / 180.0 * math.pi)'; - break; - case 'COS': - code = 'math.cos(' + arg + ' / 180.0 * math.pi)'; - break; - case 'TAN': - code = 'math.tan(' + arg + ' / 180.0 * math.pi)'; - break; - } - if (code) { - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } - // Second, handle cases which generate values that may need parentheses - // wrapping the code. - switch (operator) { - case 'ASIN': - code = 'math.asin(' + arg + ') / math.pi * 180'; - break; - case 'ACOS': - code = 'math.acos(' + arg + ') / math.pi * 180'; - break; - case 'ATAN': - code = 'math.atan(' + arg + ') / math.pi * 180'; - break; - default: - throw 'Unknown math operator: ' + operator; - } - return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Python['math_constant'] = function(block) { - // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. - var CONSTANTS = { - 'PI': ['math.pi', Blockly.Python.ORDER_MEMBER], - 'E': ['math.e', Blockly.Python.ORDER_MEMBER], - 'GOLDEN_RATIO': ['(1 + math.sqrt(5)) / 2', - Blockly.Python.ORDER_MULTIPLICATIVE], - 'SQRT2': ['math.sqrt(2)', Blockly.Python.ORDER_MEMBER], - 'SQRT1_2': ['math.sqrt(1.0 / 2)', Blockly.Python.ORDER_MEMBER], - 'INFINITY': ['float(\'inf\')', Blockly.Python.ORDER_ATOMIC] - }; - var constant = block.getFieldValue('CONSTANT'); - if (constant != 'INFINITY') { - Blockly.Python.definitions_['import_math'] = 'import math'; - } - return CONSTANTS[constant]; -}; - -Blockly.Python['math_number_property'] = function(block) { - // Check if a number is even, odd, prime, whole, positive, or negative - // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.Python.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - var dropdown_property = block.getFieldValue('PROPERTY'); - var code; - if (dropdown_property == 'PRIME') { - Blockly.Python.definitions_['import_math'] = 'import math'; - Blockly.Python.definitions_['from_numbers_import_Number'] = - 'from numbers import Number'; - var functionName = Blockly.Python.provideFunction_( - 'math_isPrime', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(n):', - ' # https://en.wikipedia.org/wiki/Primality_test#Naive_methods', - ' # If n is not a number but a string, try parsing it.', - ' if not isinstance(n, Number):', - ' try:', - ' n = float(n)', - ' except:', - ' return False', - ' if n == 2 or n == 3:', - ' return True', - ' # False if n is negative, is 1, or not whole,' + - ' or if n is divisible by 2 or 3.', - ' if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:', - ' return False', - ' # Check all the numbers of form 6k +/- 1, up to sqrt(n).', - ' for x in range(6, int(math.sqrt(n)) + 2, 6):', - ' if n % (x - 1) == 0 or n % (x + 1) == 0:', - ' return False', - ' return True']); - code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } - switch (dropdown_property) { - case 'EVEN': - code = number_to_check + ' % 2 == 0'; - break; - case 'ODD': - code = number_to_check + ' % 2 == 1'; - break; - case 'WHOLE': - code = number_to_check + ' % 1 == 0'; - break; - case 'POSITIVE': - code = number_to_check + ' > 0'; - break; - case 'NEGATIVE': - code = number_to_check + ' < 0'; - break; - case 'DIVISIBLE_BY': - var divisor = Blockly.Python.valueToCode(block, 'DIVISOR', - Blockly.Python.ORDER_MULTIPLICATIVE); - // If 'divisor' is some code that evals to 0, Python will raise an error. - if (!divisor || divisor == '0') { - return ['False', Blockly.Python.ORDER_ATOMIC]; - } - code = number_to_check + ' % ' + divisor + ' == 0'; - break; - } - return [code, Blockly.Python.ORDER_RELATIONAL]; -}; - -Blockly.Python['math_change'] = function(block) { - // Add to a variable in place. - Blockly.Python.definitions_['from_numbers_import_Number'] = - 'from numbers import Number'; - var argument0 = Blockly.Python.valueToCode(block, 'DELTA', - Blockly.Python.ORDER_ADDITIVE) || '0'; - var varName = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return varName + ' = (' + varName + ' if isinstance(' + varName + - ', Number) else 0) + ' + argument0 + '\n'; -}; - -// Rounding functions have a single operand. -Blockly.Python['math_round'] = Blockly.Python['math_single']; -// Trigonometry functions have a single operand. -Blockly.Python['math_trig'] = Blockly.Python['math_single']; - -Blockly.Python['math_on_list'] = function(block) { - // Math functions for lists. - var func = block.getFieldValue('OP'); - var list = Blockly.Python.valueToCode(block, 'LIST', - Blockly.Python.ORDER_NONE) || '[]'; - var code; - switch (func) { - case 'SUM': - code = 'sum(' + list + ')'; - break; - case 'MIN': - code = 'min(' + list + ')'; - break; - case 'MAX': - code = 'max(' + list + ')'; - break; - case 'AVERAGE': - Blockly.Python.definitions_['from_numbers_import_Number'] = - 'from numbers import Number'; - var functionName = Blockly.Python.provideFunction_( - 'math_mean', - // This operation excludes null and values that aren't int or float:', - // math_mean([null, null, "aString", 1, 9]) == 5.0.', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', - ' localList = [e for e in myList if isinstance(e, Number)]', - ' if not localList: return', - ' return float(sum(localList)) / len(localList)']); - code = functionName + '(' + list + ')'; - break; - case 'MEDIAN': - Blockly.Python.definitions_['from_numbers_import_Number'] = - 'from numbers import Number'; - var functionName = Blockly.Python.provideFunction_( - 'math_median', - // This operation excludes null values: - // math_median([null, null, 1, 3]) == 2.0. - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', - ' localList = sorted([e for e in myList if isinstance(e, Number)])', - ' if not localList: return', - ' if len(localList) % 2 == 0:', - ' return (localList[len(localList) // 2 - 1] + ' + - 'localList[len(localList) // 2]) / 2.0', - ' else:', - ' return localList[(len(localList) - 1) // 2]']); - code = functionName + '(' + list + ')'; - break; - case 'MODE': - var functionName = Blockly.Python.provideFunction_( - 'math_modes', - // As a list of numbers can contain more than one mode, - // the returned result is provided as an array. - // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(some_list):', - ' modes = []', - ' # Using a lists of [item, count] to keep count rather than dict', - ' # to avoid "unhashable" errors when the counted item is ' + - 'itself a list or dict.', - ' counts = []', - ' maxCount = 1', - ' for item in some_list:', - ' found = False', - ' for count in counts:', - ' if count[0] == item:', - ' count[1] += 1', - ' maxCount = max(maxCount, count[1])', - ' found = True', - ' if not found:', - ' counts.append([item, 1])', - ' for counted_item, item_count in counts:', - ' if item_count == maxCount:', - ' modes.append(counted_item)', - ' return modes']); - code = functionName + '(' + list + ')'; - break; - case 'STD_DEV': - Blockly.Python.definitions_['import_math'] = 'import math'; - var functionName = Blockly.Python.provideFunction_( - 'math_standard_deviation', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(numbers):', - ' n = len(numbers)', - ' if n == 0: return', - ' mean = float(sum(numbers)) / n', - ' variance = sum((x - mean) ** 2 for x in numbers) / n', - ' return math.sqrt(variance)']); - code = functionName + '(' + list + ')'; - break; - case 'RANDOM': - Blockly.Python.definitions_['import_random'] = 'import random'; - code = 'random.choice(' + list + ')'; - break; - default: - throw 'Unknown operator: ' + func; - } - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['math_modulo'] = function(block) { - // Remainder computation. - var argument0 = Blockly.Python.valueToCode(block, 'DIVIDEND', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'DIVISOR', - Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; - var code = argument0 + ' % ' + argument1; - return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; -}; - -Blockly.Python['math_constrain'] = function(block) { - // Constrain a number between two limits. - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'LOW', - Blockly.Python.ORDER_NONE) || '0'; - var argument2 = Blockly.Python.valueToCode(block, 'HIGH', - Blockly.Python.ORDER_NONE) || 'float(\'inf\')'; - var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + - argument2 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['math_random_int'] = function(block) { - // Random integer between [X] and [Y]. - Blockly.Python.definitions_['import_random'] = 'import random'; - var argument0 = Blockly.Python.valueToCode(block, 'FROM', - Blockly.Python.ORDER_NONE) || '0'; - var argument1 = Blockly.Python.valueToCode(block, 'TO', - Blockly.Python.ORDER_NONE) || '0'; - var code = 'random.randint(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['math_random_float'] = function(block) { - // Random fraction between 0 and 1. - Blockly.Python.definitions_['import_random'] = 'import random'; - return ['random.random()', Blockly.Python.ORDER_FUNCTION_CALL]; -}; diff --git a/generators/python/procedures.js b/generators/python/procedures.js deleted file mode 100644 index 6d11df8c20..0000000000 --- a/generators/python/procedures.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating Python for procedure blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Python.procedures'); - -goog.require('Blockly.Python'); - - -Blockly.Python['procedures_defreturn'] = function(block) { - // Define a procedure with a return value. - // First, add a 'global' statement for every variable that is assigned. - var globals = Blockly.Variables.allVariables(block); - for (var i = globals.length - 1; i >= 0; i--) { - var varName = globals[i]; - if (block.arguments_.indexOf(varName) == -1) { - globals[i] = Blockly.Python.variableDB_.getName(varName, - Blockly.Variables.NAME_TYPE); - } else { - // This variable is actually a parameter name. Do not include it in - // the list of globals, thus allowing it be of local scope. - globals.splice(i, 1); - } - } - globals = globals.length ? ' global ' + globals.join(', ') + '\n' : ''; - var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var branch = Blockly.Python.statementToCode(block, 'STACK'); - if (Blockly.Python.STATEMENT_PREFIX) { - branch = Blockly.Python.prefixLines( - Blockly.Python.STATEMENT_PREFIX.replace(/%1/g, - '\'' + block.id + '\''), Blockly.Python.INDENT) + branch; - } - if (Blockly.Python.INFINITE_LOOP_TRAP) { - branch = Blockly.Python.INFINITE_LOOP_TRAP.replace(/%1/g, - '"' + block.id + '"') + branch; - } - var returnValue = Blockly.Python.valueToCode(block, 'RETURN', - Blockly.Python.ORDER_NONE) || ''; - if (returnValue) { - returnValue = ' return ' + returnValue + '\n'; - } else if (!branch) { - branch = Blockly.Python.PASS; - } - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Python.variableDB_.getName(block.arguments_[x], - Blockly.Variables.NAME_TYPE); - } - var code = 'def ' + funcName + '(' + args.join(', ') + '):\n' + - globals + branch + returnValue; - code = Blockly.Python.scrub_(block, code); - Blockly.Python.definitions_[funcName] = code; - return null; -}; - -// Defining a procedure without a return value uses the same generator as -// a procedure with a return value. -Blockly.Python['procedures_defnoreturn'] = - Blockly.Python['procedures_defreturn']; - -Blockly.Python['procedures_callreturn'] = function(block) { - // Call a procedure with a return value. - var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Python.valueToCode(block, 'ARG' + x, - Blockly.Python.ORDER_NONE) || 'None'; - } - var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['procedures_callnoreturn'] = function(block) { - // Call a procedure with no return value. - var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var x = 0; x < block.arguments_.length; x++) { - args[x] = Blockly.Python.valueToCode(block, 'ARG' + x, - Blockly.Python.ORDER_NONE) || 'None'; - } - var code = funcName + '(' + args.join(', ') + ')\n'; - return code; -}; - -Blockly.Python['procedures_ifreturn'] = function(block) { - // Conditionally return value from a procedure. - var condition = Blockly.Python.valueToCode(block, 'CONDITION', - Blockly.Python.ORDER_NONE) || 'False'; - var code = 'if ' + condition + ':\n'; - if (block.hasReturnValue_) { - var value = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || 'None'; - code += ' return ' + value + '\n'; - } else { - code += ' return\n'; - } - return code; -}; diff --git a/generators/python/text.js b/generators/python/text.js deleted file mode 100644 index 7d3797b545..0000000000 --- a/generators/python/text.js +++ /dev/null @@ -1,262 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating Python for text blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.texts'); - -goog.require('Blockly.Python'); - - -Blockly.Python['text'] = function(block) { - // Text value. - var code = Blockly.Python.quote_(block.getFieldValue('TEXT')); - return [code, Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['text_join'] = function(block) { - // Create a string made up of any number of elements of any type. - //Should we allow joining by '-' or ',' or any other characters? - var code; - if (block.itemCount_ == 0) { - return ['\'\'', Blockly.Python.ORDER_ATOMIC]; - } else if (block.itemCount_ == 1) { - var argument0 = Blockly.Python.valueToCode(block, 'ADD0', - Blockly.Python.ORDER_NONE) || '\'\''; - code = 'str(' + argument0 + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } else if (block.itemCount_ == 2) { - var argument0 = Blockly.Python.valueToCode(block, 'ADD0', - Blockly.Python.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Python.valueToCode(block, 'ADD1', - Blockly.Python.ORDER_NONE) || '\'\''; - var code = 'str(' + argument0 + ') + str(' + argument1 + ')'; - return [code, Blockly.Python.ORDER_UNARY_SIGN]; - } else { - var code = []; - for (var n = 0; n < block.itemCount_; n++) { - code[n] = Blockly.Python.valueToCode(block, 'ADD' + n, - Blockly.Python.ORDER_NONE) || '\'\''; - } - var tempVar = Blockly.Python.variableDB_.getDistinctName('temp_value', - Blockly.Variables.NAME_TYPE); - code = '\'\'.join([str(' + tempVar + ') for ' + tempVar + ' in [' + - code.join(', ') + ']])'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } -}; - -Blockly.Python['text_append'] = function(block) { - // Append to a variable in place. - var varName = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - var argument0 = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_NONE) || '\'\''; - return varName + ' = str(' + varName + ') + str(' + argument0 + ')\n'; -}; - -Blockly.Python['text_length'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '\'\''; - return ['len(' + argument0 + ')', Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['text_isEmpty'] = function(block) { - // Is the string null or array empty? - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '\'\''; - var code = 'not len(' + argument0 + ')'; - return [code, Blockly.Python.ORDER_LOGICAL_NOT]; -}; - -Blockly.Python['text_indexOf'] = function(block) { - // Search the text for a substring. - // Should we allow for non-case sensitive??? - var operator = block.getFieldValue('END') == 'FIRST' ? 'find' : 'rfind'; - var argument0 = Blockly.Python.valueToCode(block, 'FIND', - Blockly.Python.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code = argument1 + '.' + operator + '(' + argument0 + ') + 1'; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['text_charAt'] = function(block) { - // Get letter at index. - // Note: Until January 2013 this block did not have the WHERE input. - var where = block.getFieldValue('WHERE') || 'FROM_START'; - var at = Blockly.Python.valueToCode(block, 'AT', - Blockly.Python.ORDER_UNARY_SIGN) || '1'; - var text = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_MEMBER) || '\'\''; - switch (where) { - case 'FIRST': - var code = text + '[0]'; - return [code, Blockly.Python.ORDER_MEMBER]; - case 'LAST': - var code = text + '[-1]'; - return [code, Blockly.Python.ORDER_MEMBER]; - case 'FROM_START': - // Blockly uses one-based indicies. - if (Blockly.isNumber(at)) { - // If the index is a naked number, decrement it right now. - at = parseInt(at, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at = 'int(' + at + ' - 1)'; - } - var code = text + '[' + at + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; - case 'FROM_END': - var code = text + '[-' + at + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; - case 'RANDOM': - Blockly.Python.definitions_['import_random'] = 'import random'; - var functionName = Blockly.Python.provideFunction_( - 'text_random_letter', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(text):', - ' x = int(random.random() * len(text))', - ' return text[x];']); - code = functionName + '(' + text + ')'; - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; - } - throw 'Unhandled option (text_charAt).'; -}; - -Blockly.Python['text_getSubstring'] = function(block) { - // Get substring. - var text = Blockly.Python.valueToCode(block, 'STRING', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var where1 = block.getFieldValue('WHERE1'); - var where2 = block.getFieldValue('WHERE2'); - var at1 = Blockly.Python.valueToCode(block, 'AT1', - Blockly.Python.ORDER_ADDITIVE) || '1'; - var at2 = Blockly.Python.valueToCode(block, 'AT2', - Blockly.Python.ORDER_ADDITIVE) || '1'; - if (where1 == 'FIRST' || (where1 == 'FROM_START' && at1 == '1')) { - at1 = ''; - } else if (where1 == 'FROM_START') { - // Blockly uses one-based indicies. - if (Blockly.isNumber(at1)) { - // If the index is a naked number, decrement it right now. - at1 = parseInt(at1, 10) - 1; - } else { - // If the index is dynamic, decrement it in code. - at1 = 'int(' + at1 + ' - 1)'; - } - } else if (where1 == 'FROM_END') { - if (Blockly.isNumber(at1)) { - at1 = -parseInt(at1, 10); - } else { - at1 = '-int(' + at1 + ')'; - } - } - if (where2 == 'LAST' || (where2 == 'FROM_END' && at2 == '1')) { - at2 = ''; - } else if (where1 == 'FROM_START') { - if (Blockly.isNumber(at2)) { - at2 = parseInt(at2, 10); - } else { - at2 = 'int(' + at2 + ')'; - } - } else if (where1 == 'FROM_END') { - if (Blockly.isNumber(at2)) { - // If the index is a naked number, increment it right now. - at2 = 1 - parseInt(at2, 10); - if (at2 == 0) { - at2 = ''; - } - } else { - // If the index is dynamic, increment it in code. - // Add special case for -0. - Blockly.Python.definitions_['import_sys'] = 'import sys'; - at2 = 'int(1 - ' + at2 + ') or sys.maxsize'; - } - } - var code = text + '[' + at1 + ' : ' + at2 + ']'; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['text_changeCase'] = function(block) { - // Change capitalization. - var OPERATORS = { - 'UPPERCASE': '.upper()', - 'LOWERCASE': '.lower()', - 'TITLECASE': '.title()' - }; - var operator = OPERATORS[block.getFieldValue('CASE')]; - var argument0 = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code = argument0 + operator; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['text_trim'] = function(block) { - // Trim spaces. - var OPERATORS = { - 'LEFT': '.lstrip()', - 'RIGHT': '.rstrip()', - 'BOTH': '.strip()' - }; - var operator = OPERATORS[block.getFieldValue('MODE')]; - var argument0 = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_MEMBER) || '\'\''; - var code = argument0 + operator; - return [code, Blockly.Python.ORDER_MEMBER]; -}; - -Blockly.Python['text_print'] = function(block) { - // Print statement. - var argument0 = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_NONE) || '\'\''; - return 'print(' + argument0 + ')\n'; -}; - -Blockly.Python['text_prompt_ext'] = function(block) { - // Prompt function. - var functionName = Blockly.Python.provideFunction_( - 'text_prompt', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(msg):', - ' try:', - ' return raw_input(msg)', - ' except NameError:', - ' return input(msg)']); - if (block.getField('TEXT')) { - // Internal message. - var msg = Blockly.Python.quote_(block.getFieldValue('TEXT')); - } else { - // External message. - var msg = Blockly.Python.valueToCode(block, 'TEXT', - Blockly.Python.ORDER_NONE) || '\'\''; - } - var code = functionName + '(' + msg + ')'; - var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; - if (toNumber) { - code = 'float(' + code + ')'; - } - return [code, Blockly.Python.ORDER_FUNCTION_CALL]; -}; - -Blockly.Python['text_prompt'] = Blockly.Python['text_prompt_ext']; diff --git a/generators/python/variables.js b/generators/python/variables.js deleted file mode 100644 index 00d9971af1..0000000000 --- a/generators/python/variables.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating Python for variable blocks. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Python.variables'); - -goog.require('Blockly.Python'); - - -Blockly.Python['variables_get'] = function(block) { - // Variable getter. - var code = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return [code, Blockly.Python.ORDER_ATOMIC]; -}; - -Blockly.Python['variables_set'] = function(block) { - // Variable setter. - var argument0 = Blockly.Python.valueToCode(block, 'VALUE', - Blockly.Python.ORDER_NONE) || '0'; - var varName = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), - Blockly.Variables.NAME_TYPE); - return varName + ' = ' + argument0 + '\n'; -}; diff --git a/javascript_compressed.js b/javascript_compressed.js deleted file mode 100644 index d1b51ae87b..0000000000 --- a/javascript_compressed.js +++ /dev/null @@ -1,81 +0,0 @@ -// Do not edit this file; automatically generated by build.py. -'use strict'; - - -// Copyright 2012 Google Inc. Apache License 2.0 -Blockly.JavaScript=new Blockly.Generator("JavaScript");Blockly.JavaScript.addReservedWords("Blockly,break,case,catch,continue,debugger,default,delete,do,else,finally,for,function,if,in,instanceof,new,return,switch,this,throw,try,typeof,var,void,while,with,class,enum,export,extends,import,super,implements,interface,let,package,private,protected,public,static,yield,const,null,true,false,Array,ArrayBuffer,Boolean,Date,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Error,eval,EvalError,Float32Array,Float64Array,Function,Infinity,Int16Array,Int32Array,Int8Array,isFinite,isNaN,Iterator,JSON,Math,NaN,Number,Object,parseFloat,parseInt,RangeError,ReferenceError,RegExp,StopIteration,String,SyntaxError,TypeError,Uint16Array,Uint32Array,Uint8Array,Uint8ClampedArray,undefined,uneval,URIError,applicationCache,closed,Components,content,_content,controllers,crypto,defaultStatus,dialogArguments,directories,document,frameElement,frames,fullScreen,globalStorage,history,innerHeight,innerWidth,length,location,locationbar,localStorage,menubar,messageManager,mozAnimationStartTime,mozInnerScreenX,mozInnerScreenY,mozPaintCount,name,navigator,opener,outerHeight,outerWidth,pageXOffset,pageYOffset,parent,performance,personalbar,pkcs11,returnValue,screen,screenX,screenY,scrollbars,scrollMaxX,scrollMaxY,scrollX,scrollY,self,sessionStorage,sidebar,status,statusbar,toolbar,top,URL,window,addEventListener,alert,atob,back,blur,btoa,captureEvents,clearImmediate,clearInterval,clearTimeout,close,confirm,disableExternalCapture,dispatchEvent,dump,enableExternalCapture,escape,find,focus,forward,GeckoActiveXObject,getAttention,getAttentionWithCycleCount,getComputedStyle,getSelection,home,matchMedia,maximize,minimize,moveBy,moveTo,mozRequestAnimationFrame,open,openDialog,postMessage,print,prompt,QueryInterface,releaseEvents,removeEventListener,resizeBy,resizeTo,restore,routeEvent,scroll,scrollBy,scrollByLines,scrollByPages,scrollTo,setCursor,setImmediate,setInterval,setResizable,setTimeout,showModalDialog,sizeToContent,stop,unescape,updateCommands,XPCNativeWrapper,XPCSafeJSObjectWrapper,onabort,onbeforeunload,onblur,onchange,onclick,onclose,oncontextmenu,ondevicemotion,ondeviceorientation,ondragdrop,onerror,onfocus,onhashchange,onkeydown,onkeypress,onkeyup,onload,onmousedown,onmousemove,onmouseout,onmouseover,onmouseup,onmozbeforepaint,onpaint,onpopstate,onreset,onresize,onscroll,onselect,onsubmit,onunload,onpageshow,onpagehide,Image,Option,Worker,Event,Range,File,FileReader,Blob,BlobBuilder,Attr,CDATASection,CharacterData,Comment,console,DocumentFragment,DocumentType,DomConfiguration,DOMError,DOMErrorHandler,DOMException,DOMImplementation,DOMImplementationList,DOMImplementationRegistry,DOMImplementationSource,DOMLocator,DOMObject,DOMString,DOMStringList,DOMTimeStamp,DOMUserData,Entity,EntityReference,MediaQueryList,MediaQueryListListener,NameList,NamedNodeMap,Node,NodeFilter,NodeIterator,NodeList,Notation,Plugin,PluginArray,ProcessingInstruction,SharedWorker,Text,TimeRanges,Treewalker,TypeInfo,UserDataHandler,Worker,WorkerGlobalScope,HTMLDocument,HTMLElement,HTMLAnchorElement,HTMLAppletElement,HTMLAudioElement,HTMLAreaElement,HTMLBaseElement,HTMLBaseFontElement,HTMLBodyElement,HTMLBRElement,HTMLButtonElement,HTMLCanvasElement,HTMLDirectoryElement,HTMLDivElement,HTMLDListElement,HTMLEmbedElement,HTMLFieldSetElement,HTMLFontElement,HTMLFormElement,HTMLFrameElement,HTMLFrameSetElement,HTMLHeadElement,HTMLHeadingElement,HTMLHtmlElement,HTMLHRElement,HTMLIFrameElement,HTMLImageElement,HTMLInputElement,HTMLKeygenElement,HTMLLabelElement,HTMLLIElement,HTMLLinkElement,HTMLMapElement,HTMLMenuElement,HTMLMetaElement,HTMLModElement,HTMLObjectElement,HTMLOListElement,HTMLOptGroupElement,HTMLOptionElement,HTMLOutputElement,HTMLParagraphElement,HTMLParamElement,HTMLPreElement,HTMLQuoteElement,HTMLScriptElement,HTMLSelectElement,HTMLSourceElement,HTMLSpanElement,HTMLStyleElement,HTMLTableElement,HTMLTableCaptionElement,HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement,HTMLTableColElement,HTMLTableRowElement,HTMLTableSectionElement,HTMLTextAreaElement,HTMLTimeElement,HTMLTitleElement,HTMLTrackElement,HTMLUListElement,HTMLUnknownElement,HTMLVideoElement,HTMLCanvasElement,CanvasRenderingContext2D,CanvasGradient,CanvasPattern,TextMetrics,ImageData,CanvasPixelArray,HTMLAudioElement,HTMLVideoElement,NotifyAudioAvailableEvent,HTMLCollection,HTMLAllCollection,HTMLFormControlsCollection,HTMLOptionsCollection,HTMLPropertiesCollection,DOMTokenList,DOMSettableTokenList,DOMStringMap,RadioNodeList,SVGDocument,SVGElement,SVGAElement,SVGAltGlyphElement,SVGAltGlyphDefElement,SVGAltGlyphItemElement,SVGAnimationElement,SVGAnimateElement,SVGAnimateColorElement,SVGAnimateMotionElement,SVGAnimateTransformElement,SVGSetElement,SVGCircleElement,SVGClipPathElement,SVGColorProfileElement,SVGCursorElement,SVGDefsElement,SVGDescElement,SVGEllipseElement,SVGFilterElement,SVGFilterPrimitiveStandardAttributes,SVGFEBlendElement,SVGFEColorMatrixElement,SVGFEComponentTransferElement,SVGFECompositeElement,SVGFEConvolveMatrixElement,SVGFEDiffuseLightingElement,SVGFEDisplacementMapElement,SVGFEDistantLightElement,SVGFEFloodElement,SVGFEGaussianBlurElement,SVGFEImageElement,SVGFEMergeElement,SVGFEMergeNodeElement,SVGFEMorphologyElement,SVGFEOffsetElement,SVGFEPointLightElement,SVGFESpecularLightingElement,SVGFESpotLightElement,SVGFETileElement,SVGFETurbulenceElement,SVGComponentTransferFunctionElement,SVGFEFuncRElement,SVGFEFuncGElement,SVGFEFuncBElement,SVGFEFuncAElement,SVGFontElement,SVGFontFaceElement,SVGFontFaceFormatElement,SVGFontFaceNameElement,SVGFontFaceSrcElement,SVGFontFaceUriElement,SVGForeignObjectElement,SVGGElement,SVGGlyphElement,SVGGlyphRefElement,SVGGradientElement,SVGLinearGradientElement,SVGRadialGradientElement,SVGHKernElement,SVGImageElement,SVGLineElement,SVGMarkerElement,SVGMaskElement,SVGMetadataElement,SVGMissingGlyphElement,SVGMPathElement,SVGPathElement,SVGPatternElement,SVGPolylineElement,SVGPolygonElement,SVGRectElement,SVGScriptElement,SVGStopElement,SVGStyleElement,SVGSVGElement,SVGSwitchElement,SVGSymbolElement,SVGTextElement,SVGTextPathElement,SVGTitleElement,SVGTRefElement,SVGTSpanElement,SVGUseElement,SVGViewElement,SVGVKernElement,SVGAngle,SVGColor,SVGICCColor,SVGElementInstance,SVGElementInstanceList,SVGLength,SVGLengthList,SVGMatrix,SVGNumber,SVGNumberList,SVGPaint,SVGPoint,SVGPointList,SVGPreserveAspectRatio,SVGRect,SVGStringList,SVGTransform,SVGTransformList,SVGAnimatedAngle,SVGAnimatedBoolean,SVGAnimatedEnumeration,SVGAnimatedInteger,SVGAnimatedLength,SVGAnimatedLengthList,SVGAnimatedNumber,SVGAnimatedNumberList,SVGAnimatedPreserveAspectRatio,SVGAnimatedRect,SVGAnimatedString,SVGAnimatedTransformList,SVGPathSegList,SVGPathSeg,SVGPathSegArcAbs,SVGPathSegArcRel,SVGPathSegClosePath,SVGPathSegCurvetoCubicAbs,SVGPathSegCurvetoCubicRel,SVGPathSegCurvetoCubicSmoothAbs,SVGPathSegCurvetoCubicSmoothRel,SVGPathSegCurvetoQuadraticAbs,SVGPathSegCurvetoQuadraticRel,SVGPathSegCurvetoQuadraticSmoothAbs,SVGPathSegCurvetoQuadraticSmoothRel,SVGPathSegLinetoAbs,SVGPathSegLinetoHorizontalAbs,SVGPathSegLinetoHorizontalRel,SVGPathSegLinetoRel,SVGPathSegLinetoVerticalAbs,SVGPathSegLinetoVerticalRel,SVGPathSegMovetoAbs,SVGPathSegMovetoRel,ElementTimeControl,TimeEvent,SVGAnimatedPathData,SVGAnimatedPoints,SVGColorProfileRule,SVGCSSRule,SVGExternalResourcesRequired,SVGFitToViewBox,SVGLangSpace,SVGLocatable,SVGRenderingIntent,SVGStylable,SVGTests,SVGTextContentElement,SVGTextPositioningElement,SVGTransformable,SVGUnitTypes,SVGURIReference,SVGViewSpec,SVGZoomAndPan"); -Blockly.JavaScript.ORDER_ATOMIC=0;Blockly.JavaScript.ORDER_MEMBER=1;Blockly.JavaScript.ORDER_NEW=1;Blockly.JavaScript.ORDER_FUNCTION_CALL=2;Blockly.JavaScript.ORDER_INCREMENT=3;Blockly.JavaScript.ORDER_DECREMENT=3;Blockly.JavaScript.ORDER_LOGICAL_NOT=4;Blockly.JavaScript.ORDER_BITWISE_NOT=4;Blockly.JavaScript.ORDER_UNARY_PLUS=4;Blockly.JavaScript.ORDER_UNARY_NEGATION=4;Blockly.JavaScript.ORDER_TYPEOF=4;Blockly.JavaScript.ORDER_VOID=4;Blockly.JavaScript.ORDER_DELETE=4; -Blockly.JavaScript.ORDER_MULTIPLICATION=5;Blockly.JavaScript.ORDER_DIVISION=5;Blockly.JavaScript.ORDER_MODULUS=5;Blockly.JavaScript.ORDER_ADDITION=6;Blockly.JavaScript.ORDER_SUBTRACTION=6;Blockly.JavaScript.ORDER_BITWISE_SHIFT=7;Blockly.JavaScript.ORDER_RELATIONAL=8;Blockly.JavaScript.ORDER_IN=8;Blockly.JavaScript.ORDER_INSTANCEOF=8;Blockly.JavaScript.ORDER_EQUALITY=9;Blockly.JavaScript.ORDER_BITWISE_AND=10;Blockly.JavaScript.ORDER_BITWISE_XOR=11;Blockly.JavaScript.ORDER_BITWISE_OR=12; -Blockly.JavaScript.ORDER_LOGICAL_AND=13;Blockly.JavaScript.ORDER_LOGICAL_OR=14;Blockly.JavaScript.ORDER_CONDITIONAL=15;Blockly.JavaScript.ORDER_ASSIGNMENT=16;Blockly.JavaScript.ORDER_COMMA=17;Blockly.JavaScript.ORDER_NONE=99; -Blockly.JavaScript.init=function(a){Blockly.JavaScript.definitions_=Object.create(null);Blockly.JavaScript.functionNames_=Object.create(null);Blockly.JavaScript.variableDB_?Blockly.JavaScript.variableDB_.reset():Blockly.JavaScript.variableDB_=new Blockly.Names(Blockly.JavaScript.RESERVED_WORDS_);var b=[];a=Blockly.Variables.allVariables(a);for(var c=0;c",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.JavaScript.ORDER_EQUALITY:Blockly.JavaScript.ORDER_RELATIONAL,d=Blockly.JavaScript.valueToCode(a,"A",c)||"0";a=Blockly.JavaScript.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -Blockly.JavaScript.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.JavaScript.ORDER_LOGICAL_AND:Blockly.JavaScript.ORDER_LOGICAL_OR,d=Blockly.JavaScript.valueToCode(a,"A",c);a=Blockly.JavaScript.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]}; -Blockly.JavaScript.logic_negate=function(a){var b=Blockly.JavaScript.ORDER_LOGICAL_NOT;return["!"+(Blockly.JavaScript.valueToCode(a,"BOOL",b)||"true"),b]};Blockly.JavaScript.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.logic_null=function(a){return["null",Blockly.JavaScript.ORDER_ATOMIC]}; -Blockly.JavaScript.logic_ternary=function(a){var b=Blockly.JavaScript.valueToCode(a,"IF",Blockly.JavaScript.ORDER_CONDITIONAL)||"false",c=Blockly.JavaScript.valueToCode(a,"THEN",Blockly.JavaScript.ORDER_CONDITIONAL)||"null";a=Blockly.JavaScript.valueToCode(a,"ELSE",Blockly.JavaScript.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.JavaScript.ORDER_CONDITIONAL]};Blockly.JavaScript.loops={}; -Blockly.JavaScript.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):Blockly.JavaScript.valueToCode(a,"TIMES",Blockly.JavaScript.ORDER_ASSIGNMENT)||"0",c=Blockly.JavaScript.statementToCode(a,"DO"),c=Blockly.JavaScript.addLoopTrap(c,a.id);a="";var d=Blockly.JavaScript.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE),e=b;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.JavaScript.variableDB_.getDistinctName("repeat_end",Blockly.Variables.NAME_TYPE), -a+="var "+e+" = "+b+";\n");return a+("for (var "+d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};Blockly.JavaScript.controls_repeat=Blockly.JavaScript.controls_repeat_ext; -Blockly.JavaScript.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.JavaScript.valueToCode(a,"BOOL",b?Blockly.JavaScript.ORDER_LOGICAL_NOT:Blockly.JavaScript.ORDER_NONE)||"false",d=Blockly.JavaScript.statementToCode(a,"DO"),d=Blockly.JavaScript.addLoopTrap(d,a.id);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; -Blockly.JavaScript.controls_for=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.JavaScript.valueToCode(a,"FROM",Blockly.JavaScript.ORDER_ASSIGNMENT)||"0",d=Blockly.JavaScript.valueToCode(a,"TO",Blockly.JavaScript.ORDER_ASSIGNMENT)||"0",e=Blockly.JavaScript.valueToCode(a,"BY",Blockly.JavaScript.ORDER_ASSIGNMENT)||"1",f=Blockly.JavaScript.statementToCode(a,"DO"),f=Blockly.JavaScript.addLoopTrap(f,a.id);if(Blockly.isNumber(c)&&Blockly.isNumber(d)&& -Blockly.isNumber(e)){var g=parseFloat(c)<=parseFloat(d);a="for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(parseFloat(e));a=(1==b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b))+(") {\n"+f+"}\n")}else a="",g=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(g=Blockly.JavaScript.variableDB_.getDistinctName(b+"_start",Blockly.Variables.NAME_TYPE),a+="var "+g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.JavaScript.variableDB_.getDistinctName(b+"_end",Blockly.Variables.NAME_TYPE), -a+="var "+c+" = "+d+";\n"),d=Blockly.JavaScript.variableDB_.getDistinctName(b+"_inc",Blockly.Variables.NAME_TYPE),a+="var "+d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("Math.abs("+e+");\n"),a+="if ("+g+" > "+c+") {\n",a+=Blockly.JavaScript.INDENT+d+" = -"+d+";\n",a+="}\n",a+="for ("+b+" = "+g+";\n "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+";\n "+b+" += "+d+") {\n"+f+"}\n";return a}; -Blockly.JavaScript.controls_forEach=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_ASSIGNMENT)||"[]",d=Blockly.JavaScript.statementToCode(a,"DO"),d=Blockly.JavaScript.addLoopTrap(d,a.id);a="";var e=c;c.match(/^\w+$/)||(e=Blockly.JavaScript.variableDB_.getDistinctName(b+"_list",Blockly.Variables.NAME_TYPE),a+="var "+e+" = "+c+";\n");c=Blockly.JavaScript.variableDB_.getDistinctName(b+ -"_index",Blockly.Variables.NAME_TYPE);d=Blockly.JavaScript.INDENT+b+" = "+e+"["+c+"];\n"+d;return a+("for (var "+c+" in "+e+") {\n"+d+"}\n")};Blockly.JavaScript.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.JavaScript.math={};Blockly.JavaScript.math_number=function(a){return[parseFloat(a.getFieldValue("NUM")),Blockly.JavaScript.ORDER_ATOMIC]}; -Blockly.JavaScript.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.JavaScript.ORDER_ADDITION],MINUS:[" - ",Blockly.JavaScript.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.JavaScript.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.JavaScript.ORDER_DIVISION],POWER:[null,Blockly.JavaScript.ORDER_COMMA]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.JavaScript.valueToCode(a,"A",b)||"0";a=Blockly.JavaScript.valueToCode(a,"B",b)||"0";return c?[d+c+a,b]:["Math.pow("+d+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; -Blockly.JavaScript.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.JavaScript.valueToCode(a,"NUM",Blockly.JavaScript.ORDER_UNARY_NEGATION)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.JavaScript.ORDER_UNARY_NEGATION];a="SIN"==b||"COS"==b||"TAN"==b?Blockly.JavaScript.valueToCode(a,"NUM",Blockly.JavaScript.ORDER_DIVISION)||"0":Blockly.JavaScript.valueToCode(a,"NUM",Blockly.JavaScript.ORDER_NONE)||"0";switch(b){case "ABS":c="Math.abs("+a+")";break;case "ROOT":c="Math.sqrt("+ -a+")";break;case "LN":c="Math.log("+a+")";break;case "EXP":c="Math.exp("+a+")";break;case "POW10":c="Math.pow(10,"+a+")";break;case "ROUND":c="Math.round("+a+")";break;case "ROUNDUP":c="Math.ceil("+a+")";break;case "ROUNDDOWN":c="Math.floor("+a+")";break;case "SIN":c="Math.sin("+a+" / 180 * Math.PI)";break;case "COS":c="Math.cos("+a+" / 180 * Math.PI)";break;case "TAN":c="Math.tan("+a+" / 180 * Math.PI)"}if(c)return[c,Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(b){case "LOG10":c="Math.log("+a+ -") / Math.log(10)";break;case "ASIN":c="Math.asin("+a+") / Math.PI * 180";break;case "ACOS":c="Math.acos("+a+") / Math.PI * 180";break;case "ATAN":c="Math.atan("+a+") / Math.PI * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.JavaScript.ORDER_DIVISION]}; -Blockly.JavaScript.math_constant=function(a){return{PI:["Math.PI",Blockly.JavaScript.ORDER_MEMBER],E:["Math.E",Blockly.JavaScript.ORDER_MEMBER],GOLDEN_RATIO:["(1 + Math.sqrt(5)) / 2",Blockly.JavaScript.ORDER_DIVISION],SQRT2:["Math.SQRT2",Blockly.JavaScript.ORDER_MEMBER],SQRT1_2:["Math.SQRT1_2",Blockly.JavaScript.ORDER_MEMBER],INFINITY:["Infinity",Blockly.JavaScript.ORDER_ATOMIC]}[a.getFieldValue("CONSTANT")]}; -Blockly.JavaScript.math_number_property=function(a){var b=Blockly.JavaScript.valueToCode(a,"NUMBER_TO_CHECK",Blockly.JavaScript.ORDER_MODULUS)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return d=Blockly.JavaScript.provideFunction_("math_isPrime",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if (n == 2 || n == 3) {"," return true;"," }"," // False if n is NaN, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3.", -" if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 || n % 3 == 0) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {"," if (n % (x - 1) == 0 || n % (x + 1) == 0) {"," return false;"," }"," }"," return true;","}"])+"("+b+")",[d,Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d= -b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.JavaScript.valueToCode(a,"DIVISOR",Blockly.JavaScript.ORDER_MODULUS)||"0",d=b+" % "+a+" == 0"}return[d,Blockly.JavaScript.ORDER_EQUALITY]};Blockly.JavaScript.math_change=function(a){var b=Blockly.JavaScript.valueToCode(a,"DELTA",Blockly.JavaScript.ORDER_ADDITION)||"0";a=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = (typeof "+a+" == 'number' ? "+a+" : 0) + "+b+";\n"}; -Blockly.JavaScript.math_round=Blockly.JavaScript.math_single;Blockly.JavaScript.math_trig=Blockly.JavaScript.math_single; -Blockly.JavaScript.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_MEMBER)||"[]";a+=".reduce(function(x, y) {return x + y;})";break;case "MIN":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_COMMA)||"[]";a="Math.min.apply(null, "+a+")";break;case "MAX":a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_COMMA)||"[]";a="Math.max.apply(null, "+a+")";break;case "AVERAGE":b=Blockly.JavaScript.provideFunction_("math_mean", -["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(myList) {"," return myList.reduce(function(x, y) {return x + y;}) / myList.length;","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MEDIAN":b=Blockly.JavaScript.provideFunction_("math_median",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(myList) {"," var localList = myList.filter(function (x) {return typeof x == 'number';});"," if (!localList.length) return null;", -" localList.sort(function(a, b) {return b - a;});"," if (localList.length % 2 == 0) {"," return (localList[localList.length / 2 - 1] + localList[localList.length / 2]) / 2;"," } else {"," return localList[(localList.length - 1) / 2];"," }","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MODE":b=Blockly.JavaScript.provideFunction_("math_modes",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(values) {"," var modes = [];", -" var counts = [];"," var maxCount = 0;"," for (var i = 0; i < values.length; i++) {"," var value = values[i];"," var found = false;"," var thisCount;"," for (var j = 0; j < counts.length; j++) {"," if (counts[j][0] === value) {"," thisCount = ++counts[j][1];"," found = true;"," break;"," }"," }"," if (!found) {"," counts.push([value, 1]);"," thisCount = 1;"," }"," maxCount = Math.max(thisCount, maxCount);"," }"," for (var j = 0; j < counts.length; j++) {", -" if (counts[j][1] == maxCount) {"," modes.push(counts[j][0]);"," }"," }"," return modes;","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=Blockly.JavaScript.provideFunction_("math_standard_deviation",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(numbers) {"," var n = numbers.length;"," if (!n) return null;"," var mean = numbers.reduce(function(x, y) {return x + y;}) / n;"," var variance = 0;", -" for (var j = 0; j < n; j++) {"," variance += Math.pow(numbers[j] - mean, 2);"," }"," variance = variance / n;"," return Math.sqrt(variance);","}"]);a=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=Blockly.JavaScript.provideFunction_("math_random_list",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(list) {"," var x = Math.floor(Math.random() * list.length);"," return list[x];","}"]);a=Blockly.JavaScript.valueToCode(a, -"LIST",Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[a,Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.math_modulo=function(a){var b=Blockly.JavaScript.valueToCode(a,"DIVIDEND",Blockly.JavaScript.ORDER_MODULUS)||"0";a=Blockly.JavaScript.valueToCode(a,"DIVISOR",Blockly.JavaScript.ORDER_MODULUS)||"0";return[b+" % "+a,Blockly.JavaScript.ORDER_MODULUS]}; -Blockly.JavaScript.math_constrain=function(a){var b=Blockly.JavaScript.valueToCode(a,"VALUE",Blockly.JavaScript.ORDER_COMMA)||"0",c=Blockly.JavaScript.valueToCode(a,"LOW",Blockly.JavaScript.ORDER_COMMA)||"0";a=Blockly.JavaScript.valueToCode(a,"HIGH",Blockly.JavaScript.ORDER_COMMA)||"Infinity";return["Math.min(Math.max("+b+", "+c+"), "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; -Blockly.JavaScript.math_random_int=function(a){var b=Blockly.JavaScript.valueToCode(a,"FROM",Blockly.JavaScript.ORDER_COMMA)||"0";a=Blockly.JavaScript.valueToCode(a,"TO",Blockly.JavaScript.ORDER_COMMA)||"0";return[Blockly.JavaScript.provideFunction_("math_random_int",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(a, b) {"," if (a > b) {"," // Swap a and b to ensure a is smaller."," var c = a;"," a = b;"," b = c;"," }"," return Math.floor(Math.random() * (b - a + 1) + a);", -"}"])+"("+b+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.math_random_float=function(a){return["Math.random()",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.procedures={}; -Blockly.JavaScript.procedures_defreturn=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE),c=Blockly.JavaScript.statementToCode(a,"STACK");Blockly.JavaScript.STATEMENT_PREFIX&&(c=Blockly.JavaScript.prefixLines(Blockly.JavaScript.STATEMENT_PREFIX.replace(/%1/g,"'"+a.id+"'"),Blockly.JavaScript.INDENT)+c);Blockly.JavaScript.INFINITE_LOOP_TRAP&&(c=Blockly.JavaScript.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+c);var d=Blockly.JavaScript.valueToCode(a, -"RETURN",Blockly.JavaScript.ORDER_NONE)||"";d&&(d=" return "+d+";\n");for(var e=[],f=0;fdropdown-arrow \ No newline at end of file diff --git a/media/icons/control_forever.svg b/media/icons/control_forever.svg new file mode 100755 index 0000000000..eb095010d3 --- /dev/null +++ b/media/icons/control_forever.svg @@ -0,0 +1 @@ +control_forever \ No newline at end of file diff --git a/media/icons/control_repeat.svg b/media/icons/control_repeat.svg new file mode 100755 index 0000000000..05e9fa8db8 --- /dev/null +++ b/media/icons/control_repeat.svg @@ -0,0 +1 @@ +control_repeat \ No newline at end of file diff --git a/media/icons/control_stop.svg b/media/icons/control_stop.svg new file mode 100644 index 0000000000..d6e9a5415c --- /dev/null +++ b/media/icons/control_stop.svg @@ -0,0 +1 @@ +control_stop \ No newline at end of file diff --git a/media/icons/control_wait.svg b/media/icons/control_wait.svg new file mode 100755 index 0000000000..5291735408 --- /dev/null +++ b/media/icons/control_wait.svg @@ -0,0 +1 @@ +wait \ No newline at end of file diff --git a/media/icons/event_broadcast_blue.svg b/media/icons/event_broadcast_blue.svg new file mode 100755 index 0000000000..3ed7b5b7cf --- /dev/null +++ b/media/icons/event_broadcast_blue.svg @@ -0,0 +1 @@ +event_broadcast_blue \ No newline at end of file diff --git a/media/icons/event_broadcast_coral.svg b/media/icons/event_broadcast_coral.svg new file mode 100755 index 0000000000..241f34e465 --- /dev/null +++ b/media/icons/event_broadcast_coral.svg @@ -0,0 +1 @@ +event_broadcast_coral \ No newline at end of file diff --git a/media/icons/event_broadcast_green.svg b/media/icons/event_broadcast_green.svg new file mode 100755 index 0000000000..e61e35a362 --- /dev/null +++ b/media/icons/event_broadcast_green.svg @@ -0,0 +1 @@ +event_broadcast_green \ No newline at end of file diff --git a/media/icons/event_broadcast_magenta.svg b/media/icons/event_broadcast_magenta.svg new file mode 100755 index 0000000000..4207ff72c6 --- /dev/null +++ b/media/icons/event_broadcast_magenta.svg @@ -0,0 +1 @@ +event_broadcast_magenta \ No newline at end of file diff --git a/media/icons/event_broadcast_orange.svg b/media/icons/event_broadcast_orange.svg new file mode 100755 index 0000000000..653ce7c76a --- /dev/null +++ b/media/icons/event_broadcast_orange.svg @@ -0,0 +1 @@ +event_broadcast_orange \ No newline at end of file diff --git a/media/icons/event_broadcast_purple.svg b/media/icons/event_broadcast_purple.svg new file mode 100755 index 0000000000..547368c51b --- /dev/null +++ b/media/icons/event_broadcast_purple.svg @@ -0,0 +1 @@ +send-message-purple \ No newline at end of file diff --git a/media/icons/event_when-broadcast-received_blue.svg b/media/icons/event_when-broadcast-received_blue.svg new file mode 100755 index 0000000000..ed1f580d4a --- /dev/null +++ b/media/icons/event_when-broadcast-received_blue.svg @@ -0,0 +1 @@ +LetterGet_Blue \ No newline at end of file diff --git a/media/icons/event_when-broadcast-received_coral.svg b/media/icons/event_when-broadcast-received_coral.svg new file mode 100755 index 0000000000..05f92a40ed --- /dev/null +++ b/media/icons/event_when-broadcast-received_coral.svg @@ -0,0 +1 @@ +LetterGet_Coral \ No newline at end of file diff --git a/media/icons/event_when-broadcast-received_green.svg b/media/icons/event_when-broadcast-received_green.svg new file mode 100755 index 0000000000..e43e8a90b5 --- /dev/null +++ b/media/icons/event_when-broadcast-received_green.svg @@ -0,0 +1 @@ +LetterGet_Green \ No newline at end of file diff --git a/media/icons/event_when-broadcast-received_magenta.svg b/media/icons/event_when-broadcast-received_magenta.svg new file mode 100755 index 0000000000..c01191b65e --- /dev/null +++ b/media/icons/event_when-broadcast-received_magenta.svg @@ -0,0 +1 @@ +LetterGet_Magenta \ No newline at end of file diff --git a/media/icons/event_when-broadcast-received_orange.svg b/media/icons/event_when-broadcast-received_orange.svg new file mode 100755 index 0000000000..fa99c847b6 --- /dev/null +++ b/media/icons/event_when-broadcast-received_orange.svg @@ -0,0 +1 @@ +LetterGet_Orange \ No newline at end of file diff --git a/media/icons/event_when-broadcast-received_purple.svg b/media/icons/event_when-broadcast-received_purple.svg new file mode 100755 index 0000000000..12b163fc4a --- /dev/null +++ b/media/icons/event_when-broadcast-received_purple.svg @@ -0,0 +1 @@ +LetterGet_Purple \ No newline at end of file diff --git a/media/icons/event_whenflagclicked.svg b/media/icons/event_whenflagclicked.svg new file mode 100755 index 0000000000..ff2a3bfe91 --- /dev/null +++ b/media/icons/event_whenflagclicked.svg @@ -0,0 +1 @@ +greenflag \ No newline at end of file diff --git a/media/icons/set-led_blue.svg b/media/icons/set-led_blue.svg new file mode 100755 index 0000000000..7bb73f980a --- /dev/null +++ b/media/icons/set-led_blue.svg @@ -0,0 +1 @@ +set-led_blue \ No newline at end of file diff --git a/media/icons/set-led_coral.svg b/media/icons/set-led_coral.svg new file mode 100755 index 0000000000..26487a30d6 --- /dev/null +++ b/media/icons/set-led_coral.svg @@ -0,0 +1 @@ +set-led_coral \ No newline at end of file diff --git a/media/icons/set-led_green.svg b/media/icons/set-led_green.svg new file mode 100755 index 0000000000..3c9cd170f5 --- /dev/null +++ b/media/icons/set-led_green.svg @@ -0,0 +1 @@ +set-led_green \ No newline at end of file diff --git a/media/icons/set-led_magenta.svg b/media/icons/set-led_magenta.svg new file mode 100755 index 0000000000..a13b8f1a0a --- /dev/null +++ b/media/icons/set-led_magenta.svg @@ -0,0 +1 @@ +set-led-magenta \ No newline at end of file diff --git a/media/icons/set-led_mystery.svg b/media/icons/set-led_mystery.svg new file mode 100755 index 0000000000..4b0a2e3377 --- /dev/null +++ b/media/icons/set-led_mystery.svg @@ -0,0 +1 @@ +set-led-mystery \ No newline at end of file diff --git a/media/icons/set-led_orange.svg b/media/icons/set-led_orange.svg new file mode 100755 index 0000000000..9821c79988 --- /dev/null +++ b/media/icons/set-led_orange.svg @@ -0,0 +1 @@ +set-led-orange \ No newline at end of file diff --git a/media/icons/set-led_purple.svg b/media/icons/set-led_purple.svg new file mode 100755 index 0000000000..efb7132f10 --- /dev/null +++ b/media/icons/set-led_purple.svg @@ -0,0 +1 @@ +set-led-purple \ No newline at end of file diff --git a/media/icons/set-led_white.svg b/media/icons/set-led_white.svg new file mode 100755 index 0000000000..5ae43ab750 --- /dev/null +++ b/media/icons/set-led_white.svg @@ -0,0 +1 @@ +set-led-white \ No newline at end of file diff --git a/media/icons/set-led_yellow.svg b/media/icons/set-led_yellow.svg new file mode 100755 index 0000000000..7dba71f714 --- /dev/null +++ b/media/icons/set-led_yellow.svg @@ -0,0 +1 @@ +set-led-yellow \ No newline at end of file diff --git a/media/icons/wedo_motor-clockwise.svg b/media/icons/wedo_motor-clockwise.svg new file mode 100755 index 0000000000..29bdf2ab8d --- /dev/null +++ b/media/icons/wedo_motor-clockwise.svg @@ -0,0 +1 @@ +wedo_motorclockwise \ No newline at end of file diff --git a/media/icons/wedo_motor-counterclockwise.svg b/media/icons/wedo_motor-counterclockwise.svg new file mode 100755 index 0000000000..3631e8bb16 --- /dev/null +++ b/media/icons/wedo_motor-counterclockwise.svg @@ -0,0 +1 @@ +wedo_motorclockwise \ No newline at end of file diff --git a/media/icons/wedo_motor-speed_fast.svg b/media/icons/wedo_motor-speed_fast.svg new file mode 100644 index 0000000000..0e9308fbd6 --- /dev/null +++ b/media/icons/wedo_motor-speed_fast.svg @@ -0,0 +1 @@ +set-motor-speed_fast \ No newline at end of file diff --git a/media/icons/wedo_motor-speed_med.svg b/media/icons/wedo_motor-speed_med.svg new file mode 100644 index 0000000000..49bc2b432c --- /dev/null +++ b/media/icons/wedo_motor-speed_med.svg @@ -0,0 +1 @@ +set-motor-speed_med \ No newline at end of file diff --git a/media/icons/wedo_motor-speed_slow.svg b/media/icons/wedo_motor-speed_slow.svg new file mode 100644 index 0000000000..b9232edc1f --- /dev/null +++ b/media/icons/wedo_motor-speed_slow.svg @@ -0,0 +1 @@ +set-motor-speed_slow \ No newline at end of file diff --git a/media/icons/wedo_when-distance_close.svg b/media/icons/wedo_when-distance_close.svg new file mode 100755 index 0000000000..fa735776dc --- /dev/null +++ b/media/icons/wedo_when-distance_close.svg @@ -0,0 +1 @@ +wedo_whendistanceclose \ No newline at end of file diff --git a/media/icons/wedo_when-tilt-backward.svg b/media/icons/wedo_when-tilt-backward.svg new file mode 100755 index 0000000000..e7a41042c2 --- /dev/null +++ b/media/icons/wedo_when-tilt-backward.svg @@ -0,0 +1 @@ +wedo_whentiltbackward \ No newline at end of file diff --git a/media/icons/wedo_when-tilt-forward.svg b/media/icons/wedo_when-tilt-forward.svg new file mode 100755 index 0000000000..00ef173ba0 --- /dev/null +++ b/media/icons/wedo_when-tilt-forward.svg @@ -0,0 +1 @@ +start-when-tilted-forward \ No newline at end of file diff --git a/media/icons/wedo_when-tilt-left.svg b/media/icons/wedo_when-tilt-left.svg new file mode 100755 index 0000000000..35beebc0cd --- /dev/null +++ b/media/icons/wedo_when-tilt-left.svg @@ -0,0 +1 @@ +start-when-tilted-left \ No newline at end of file diff --git a/media/icons/wedo_when-tilt-right.svg b/media/icons/wedo_when-tilt-right.svg new file mode 100755 index 0000000000..a05dbf0b0c --- /dev/null +++ b/media/icons/wedo_when-tilt-right.svg @@ -0,0 +1 @@ +start-when-tilted-right \ No newline at end of file diff --git a/media/icons/wedo_when-tilt.svg b/media/icons/wedo_when-tilt.svg new file mode 100755 index 0000000000..a4c10c39bc --- /dev/null +++ b/media/icons/wedo_when-tilt.svg @@ -0,0 +1 @@ +start-when-tilted-any \ No newline at end of file diff --git a/media/quote0.png b/media/quote0.png deleted file mode 100644 index b2fd10f69a..0000000000 Binary files a/media/quote0.png and /dev/null differ diff --git a/media/quote1.png b/media/quote1.png deleted file mode 100644 index 826583e0ad..0000000000 Binary files a/media/quote1.png and /dev/null differ diff --git a/msg/js/ar.js b/msg/js/ar.js index e679e368bb..adb016dee5 100644 --- a/msg/js/ar.js +++ b/msg/js/ar.js @@ -62,7 +62,7 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "اكرّر حتى"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "اكرّر طالما"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "بما ان القيمة خاطئة, نفّذ بعض الأوامر."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "بما ان القيمة صحيحة, نفّذ بعض الأوامر."; -Blockly.Msg.DELETE_ALL_BLOCKS = "حذف كل بلوكات %1؟"; +Blockly.Msg.DELETE_ALL_BLOCKS = "حذف كل مناعات %1؟"; Blockly.Msg.DELETE_BLOCK = "إحذف القطعة"; Blockly.Msg.DELETE_X_BLOCKS = "إحذف قطع %1"; Blockly.Msg.DISABLE_BLOCK = "عطّل القطعة"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "يحدد العنصر في Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "يحدد العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "يحدد العنصر الأخير في قائمة."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "يحدد عنصرا عشوائيا في قائمة."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "إعداد قائمة من النصوص"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "إعداد نص من القائمة"; @@ -259,7 +267,7 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "يرجع قوس الظل للرقم."; Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "يرجع جيب التمام لدرجة (لا زواية نصف قطرية)."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "يرجع جيب التمام لدرجة (لا زواية نصف قطرية)."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "يرجع الظل لدرجة (لا دائرة نصف قطرية)."; -Blockly.Msg.ME = "Me"; // untranslated +Blockly.Msg.ME = "أنا"; Blockly.Msg.NEW_VARIABLE = "متغير جديد..."; Blockly.Msg.NEW_VARIABLE_TITLE = "اسم المتغير الجديد:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "اسم الإدخال:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "المدخلات"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "ازل التعليق"; Blockly.Msg.RENAME_VARIABLE = "إعادة تسمية المتغير..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "إعادة تسمية كافة المتغيرات '%1' إلى:"; @@ -353,7 +362,8 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "إزالة الفراغات من كلا Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "إزالة الفراغات من الجانب الأيسر من"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "إزالة الفراغات من الجانب الأيمن من"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "يرجع نسخة من النص مع حذف من أحد أو كلا الفراغات من أطرافه."; -Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.TODAY = "اليوم"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "البند"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "انشئ 'التعيين %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/az.js b/msg/js/az.js index bd7d6cc1da..a186c63091 100644 --- a/msg/js/az.js +++ b/msg/js/az.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "Şərh əlavə et"; Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated Blockly.Msg.CHANGE_VALUE_TITLE = "Qiyməti dəyiş:"; Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Blokları təmizlə"; Blockly.Msg.COLLAPSE_ALL = "Blokları yığ"; Blockly.Msg.COLLAPSE_BLOCK = "Bloku yığ"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "rəng 1"; @@ -19,7 +19,7 @@ Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/" Blockly.Msg.COLOUR_BLEND_RATIO = "nisbət"; Blockly.Msg.COLOUR_BLEND_TITLE = "qarışdır"; Blockly.Msg.COLOUR_BLEND_TOOLTIP = "İki rəngi verilmiş nisbətdə (0,0 - 1,0) qarışdırır."; -Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; // untranslated +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://az.wikipedia.org/wiki/Rəng"; Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Palitradan bir rəng seçin."; Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated Blockly.Msg.COLOUR_RANDOM_TITLE = "təsadüfi rəng"; @@ -28,7 +28,7 @@ Blockly.Msg.COLOUR_RGB_BLUE = "mavi"; Blockly.Msg.COLOUR_RGB_GREEN = "yaşıl"; Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; Blockly.Msg.COLOUR_RGB_RED = "qırmızı"; -Blockly.Msg.COLOUR_RGB_TITLE = "rəngin komponentləri:"; +Blockly.Msg.COLOUR_RGB_TITLE = "rənglə"; Blockly.Msg.COLOUR_RGB_TOOLTIP = "Qırmızı, yaşıl və mavinin göstərilən miqdarı ilə bir rəng düzəlt. Bütün qiymətlər 0 ilə 100 arasında olmalıdır."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "dövrdən çıx"; @@ -53,7 +53,7 @@ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Əgər qiymət doğrudursa, onda bəzi əmr Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Əgər qiymət doğrudursa, onda birinci əmrlər blokunu yerinə yetir. Əks halda isə ikinci əmrlər blokunu yerinə yetir."; Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Əgər birinci qiymət doğrudursa, onda birinci əmrlər blokunu yerinə yetir. Əks halda əgər ikinci qiymət doğrudursa, onda ikinci əmrlər blokunu yerinə yetir."; Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Əgər birinci qiymət doğrudursa, onda birinci əmrlər blokunu yerinə yetir. Əks halda əgər ikinci qiymət doğrudursa, onda ikinci əmrlər blokunu yerinə yetir. Əgər qiymətlərdən heç biri doğru deyilsə, onda axırıncı əmrlər blokunu yerinə yetir."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://az.wikipedia.org/wiki/For_loop"; Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "icra et"; Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 dəfə təkrar et"; Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Bəzi əmrləri bir neçə dəfə yerinə yetir."; @@ -62,7 +62,7 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "təkrar et, ta ki"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "təkrar et, hələ ki"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Hələ ki, qiymət \"yalan\"dır, bəzi əmrləri yerinə yetir."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Hələ ki, qiymət \"doğru\"dur, bəzi əmrləri yerinə yetir."; -Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Bütün %1 blok silinsin?"; Blockly.Msg.DELETE_BLOCK = "Bloku sil"; Blockly.Msg.DELETE_X_BLOCKS = "%1 bloku sil"; Blockly.Msg.DISABLE_BLOCK = "Bloku söndür"; @@ -143,17 +143,25 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Siyahının göstərilən ye Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Siyahının göstərilən yerdəki elementini təyin edir. #1 birinci elementdir."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Siyahının sonuncu elementini təyin edir."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Siyahının təsadüfi seçilmiş bir elementini təyin edir."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "yalan"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "səhf"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "\"doğru\" və ya \"yalan\" cavanını qaytarır."; +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "\"doğru\" və ya \"səhf\" cavanını qaytarır."; Blockly.Msg.LOGIC_BOOLEAN_TRUE = "doğru"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://az.wikipedia.org/wiki/bərabərsizlik_(riyazi)"; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Girişlər bir birinə bərabərdirsə \"doğru\" cavabını qaytarır."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Birinci giriş ikincidən böyükdürsə \"doğru\" cavabını qaytarır."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Birinci giriş ikincidən böyük və ya bərarbərdirsə \"doğru\" cavabını qaytarır."; @@ -162,7 +170,7 @@ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Birinci giriş ikincidən kiçik və ya Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Girişlər bərabər deyillərsə \"doğru\" cavabını qaytarır."; Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 deyil"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Giriş \"yalan\"-dursa \"doğru\" cavabını qaytarır. Giriş \"doğru\"-dursa \"yalan\" cavabını qaytarır."; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Giriş \"yalan\"-dursa \"doğru\" cavabını qaytarır. Giriş \"doğru\"-dursa \"səhf\" cavabını qaytarır."; Blockly.Msg.LOGIC_NULL = "boş"; Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg.LOGIC_NULL_TOOLTIP = "Boş cavab qaytarır."; @@ -173,7 +181,7 @@ Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Hər iki giriş \"doğru\"-dursa \"do Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Girişlərdən heç olmasa biri \"doğru\"-dursa \"doğru\" cavabını qaytarır."; Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "əgər yalandırsa"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "əgər səhfdirsə"; Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "əgər doğrudursa"; Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "'Yoxla' əmrindəki şərtə nəzər yetirin. Əgər şərt \"doğru\"-dursa \"əgər doğru\", əks halda isə \"əgər yalan\" cavabını qaytarır."; Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; @@ -186,7 +194,7 @@ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Birinci ədədin ikinci ədəd dər Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg.MATH_CHANGE_TITLE = "dəyiş: %1 buna: %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "'%1' dəyişəninin üzərinə bir ədəd artır."; -Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://az.wikipedia.org/wiki/Riyazi_sabitlər"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Ümumi sabitlərdən birini qaytarır π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), və ya ∞ (sonsuzluq)."; Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "%1 üçün ən aşağı %2, ən yuxarı %3 olmağı tələb et"; @@ -204,7 +212,7 @@ Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operatio Blockly.Msg.MATH_MODULO_TITLE = "%1 ÷ %2 bölməsinin qalığı"; Blockly.Msg.MATH_MODULO_TOOLTIP = "İki ədədin nisbətindən alınan qalığı qaytarır."; Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://az.wikipedia.org/wiki/Ədəd"; Blockly.Msg.MATH_NUMBER_TOOLTIP = "Ədəd."; Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "siyahının ədədi ortası"; @@ -235,7 +243,7 @@ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "yuvarlaqlaşdır"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "aşağı yuvarlaqlaşdır"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "yuxarı yuvarlaqlaşdır"; Blockly.Msg.MATH_ROUND_TOOLTIP = "Ədədi aşağı və ya yuxari yuvarlaqşdır."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated +Blockly.Msg.MATH_SINGLE_HELPURL = "https://az.wikipedia.org/wiki/Kvadrat_kökləri"; Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "modul"; Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadrat kök"; Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Ədədin modulunu qaytarır."; @@ -250,7 +258,7 @@ Blockly.Msg.MATH_TRIG_ACOS = "arccos"; Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; Blockly.Msg.MATH_TRIG_ATAN = "arctan"; Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://az.wikipedia.org/wiki/Triqonometrik_funksiyalar"; Blockly.Msg.MATH_TRIG_SIN = "sin"; Blockly.Msg.MATH_TRIG_TAN = "tg"; Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Ədədin arccosinusunu qaytarır."; @@ -259,7 +267,7 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Ədədin arctanqensini qaytarır."; Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Dərəcənin kosinusunu qaytarır (radianın yox)."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Dərəcənin sinusunu qaytar (radianın yox)."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Dərəcənin tangensini qaytar (radianın yox)."; -Blockly.Msg.ME = "Me"; // untranslated +Blockly.Msg.ME = "Mənə"; Blockly.Msg.NEW_VARIABLE = "Yeni dəyişən..."; Blockly.Msg.NEW_VARIABLE_TITLE = "Yeni dəyişənin adı:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Giriş adı:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "girişlər"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Şərhi sil"; Blockly.Msg.RENAME_VARIABLE = "Dəyişənin adını dəyiş..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Bütün '%1' dəyişənlərinin adını buna dəyiş:"; @@ -353,7 +362,8 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "Boşluqları hər iki tərəfdən pozun"; Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "Boşluqlari yalnız sol tərəfdən pozun"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "Boşluqları yalnız sağ tərəfdən pozun"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Mətnin hər iki və ya yalnız bir tərəfdən olan boşluqları pozulmuş surətini qaytarın."; -Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.TODAY = "Bugün"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "'%1 - i təyin et' - i yarat"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/ba.js b/msg/js/ba.js new file mode 100644 index 0000000000..4b0f93398e --- /dev/null +++ b/msg/js/ba.js @@ -0,0 +1,394 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.ba'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Фекер өҫтәргә"; +Blockly.Msg.AUTH = "Зинһар, эшегеҙҙе һаҡлап һәм уның менән артабан уртаҡлашыу мөмкин булһын өсөн, был ҡушымтаны танытып ҡуйығыҙ."; +Blockly.Msg.CHANGE_VALUE_TITLE = "Мәғәнәне үҙгәртегеҙ:"; +Blockly.Msg.CHAT = "Был яланды тултырғанда, хеҙмәттәшегеҙ менән аралашығыҙ"; +Blockly.Msg.CLEAN_UP = "Блоктарҙы таҙартырға"; +Blockly.Msg.COLLAPSE_ALL = "Блоктарҙы төрөргә"; +Blockly.Msg.COLLAPSE_BLOCK = "Блокты төрөргә"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "1-се төҫ"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "2-се төҫ"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "1-се төҫтөң өлөшө"; +Blockly.Msg.COLOUR_BLEND_TITLE = "ҡатнаштырырға"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Ике төҫтө бирелгән нисбәттә болғата (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Төҫ"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Палитранан төҫ һайлағыҙ."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "осраҡлы төҫ"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Төҫтө осраҡлылыҡ буйынса һайлай."; +Blockly.Msg.COLOUR_RGB_BLUE = "зәңгәр"; +Blockly.Msg.COLOUR_RGB_GREEN = "йәшелдән"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "ҡыҙылдан"; +Blockly.Msg.COLOUR_RGB_TITLE = "ошонан төҫ"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Бирелгән нисбәттәрҙә ҡыҙылдан, йәшелдән һәм зәңгәрҙән төҫ барлыҡҡа килә. Бөтә мәғәнәләр 0 менән 100 араһында булырға тейеш."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "циклдан сығырға"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "циклдың киләһе аҙымына күсергә"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Был циклды өҙә."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Циклдың ҡалдығын төшөрөп ҡалдыра һәм киләһе аҙымға күсә."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Иҫкәртеү: был блок цикл эсендә генә ҡулланыла ала."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "һәр элемент өсөн %1 исемлектә %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Исемлектәге һәр элемент өсөн үҙгәреүсәнгә элементтың '%1' мәғәнәһен бирә һәм күрһәтелгән командаларҙы үтәй."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; // untranslated +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Үҙгәреүсәнгә башынан аҙағына тиклем тәғәйен аҙым менән %1 мәғәнәне бирә һәм күрһәтелгән командаларҙы үтәй."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "\"Әгәр\" блогына шарт өҫтәй"; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Бер шарт та дөрөҫ булмаған осраҡҡа йомғаҡлау ярҙамсы блогын өҫтәргә."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "\"Әгәр\" блогын ҡабаттан төҙөү өсөн киҫәктәрҙе өҫтәгеҙ, юйҙырығыҙ, урындарын алмаштырығыҙ."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "юғиһә"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "юғиһә, әгәр"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "әгәр"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Мәғәнә дөрөҫ булғанда, командаларҙы үтәй."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Шарт дөрөҫ булғанда, командаларҙың беренсе блогын үтәй. Улай булмаһа, командаларҙың икенсе блогы үтәлә."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Беренсе шарт дөрөҫ булһа, командаларҙың беренсе блогын үтәй. Икенсе шарт дөрөҫ булһа, командаларҙың икенсе блогын үтәй."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Беренсе шарт дөрөҫ булһа, командаларҙың беренсе блогын үтәй. Әгәр икенсе шарт дөрөҫ булһа, командаларҙың икенсе блогын үтәй. Бер шарт та дөрөҫ булмаһа, команда блоктарының һуңғыһын үтәй."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/Цикл_(программалау)"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "үтәргә"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = " %1 тапҡыр ҡабатларға"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Командаларҙы бер нисә тапҡыр үтәй."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ҡабатларға, әлегә юҡ"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ҡабатларға, әлегә"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Мәғәнә ялған булғанда, командаларҙы ҡабатлай."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Мәғәнә дөрөҫ булғанда, командаларҙы ҡабатлай."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Бөтә %1 блоктарҙы юйырғамы?"; +Blockly.Msg.DELETE_BLOCK = "Блокты юйҙырырға"; +Blockly.Msg.DELETE_X_BLOCKS = " %1 блокты юйҙырырға"; +Blockly.Msg.DISABLE_BLOCK = "Блокты һүндерергә"; +Blockly.Msg.DUPLICATE_BLOCK = "Күсереп алырға"; +Blockly.Msg.ENABLE_BLOCK = "Блокты тоҡандырырға"; +Blockly.Msg.EXPAND_ALL = "Блоктарҙы йәйергә"; +Blockly.Msg.EXPAND_BLOCK = "Блокты йәйергә"; +Blockly.Msg.EXTERNAL_INPUTS = "Тышҡы өҫтәлмә"; +Blockly.Msg.HELP = "Ярҙам"; +Blockly.Msg.INLINE_INPUTS = "Эске өҫтәлмә"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "create empty list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "исемлек"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "менән исемлек төҙөргә"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Add an item to the list."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FIRST = "беренсе"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# аҙағынан"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "алырға"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "алырға һәм юйырға"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "аҙаҡҡы"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "осраҡлы"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "юйырға"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "to # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "to #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "to last"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated +Blockly.Msg.LISTS_INLIST = "исемлеккә"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 буш"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "оҙонлоғо %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "кеүек"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "өҫтәп ҡуйырға"; +Blockly.Msg.LISTS_SET_INDEX_SET = "йыйылма"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ялған"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Дөрөҫ йәки ялғанды ҡайтара."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "дөрөҫ"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(математика)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Өҫтәмәләр тигеҙ булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Беренсе өҫтәмә икенсеһенән ҙурыраҡ булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Беренсе өҫтәмә икенсеһенән бәләкәйерәк йә уға тиң булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Беренсе өҫтәмә икенсеһенән бәләкәйерәк булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Беренсе өҫтәмә икенсеһенән бәләкәйерәк йә уға тиң булһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Өҫтәмәләр тигеҙ булмаһа, дөрөҫ мәғәнәһен кире ҡайтара."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 түгел"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Өҫтәлмә ялған булһа, дөрөҫ аңлатманы ҡайтара. Өҫтәлмә дөрөҫ булһа, ялған аңлатманы ҡайтара."; +Blockly.Msg.LOGIC_NULL = "нуль"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Нулде ҡайтара."; +Blockly.Msg.LOGIC_OPERATION_AND = "һәм"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "йәки"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Әгәр ҙә ике өҫтәлмә лә тап килһә, дөрөҫ аңлатманы кире ҡайтара."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Өҫтәлмәләрҙең береһе генә дөрөҫ булһа, дөрөҫ аңлатманы ҡайтара."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "тест"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "әгәр ялған булһа"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "әгәр дөрөҫ булһа"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Һайлау шартын тикшерә. Әгәр ул дөрөҫ булһа, беренсе мәғәнәне, хата булһа, икенсе мәғәнәне ҡайтара."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://ba.wikipedia.org/wiki/Арифметика"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ике һандың суммаһын ҡайтара."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Ике һандың бүлендеген ҡайтара."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Ике һандың айырмаһын ҡайтара."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Ике һандың ҡабатландығын ҡайтара."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Дәрәжәгә күтәрелгән икенсе һандан тәүгеһенә ҡайтара."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://ba.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "%1 тан %2 ҡа арттырырға"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Үҙгәреүсән һанға өҫтәй '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://ba.wikipedia.org/wiki/Математик_константа"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Таралған константаның береһен күрһәтә: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) йәки ∞ (сикһеҙлек)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "сикләргә %1 аҫтан %2 өҫтән %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Һанды аҫтан һәм өҫтән сикләй (сиктәгеләрен индереп)."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "бүленә"; +Blockly.Msg.MATH_IS_EVEN = "тағы"; +Blockly.Msg.MATH_IS_NEGATIVE = "тиҫкәре"; +Blockly.Msg.MATH_IS_ODD = "сәйер"; +Blockly.Msg.MATH_IS_POSITIVE = "ыңғай"; +Blockly.Msg.MATH_IS_PRIME = "ябай"; +Blockly.Msg.MATH_IS_TOOLTIP = "Һандың йоп, таҡ, ябай, бөтөн, ыңғай, кире йәки билдәле һанға ҡарата ниндәй булыуын тикшерә. Дөрөҫ йә ялған мәғәнәһен күрһәтә."; +Blockly.Msg.MATH_IS_WHOLE = "бөтөн"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://ba.wikipedia.org/wiki/Ҡалдыҡ_менән_бүлеү"; +Blockly.Msg.MATH_MODULO_TITLE = "ҡалдыҡ %1 : %2 араһында"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Ике һанды бүлеү ҡалдығын күрһәтә."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://ba.wikipedia.org/wiki/Һан"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Рәт."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "исемлектең уртаса арифметик дәүмәле"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "исемлектәге иң ҙуры"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "исемлек медианаһы"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "Исемлектәге иң бәләкәйе"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "исемлек модалары"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "исемлектең осраҡлы элементы"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "исемлекте стандарт кире ҡағыу"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "исемлек суммаһы"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Исемлектең уртаса арифметик дәүмәле күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Исемлектең иң ҙур һанын күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Исемлек медианаһын күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Исемлектәге иң бәләкәй һанды күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Исемлектең иң күп осраған элементтарын күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Исемлектең осраҡлы элементын күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Исемлекте стандарт кире ҡағыуҙы күрһәтә."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Исемлектәрҙәге һандар суммаһын күрһәтә."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://ba.wikipedia.org/wiki/Ялған осраҡлы_һандар_генераторы"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "0 (үҙен дә индереп) һәм 1 араһындағы осраҡлы һан"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://ba.wikipedia.org/wiki/Ялған осраҡлы_һандар_генераторы"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "%1-ҙән %2-гә тиклем осраҡлы бөтөн һан"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Ике бирелгән һан араһындағы (үҙҙәрен дә индереп) осраҡлы һанды күрһәтә."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://ba.wikipedia.org/wiki/Т=Түңәрәкләү"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "түңәрәк"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "бәләкәйгә тиклем түңәрәкләргә"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "ҙурына тиклем түңәрәкләргә"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Һанды ҙурына йә бәләкәйенә тиклем түңәрәкләргә."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://ba.wikipedia.org/wiki/Квадрат_тамыр"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "абсолют"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "квадрат тамыр"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Һандың модулен ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Күрһәтелгән дәрәжәлә ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Һандың натураль логаритмын ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Һандың унынсы логаритмын ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Кире һанды ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Күрһәтелгән 10-сы дәрәжәлә ҡайтара."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Һандың квадрат тамырын ҡайтара."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://ba..wikipedia.org/wiki/Тригонометрик_функциялар"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Арккосинусты градустарҙа күрһәтә."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Арксинусты градустарҙа күрһәтә."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Арктангенсты градустарҙа күрһәтә."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Мөйөштөң косинусын градустарҙа ҡайтара."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Мөйөштөң синусын градустарҙа ҡайтара."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Мөйөштөң тангенсын градустарҙа күрһәтә."; +Blockly.Msg.ME = "Миңә"; +Blockly.Msg.NEW_VARIABLE = "Яңы үҙгәреүсән..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Яңы үҙгәреүсәндең исеме:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with:"; // untranslated +Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' төҙөргә"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "do something"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "to"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "кире ҡайтарыу"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "инеү исеме:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "инеү"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "документтарҙы үҙгәртергә"; +Blockly.Msg.REMOVE_COMMENT = "Аңлатмаларҙы юйырға"; +Blockly.Msg.RENAME_VARIABLE = "Үҙгәреүсәндең исемен алмаштырырға..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Бөтә '%1' үҙгәреүсәндәрҙең исемен ошолай алмаштырырға:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "текст өҫтәргә"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "to"; // untranslated +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Үҙгәреүсән «%1»-гә текст өҫтәргә."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "to lower case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "to UPPER CASE"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "тәүге хәрефте алырға"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "№ хәрефен аҙаҡтан алырға"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "хат алырға #"; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "текста"; +Blockly.Msg.TEXT_CHARAT_LAST = "һуңғы хәрефте алырға"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "осраҡлы хәрефте алырға"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Текстҡа элемент өҫтәү."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "ҡушылығыҙ"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "# хатҡа"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "һуңғы хәрефкә тиклем"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "текста"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "текстҡа"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "текстың тәүге инеүен табырға"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Текстың һуңғы инеүен табырға"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 буш"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "текст төҙөргә"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Элементтарҙың теләһә күпме һанын берләштереп текст фрагментын булдыра."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "оҙонлоғо %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Бирелгән текстағы символдар һанын (буш урындар менән бергә) кире ҡайтара."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "%1 баҫтырырға"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Текстың хәрефе, һүҙе йәки юлы."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "Бөгөн"; +Blockly.Msg.UNDO = "Кире алырға"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "элемент"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; \ No newline at end of file diff --git a/msg/js/bcc.js b/msg/js/bcc.js index b4d554b0ae..e1949722c9 100644 --- a/msg/js/bcc.js +++ b/msg/js/bcc.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "مورد مشخص‌شده Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "آخرین مورد در یک فهرست را تعیین می‌کند."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "یک مورد تصادفی در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "نام ورودی:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "اضافه کردن ورودی به تابع."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ورودی‌ها"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "حذف نظر"; Blockly.Msg.RENAME_VARIABLE = "تغییر نام متغیر..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "تغییر نام همهٔ متغیرهای «%1» به:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "تراشیدن فاصله‌ها از ط Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "تراشیدن فاصله‌ها از طرف چپ"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند."; Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "مورد"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "درست‌کردن «تنظیم %1»"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/be-tarask.js b/msg/js/be-tarask.js index 6a95d5d64e..27ce00e4d1 100644 --- a/msg/js/be-tarask.js +++ b/msg/js/be-tarask.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Задае элемэнт у Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Задае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Задае апошні элемэнт у сьпісе."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Задае выпадковы элемэнт у сьпісе."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "стварыць сьпіс з тэксту"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "стварыць тэкст са сьпісу"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Запусьціць функцыю вызначаную карыстальнікам '%1' і выкарыстаць яе вынік."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "з:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Стварыць '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Апішыце гэтую функцыю…"; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "зрабіць што-небудзь"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "вярнуць"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Стварае функцыю з вынікам."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Увага: гэтая функцыя мае парамэтры-дублікаты."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Падсьвяціць вызначэньне функцыі"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Калі значэньне ісьціна, вярнуць другое значэньне."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Папярэджаньне: гэты блёк можа выкарыстоўвацца толькі ў вызначанай функцыі."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "назва парамэтру:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Дадаць уваходныя парамэтры ў функцыю."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "парамэтры"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Дадаць, выдаліць ці запісаць чаргу ўваходных парамэтраў для гэтай функцыі."; +Blockly.Msg.REDO = "Паўтарыць"; Blockly.Msg.REMOVE_COMMENT = "Выдаліць камэнтар"; Blockly.Msg.RENAME_VARIABLE = "Перайменаваць зьменную…"; Blockly.Msg.RENAME_VARIABLE_TITLE = "Перайменаваць усе назвы зьменных '%1' на:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "абрэзаць прабелы зь ле Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "абрэзаць прабелы з правага боку"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Вяртае копію тэксту з прабеламі, выдаленымі ад аднаго ці абодвух бакоў."; Blockly.Msg.TODAY = "Сёньня"; +Blockly.Msg.UNDO = "Скасаваць"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "аб’ект"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Стварыць блёк «усталяваць %1»"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/bg.js b/msg/js/bg.js index 2197e2bbf6..36c1ca314a 100644 --- a/msg/js/bg.js +++ b/msg/js/bg.js @@ -122,7 +122,7 @@ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Връща индекса на първо Blockly.Msg.LISTS_INLIST = "в списъка"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 е празен"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Връща истина, ако списъкът е празен."; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Връща стойност вярно, ако списъкът е празен."; Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg.LISTS_LENGTH_TITLE = "дължината на %1"; Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Връща дължината на списък."; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Променя елемен Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Променя елемента на определена позиция в списък. #1 е първият елемент."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Променя последния елемент в списък."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Променя случаен елемент от списък."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Направи списък от текст"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "направи текст от списък"; @@ -214,7 +222,7 @@ Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "най-малката стойност Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "мода на списъка"; Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "случаен елемент от списъка"; Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "стандартно отклонение на списък"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "сумираай списъка"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "сумирай списъка"; Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Върни средната стойност (аритметичното средно) на числата в списъка."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Върни най-голямото число в списъка."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Върни медианата в списъка."; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://bg.wikipedia.org/wiki/По Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Изпълни дефинирана от потребителя функция \"%1\" и използвай резултата."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "със:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Създай '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Опишете тази функция..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "направиш"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "върни"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Създава функция, която връща резултат."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Предупреждение: Тази функция има дублиращи се параметри."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Покажи дефиницията на функцията"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ако стойността е истина, върни втората стойност."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Предупреждение: Този блок може да се използва само във функция."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "име на параметър"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Добавяне на параметър към функцията."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "вход"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Добави, премахни или пренареди входните параметри за тази функция."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Премахни коментар"; Blockly.Msg.RENAME_VARIABLE = "Преименувай променливата..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Преименувай всички '%1' променливи на:"; @@ -305,7 +314,7 @@ Blockly.Msg.TEXT_CHARAT_FIRST = "вземи първата буква"; Blockly.Msg.TEXT_CHARAT_FROM_END = "вземи поредна буква от края"; Blockly.Msg.TEXT_CHARAT_FROM_START = "вземи поредна буква"; Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated -Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "От текста"; +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "от текста"; Blockly.Msg.TEXT_CHARAT_LAST = "вземи последната буква"; Blockly.Msg.TEXT_CHARAT_RANDOM = "вземи произволна буква"; Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "премахни интервалите Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "премахни интервалите отдясно"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Върни копие на текста с пемахнати интервали от диния или двата края."; Blockly.Msg.TODAY = "Днес"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "елемент"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Създай \"промени стойността на %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/bn.js b/msg/js/bn.js index e88f70a9e3..b6b23179b6 100644 --- a/msg/js/bn.js +++ b/msg/js/bn.js @@ -80,13 +80,13 @@ Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "তালিকা"; Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "তালিকায় একটি পদ যোগ কর"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "তালিকায় একটি পদ যোগ করুন।"; Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "যেকোন সংখ্যক পদ নিয়ে একটি তালিকা তৈরি করুন।"; Blockly.Msg.LISTS_GET_INDEX_FIRST = "প্রথম"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# from end"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# শেষ থেকে"; Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET = "get"; // untranslated -Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "নিন"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "নিন ও সরান"; Blockly.Msg.LISTS_GET_INDEX_LAST = "শেষ"; Blockly.Msg.LISTS_GET_INDEX_RANDOM = "এলোমেলো"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "অপসারণ"; @@ -115,16 +115,16 @@ Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated -Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "আইটেমের প্রথম সংঘটন খুঁজুন"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "আইটেমের শেষ সংঘটন খুঁজুন"; Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated Blockly.Msg.LISTS_INLIST = "তালিকার মধ্যে"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 খালি"; Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "পাঠাবে সত্য যদি তালিকাটি খালি হয়।"; Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated -Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "%1-এর দৈর্ঘ্য"; Blockly.Msg.LISTS_LENGTH_TOOLTIP = "একটি তালিকার দৈর্ঘ্য পাঠাবে।"; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specifi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "লিখা থেকে তালিকা তৈরি করুন"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "তালিকা থেকে লিখা তৈরি করুন"; @@ -163,9 +171,9 @@ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "পাঠাবে সত্য যদ Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg.LOGIC_NEGATE_TITLE = "%1 নয়"; Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "পাঠাবে সত্য যদি ইনপুট মিথ্যা হয়। পাঠাবে মিথ্যা যদি ইনপুট সত্য হয়।"; -Blockly.Msg.LOGIC_NULL = "নুল"; +Blockly.Msg.LOGIC_NULL = "কিছু না"; Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "পাঠাবে নাল।"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "কিছু ফেরত দিবে না।"; Blockly.Msg.LOGIC_OPERATION_AND = "এবং"; Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg.LOGIC_OPERATION_OR = "অথবা"; @@ -184,7 +192,7 @@ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "পাঠাবে দুটি স Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "পাঠাবে দুটি সংখ্যার গুণফল।"; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated -Blockly.Msg.MATH_CHANGE_TITLE = "পরিবর্তন %1 দ্বারা %2"; +Blockly.Msg.MATH_CHANGE_TITLE = "%2 দ্বারা %1 পরিবর্তন"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated 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)."; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "ইনপুটের নাম:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "ক্রিয়াতে একটি ইনপুট যোগ করুন।"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "পুনরায় করুন"; Blockly.Msg.REMOVE_COMMENT = "মন্তব্য সরাও"; Blockly.Msg.RENAME_VARIABLE = "চলকের নাম পরিবর্তন..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; // untranslated @@ -311,7 +320,7 @@ Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "লেখাটিতে একটি পদ যোগ করুন।"; -Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "সংযোগ কর"; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "যোগ"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated @@ -336,10 +345,10 @@ Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#tex Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated -Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "%1-এর দৈর্ঘ্য"; Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated -Blockly.Msg.TEXT_PRINT_TITLE = "প্রিন্ট %1"; +Blockly.Msg.TEXT_PRINT_TITLE = "%1 মুদ্রণ করুন"; Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated @@ -354,12 +363,13 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "বামপাশ থেকে খাল Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "ডানপাশ থেকে খালি অংশ ছাটাই"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "আজ"; +Blockly.Msg.UNDO = "পূর্বাবস্থা"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "পদ"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "'%1 নিন' তৈরি করুন"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; diff --git a/msg/js/br.js b/msg/js/br.js index 9a3fceea58..1801048061 100644 --- a/msg/js/br.js +++ b/msg/js/br.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "Ouzhpennañ un evezhiadenn"; Blockly.Msg.AUTH = "Roit aotre, mar plij, d'an arload-mañ evit gallout saveteiñ ho labour ha reiñ aotre dezhañ da rannañ ho labour ganimp."; Blockly.Msg.CHANGE_VALUE_TITLE = "Kemmañ an dalvoudenn :"; Blockly.Msg.CHAT = "Flapañ gant ho kenlabourer en ur skrivañ er voest-se !"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Naetaat ar bloc'hoù"; Blockly.Msg.COLLAPSE_ALL = "Bihanaat ar bloc'hoù"; Blockly.Msg.COLLAPSE_BLOCK = "Bihanaat ar bloc'h"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "liv 1"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Termenañ a ra an elfenn el Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Termenañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Termenañ a ra an elfenn diwezhañ en ul listenn."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Termenañ a ra un elfenn dre zegouezh en ul listenn."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Krouiñ ul listenn diwar an destenn"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Krouiñ un destenn diwar al listenn"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Seveniñ an arc'hwel '%1' termenet gant an implijer hag implijout e zisoc'h."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "gant :"; Blockly.Msg.PROCEDURES_CREATE_DO = "Krouiñ '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Deskrivañ an arc'hwel-mañ..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "ober un dra bennak"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Anv ar moned"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Ouzhpennañ ur moned d'an arc'hwel."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Monedoù"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Ouzhpennañ, lemel, pe adkempenn monedoù an arc'hwel-mañ."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Lemel an evezhiadenn kuit"; Blockly.Msg.RENAME_VARIABLE = "Adenvel an argemmenn..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Adenvel an holl argemmennoù '%1' e :"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "Lemel an esaouennoù eus an tu kleiz"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "Lemel an esaouennoù eus an tu dehou"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Distreiñ un eilenn eus an destenn gant an esaouennoù lamet eus un tu pe eus an daou du"; Blockly.Msg.TODAY = "Hiziv"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "elfenn"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Krouiñ 'termenañ %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/ca.js b/msg/js/ca.js index dcddce1709..d85028f951 100644 --- a/msg/js/ca.js +++ b/msg/js/ca.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Modifica l'element de la pos Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Modifica l'element de la posició especificada d'una llista. #1 és el primer element."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Modifica l'últim element d'una llista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Modifica un element a l'atzar d'una llista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom d'entrada:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Afegir una entrada per la funció."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entrades"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Afegir, eliminar o canviar l'ordre de les entrades per aquesta funció."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Elimina el comentari"; Blockly.Msg.RENAME_VARIABLE = "Reanomena variable..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Reanomena totes les variables '%1' a:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "retalla espais de l'esquerra de"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "retalla espais de la dreta de"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retorna una còpia del text on s'han esborrat els espais d'un o dels dos extrems."; Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'modifica %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/cs.js b/msg/js/cs.js index 38aaed2be4..72809048fa 100644 --- a/msg/js/cs.js +++ b/msg/js/cs.js @@ -7,12 +7,12 @@ goog.provide('Blockly.Msg.cs'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Přidat komentář"; -Blockly.Msg.AUTH = "Prosím udělte oprávnění této aplikaci aby jste mohli uložit svou práci a aby vaše práce mohla být sdílena vaším jménem."; -Blockly.Msg.CHANGE_VALUE_TITLE = "Změna hodnoty:"; +Blockly.Msg.AUTH = "Prosím udělte oprávnění této aplikaci aby jste mohli uložit a sdílet svou práci."; +Blockly.Msg.CHANGE_VALUE_TITLE = "Změnit hodnotu:"; Blockly.Msg.CHAT = "Psaním do tohoto políčka komunikujte se spolupracovníky!"; Blockly.Msg.CLEAN_UP = "Uspořádat bloky"; -Blockly.Msg.COLLAPSE_ALL = "Skrýt bloky"; -Blockly.Msg.COLLAPSE_BLOCK = "Skrýt blok"; +Blockly.Msg.COLLAPSE_ALL = "Sbalit bloky"; +Blockly.Msg.COLLAPSE_BLOCK = "Sbalit blok"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "barva 1"; Blockly.Msg.COLOUR_BLEND_COLOUR2 = "barva 2"; Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated @@ -28,12 +28,12 @@ Blockly.Msg.COLOUR_RGB_BLUE = "modrá"; Blockly.Msg.COLOUR_RGB_GREEN = "zelená"; Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated Blockly.Msg.COLOUR_RGB_RED = "červená"; -Blockly.Msg.COLOUR_RGB_TITLE = "barva s"; +Blockly.Msg.COLOUR_RGB_TITLE = "obarvěte barvou"; Blockly.Msg.COLOUR_RGB_TOOLTIP = "Vytvoř barvu se zadaným množstvím červené, zelené a modré. Všechny hodnoty musí být mezi 0 a 100."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "vymanit se ze smyčky"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "vyskočit ze smyčky"; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "pokračuj dalším opakováním smyčky"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Přeruš vnitřní smyčku."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Vyskoč z vnitřní smyčky."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Přeskoč zbytek této smyčky a pokračuj dalším opakováním."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Upozornění: Tento blok může být použit pouze uvnitř smyčky."; Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated @@ -41,11 +41,11 @@ Blockly.Msg.CONTROLS_FOREACH_TITLE = "pro každou položku %1 v seznamu %2"; Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pro každou položku v seznamu nastavte do proměnné '%1' danou položku a proveďte nějaké operace."; Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg.CONTROLS_FOR_TITLE = "počítat s %1 od %2 do %3 po %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Nechá proměnnou '%1' nabývat hodnot od počátečního do koncového čísla po daném přírůstku a provádí ní příslušné bloky."; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Nechá proměnnou '%1' nabývat hodnot od počátečního do koncového čísla po daném přírůstku a provádí s ní příslušné bloky."; Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Přidat podmínku do \"pokud\" bloku."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Přidej konečnou podmínku zahrnující ostatní případy do bloku pokud."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Přidej konečnou podmínku zahrnující ostatní případy do bloku \"pokud\"."; Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Přidej, odstraň či uspořádej sekce k přenastavení tohoto bloku pokud."; +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Přidej, odstraň či uspořádej sekce k přenastavení tohoto bloku \"pokud\"."; Blockly.Msg.CONTROLS_IF_MSG_ELSE = "jinak"; Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "nebo pokud"; Blockly.Msg.CONTROLS_IF_MSG_IF = "pokud"; @@ -53,23 +53,23 @@ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Je-li hodnota pravda, proveď určité př Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Je-li hodnota pravda, proveď první blok příkazů. V opačném případě proveď druhý blok příkazů."; Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Je-li první hodnota pravdivá, proveď první blok příkazů. V opačném případě, je-li pravdivá druhá hodnota, proveď druhý blok příkazů."; Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Je-li první hodnota pravda, proveď první blok příkazů. Je-li druhá hodnota pravda, proveď druhý blok příkazů. Pokud žádná hodnota není pravda, proveď poslední blok příkazů."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://cs.wikipedia.org/wiki/Cyklus_for"; -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "udělej"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "opakovat %1 krát"; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://cs.wikipedia.org/wiki/Cyklus_pro"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "dělej"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "opakuj %1 krát"; Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Proveď určité příkazy několikrát."; Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "opakovat dokud"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "opakovat když"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Dokud je hodnota nepravdivá, prováděj určité příkazy."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Dokud je hodnota pravdivá, prováděj určité příkazy."; -Blockly.Msg.DELETE_ALL_BLOCKS = "Odstranit všechny bloky %1?"; -Blockly.Msg.DELETE_BLOCK = "Odstranit blok"; -Blockly.Msg.DELETE_X_BLOCKS = "Odstranit %1 bloky"; -Blockly.Msg.DISABLE_BLOCK = "Zakázat blok"; -Blockly.Msg.DUPLICATE_BLOCK = "zdvojit"; +Blockly.Msg.DELETE_ALL_BLOCKS = "Smazat všech %1 bloků?"; +Blockly.Msg.DELETE_BLOCK = "Smazat blok"; +Blockly.Msg.DELETE_X_BLOCKS = "Smazat %1 bloků"; +Blockly.Msg.DISABLE_BLOCK = "Deaktivovat blok"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplikovat"; Blockly.Msg.ENABLE_BLOCK = "Povolit blok"; Blockly.Msg.EXPAND_ALL = "Rozbalit bloky"; -Blockly.Msg.EXPAND_BLOCK = "Rozbalení bloku"; +Blockly.Msg.EXPAND_BLOCK = "Rozbalit blok"; Blockly.Msg.EXTERNAL_INPUTS = "vnější vstupy"; Blockly.Msg.HELP = "Nápověda"; Blockly.Msg.INLINE_INPUTS = "Vložené vstupy"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Nastaví položku na konkré Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Nastaví položku na konkrétní místo v seznamu. #1 je první položka."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Nastaví poslední položku v seznamu."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Nastaví náhodnou položku v seznamu."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "udělat z textu seznam"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "udělat ze seznamu text"; @@ -161,20 +169,20 @@ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Navrátí hodnotu pravda, pokud je prvn Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Navrátí hodnotu pravda, pokud je první vstup menší a nebo rovný druhému vstupu."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Vrátí hodnotu pravda, pokud se oba vstupy nerovnají sobě navzájem."; Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated -Blockly.Msg.LOGIC_NEGATE_TITLE = "není %1"; +Blockly.Msg.LOGIC_NEGATE_TITLE = "ne %1"; Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Navrátí hodnotu pravda, pokud je vstup nepravda. Navrátí hodnotu nepravda, pokud je vstup pravda."; -Blockly.Msg.LOGIC_NULL = "nula"; +Blockly.Msg.LOGIC_NULL = "prázdný"; Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated -Blockly.Msg.LOGIC_NULL_TOOLTIP = "Vrátí nulovou hodnotu"; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Vrátí prázdnou hodnotu"; Blockly.Msg.LOGIC_OPERATION_AND = "a"; Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg.LOGIC_OPERATION_OR = "nebo"; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Vrátí hodnotu pravda, pokud oba dva vstupy jsou pravdivé."; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Vrátí hodnotu pravda, pokud alespoň jeden ze vstupů má hodnotu pravda."; Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; -Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "je-li nepravda"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "je-li to pravda"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://cs.wikipedia.org/wiki/Ternární operátor (programování)"; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "pokud nepravda"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "pokud pravda"; Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Zkontroluje podmínku v \"testu\". Když je podmínka pravda, vrátí hodnotu \"pokud pravda\"; v opačném případě vrátí hodnotu \"pokud nepravda\"."; Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://cs.wikipedia.org/wiki/Aritmetika"; @@ -183,16 +191,16 @@ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Vrátí podíl dvou čísel."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Vrátí rozdíl dvou čísel."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Vrátí součin dvou čísel."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Vrátí první číslo umocněné na druhé číslo."; -Blockly.Msg.MATH_CHANGE_HELPURL = "https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o"; -Blockly.Msg.MATH_CHANGE_TITLE = "změnit %1 od %2"; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "zaměň %1 za %2"; Blockly.Msg.MATH_CHANGE_TOOLTIP = "Přičti číslo k proměnné '%1'."; Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; -Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Vraťte jednu z následujících konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Vraťte jednu z následujících konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (nekonečno)."; Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "omez %1 na rozmezí od %2 do %3"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Omezí číslo tak, aby bylo ve stanovených mezích (včetně)."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "je dělitelné"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "je dělitelné číslem"; Blockly.Msg.MATH_IS_EVEN = "je sudé"; Blockly.Msg.MATH_IS_NEGATIVE = "je záporné"; Blockly.Msg.MATH_IS_ODD = "je liché"; @@ -230,13 +238,13 @@ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Vrátí náhodné číslo mezi 0,0 (vč Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel"; Blockly.Msg.MATH_RANDOM_INT_TITLE = "náhodné celé číslo od %1 do %2"; Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Vrací náhodné celé číslo mezi dvěma určenými mezemi, včetně mezních hodnot."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://cs.wikipedia.org/wiki/Zaokrouhlení"; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "zaokrouhlit"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokrouhlit dolu"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokrouhlit dolů"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "zaokrouhlit nahoru"; Blockly.Msg.MATH_ROUND_TOOLTIP = "Zaokrouhlit číslo nahoru nebo dolů."; Blockly.Msg.MATH_SINGLE_HELPURL = "https://cs.wikipedia.org/wiki/Druhá_odmocnina"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolutní"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolutní hodnota"; Blockly.Msg.MATH_SINGLE_OP_ROOT = "druhá odmocnina"; Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Vrátí absolutní hodnotu čísla."; Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Vrátí mocninu čísla e."; @@ -250,12 +258,12 @@ Blockly.Msg.MATH_TRIG_ACOS = "acos"; Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; Blockly.Msg.MATH_TRIG_ATAN = "arctan"; Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://cs.wikipedia.org/wiki/Goniometrická_funkce"; +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; Blockly.Msg.MATH_TRIG_SIN = "sin"; Blockly.Msg.MATH_TRIG_TAN = "tan"; -Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Vrátí arckosinus čísla."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Vrátí arcsinus čísla."; -Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vrátí arctangens čísla."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Vrátí arkus kosinus čísla."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Vrátí arkus sinus čísla."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vrátí arkus tangens čísla."; Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vrátí kosinus úhlu ve stupních."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vrátí sinus úhlu ve stupních."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vrátí tangens úhlu ve stupních."; @@ -271,27 +279,28 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://cs.wikipedia.org/wiki/Funkc Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Spustí uživatelem definovanou funkci '%1' a použije její výstup."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "s:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Vytvořit '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Popište tuto funkci..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "proveď něco"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "k provedení"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Vytvořit funkci bez výstupu."; -Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)"; Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "navrátit"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Vytvořit funkci s výstupem."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Upozornění: Tato funkce má duplicitní parametry."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Zvýraznit definici funkce"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Je-li hodnota pravda, pak vrátí druhou hodnotu."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Varování: Tento blok může být použit pouze uvnitř definici funkce."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "vstupní jméno:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Přidat vstupy do funkce."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "vstupy"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Přidat, odebrat nebo změnit pořadí vstupů této funkce."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Odstranit komentář"; -Blockly.Msg.RENAME_VARIABLE = "Přejmenovat proměnné..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Přejmenujte všechny proměnné '%1':"; +Blockly.Msg.RENAME_VARIABLE = "Přejmenovat proměnnou..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Přejmenuj všech '%1' proměnných na:"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "přidat text"; Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg.TEXT_APPEND_TO = "do"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "odstranit mezery z levé strany"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "odstranit mezery z pravé strany"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Vrátí kopii textu s odstraněnými mezerami z jednoho nebo obou konců."; Blockly.Msg.TODAY = "Dnes"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "položka"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Vytvořit \"nastavit %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/da.js b/msg/js/da.js index bfec647a3f..b21e19da1f 100644 --- a/msg/js/da.js +++ b/msg/js/da.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sætter elementet på den an Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sætter elementet på den angivne position i en liste. #1 er det første element."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sætter det sidste element i en liste."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sætter et tilfældigt element i en liste."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lav tekst til liste"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "lav liste til tekst"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://da.wikipedia.org/wiki/Funkt Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kør den brugerdefinerede funktion '%1' og brug dens returværdi."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "med:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Opret '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Beskriv denne funktion..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "gøre noget"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returnér"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Opretter en funktion der har en returværdi."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Advarsel: Denne funktion har dublerede parametre."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markér funktionsdefinitionen"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Hvis en værdi er sand, så returnér en anden værdi."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Advarsel: Denne blok kan kun anvendes inden for en funktionsdefinition."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "parameternavn:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Tilføj en parameter til funktionen."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "parametre"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Tilføje, fjerne eller ændre rækkefølgen af parametre til denne funktion."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Fjern kommentar"; Blockly.Msg.RENAME_VARIABLE = "Omdøb variabel..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Omdøb alle '%1' variabler til:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "fjern mellemrum fra venstre side af"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "fjern mellemrum fra højre side af"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returner en kopi af teksten med mellemrum fjernet fra den ene eller begge sider."; Blockly.Msg.TODAY = "I dag"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Opret 'sæt %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/de.js b/msg/js/de.js index 9a79bb88e7..d8cd070c9b 100644 --- a/msg/js/de.js +++ b/msg/js/de.js @@ -34,16 +34,16 @@ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://de.wikipedia.org/wiki/Ko Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Die Schleife abbrechen"; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "mit der nächsten Iteration der Schleife fortfahren"; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Die umgebende Schleife beenden."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Diese Anweisung abbrechen und mit der nächsten Schleifendurchlauf fortfahren."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Diese Anweisung abbrechen und mit dem nächsten Schleifendurchlauf fortfahren."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warnung: Dieser Block sollte nur in einer Schleife verwendet werden."; Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife"; Blockly.Msg.CONTROLS_FOREACH_TITLE = "Für Wert %1 aus der Liste %2"; Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Führe eine Anweisung für jeden Wert in der Liste aus und setzte dabei die Variable \"%1\" auf den aktuellen Listenwert."; -Blockly.Msg.CONTROLS_FOR_HELPURL = "https://de.wikipedia.org/wiki/For-Schleif"; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://de.wikipedia.org/wiki/For-Schleife"; Blockly.Msg.CONTROLS_FOR_TITLE = "Zähle %1 von %2 bis %3 mit %4"; Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Zähle die Variable \"%1\" von einem Startwert bis zu einem Zielwert und führe für jeden Wert eine Anweisung aus."; Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Eine weitere Bedingung hinzufügen."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus falls keine Bedingung zutrifft."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus, falls keine Bedingung zutrifft."; Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Hinzufügen, entfernen oder sortieren von Sektionen"; Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sonst"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setzt das Element an der ang Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setzte das Element an der angegebenen Position in der Liste. #1 ist das erste Element."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setzt das letzte Element in der Liste."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt ein zufälliges Element in der Liste."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Liste aus Text erstellen"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Text aus Liste erstellen"; @@ -154,28 +162,28 @@ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logi Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ist entweder wahr (true) oder falsch (false)"; Blockly.Msg.LOGIC_BOOLEAN_TRUE = "wahr"; Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ist wahr (true) wenn beide Werte gleich sind."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ist wahr (true) wenn der erste Wert größer als der zweite Wert ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ist wahr (true) wenn der erste Wert größer als oder gleich groß wie zweite Wert ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ist wahr (true) wenn der erste Wert kleiner als der zweite Wert ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ist wahr (true) wenn der erste Wert kleiner als oder gleich groß wie zweite Wert ist."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ist wahr (true) wenn beide Werte unterschiedlich sind."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Ist wahr (true), wenn beide Werte gleich sind."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Ist wahr (true), wenn der erste Wert größer als der zweite Wert ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Ist wahr (true), wenn der erste Wert größer als oder gleich groß wie der zweite Wert ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Ist wahr (true), wenn der erste Wert kleiner als der zweite Wert ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Ist wahr (true), wenn der erste Wert kleiner als oder gleich groß wie der zweite Wert ist."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Ist wahr (true), wenn beide Werte unterschiedlich sind."; Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg.LOGIC_NEGATE_TITLE = "nicht %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ist wahr (true) wenn der Eingabewert falsch (false) ist. Ist falsch (false) wenn der Eingabewert wahr (true) ist."; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Ist wahr (true), wenn der Eingabewert falsch (false) ist. Ist falsch (false), wenn der Eingabewert wahr (true) ist."; Blockly.Msg.LOGIC_NULL = "null"; Blockly.Msg.LOGIC_NULL_HELPURL = "https://de.wikipedia.org/wiki/Nullwert"; Blockly.Msg.LOGIC_NULL_TOOLTIP = "Ist NULL."; Blockly.Msg.LOGIC_OPERATION_AND = "und"; Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg.LOGIC_OPERATION_OR = "oder"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ist wahr (true) wenn beide Werte wahr (true) sind."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ist wahr (true) wenn einer der beiden Werte wahr (true) ist."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Ist wahr (true), wenn beide Werte wahr (true) sind."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Ist wahr (true), wenn einer der beiden Werte wahr (true) ist."; Blockly.Msg.LOGIC_TERNARY_CONDITION = "teste"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://de.wikipedia.org/wiki/%3F:#Auswahloperator"; Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "wenn falsch"; Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "wenn wahr"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Überprüft eine Bedingung \"teste\". Wenn die Bedingung wahr ist wird der \"wenn wahr\" Wert zurückgegeben, andernfalls der \"wenn falsch\" Wert"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Überprüft eine Bedingung \"teste\". Wenn die Bedingung wahr ist, wird der \"wenn wahr\" Wert zurückgegeben, andernfalls der \"wenn falsch\" Wert"; Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://de.wikipedia.org/wiki/Grundrechenart"; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Ist die Summe zweier Werte."; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://de.wikipedia.org/wiki/Proze Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Rufe einen Funktionsblock mit Rückgabewert auf."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "mit:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Erzeuge \"Aufruf %1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Beschreibe diese Funktion …"; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Funktionsblock"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "gebe zurück"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Ein Funktionsblock mit Rückgabewert."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warnung: dieser Funktionsblock hat zwei gleich benannte Parameter."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markiere Funktionsblock"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Wenn der erste Wert wahr (true) ist, Gebe den zweiten Wert zurück."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warnung: Dieser Block darf nur innerhalb eines Funktionsblock genutzt werden."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Variable:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Eine Eingabe zur Funktion hinzufügen."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Parameter"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen."; +Blockly.Msg.REDO = "Wiederholen"; Blockly.Msg.REMOVE_COMMENT = "Kommentar entfernen"; Blockly.Msg.RENAME_VARIABLE = "Variable umbenennen..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Alle \"%1\" Variablen umbenennen in:"; @@ -322,7 +331,7 @@ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "vom ersten Buchstaben"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "vom #ten Buchstaben von hinten"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "vom #ten Buchstaben"; Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Gibt die angegebenen Textabschnitt zurück."; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Gibt den angegebenen Textabschnitt zurück."; Blockly.Msg.TEXT_INDEXOF_HELPURL = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "im Text"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Suche erstes Auftreten des Begriffs"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "entferne Leerzeichen vom Anfang (links)"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "entferne Leerzeichen vom Ende (rechts)"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes."; Blockly.Msg.TODAY = "Heute"; +Blockly.Msg.UNDO = "Rückgängig"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "Element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Erzeuge \"Schreibe %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29"; diff --git a/msg/js/el.js b/msg/js/el.js index 2a85f193f4..33cd531107 100644 --- a/msg/js/el.js +++ b/msg/js/el.js @@ -6,7 +6,7 @@ goog.provide('Blockly.Msg.el'); goog.require('Blockly.Msg'); -Blockly.Msg.ADD_COMMENT = "Πρόσθεσε Σχόλιο"; +Blockly.Msg.ADD_COMMENT = "Πρόσθεσε Το Σχόλιο"; Blockly.Msg.AUTH = "Παρακαλώ κάνε έγκριση της εφαρμογής για να επιτρέπεται η αποθήκευση και κοινοποίηση της εργασίας σου."; Blockly.Msg.CHANGE_VALUE_TITLE = "Άλλαξε την τιμή:"; Blockly.Msg.CHAT = "Μπορείς να μιλήσεις με τον συνεργάτη σου πληκτρολογώντας σ'αυτό το πλαίσιο!"; @@ -66,7 +66,7 @@ Blockly.Msg.DELETE_ALL_BLOCKS = "Να διαγραφούν και τα %1 μπλ Blockly.Msg.DELETE_BLOCK = "Διέγραψε Το Μπλοκ"; Blockly.Msg.DELETE_X_BLOCKS = "Διέγραψε %1 Μπλοκ"; Blockly.Msg.DISABLE_BLOCK = "Απενεργοποίησε Το Μπλοκ"; -Blockly.Msg.DUPLICATE_BLOCK = "Αντίγραφο"; +Blockly.Msg.DUPLICATE_BLOCK = "Διπλότυπο"; Blockly.Msg.ENABLE_BLOCK = "Ενεργοποίησε Το Μπλοκ"; Blockly.Msg.EXPAND_ALL = "Επέκτεινε Όλα Τα Μπλοκ"; Blockly.Msg.EXPAND_BLOCK = "Επέκτεινε Το Μπλοκ"; @@ -118,7 +118,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Δημιουργεί ένα αντίγ Blockly.Msg.LISTS_INDEX_OF_FIRST = "βρες την πρώτη εμφάνιση του στοιχείου"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "Blockly"; Blockly.Msg.LISTS_INDEX_OF_LAST = "βρες την τελευταία εμφάνιση του στοιχείου"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή 0, αν το κείμενο δεν βρεθεί."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή 0, αν το στοιχείο δεν βρεθεί."; Blockly.Msg.LISTS_INLIST = "στη λίστα"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "το %1 είναι κενό"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Ορίζει το στοιχ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Ορίζει το τελευταίο στοιχείο σε μια λίστα."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Ορίζει ένα τυχαίο στοιχείο σε μια λίστα."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "κάνετε λίστα από το κείμενο"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "κάνετε κείμενο από τη λίστα"; @@ -263,7 +271,7 @@ Blockly.Msg.ME = "Εγώ"; Blockly.Msg.NEW_VARIABLE = "Νέα μεταβλητή..."; Blockly.Msg.NEW_VARIABLE_TITLE = "Νέο όνομα μεταβλητής:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "να επιτρέπονται οι δηλώσεις"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "με:"; Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://el.wikipedia.org/wiki/%CE%94%CE%B9%CE%B1%CE%B4%CE%B9%CE%BA%CE%B1%CF%83%CE%AF%CE%B1_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Εκτελεί την ορισμένη από τον χρήστη συνάρτηση «%1»."; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "όνομα εισόδου:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Πρόσθεσε μια είσοδος στη συνάρτηση"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "είσοδοι"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Προσθέτει, αφαιρεί ή αναδιατάσσει εισόδους σε αυτήν τη λειτουργία"; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Αφαίρεσε Το Σχόλιο"; Blockly.Msg.RENAME_VARIABLE = "Μετονόμασε τη μεταβλητή..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Μετονόμασε όλες τις μεταβλητές «%1» σε:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "περίκοψε τα κενά από τ Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "περίκοψε τα κενά από την δεξιά πλευρά του"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Επιστρέφει ένα αντίγραφο του κειμένου με αφαιρεμένα τα κενά από το ένα ή και τα δύο άκρα."; Blockly.Msg.TODAY = "Σήμερα"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "αντικείμενο"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Δημιούργησε «όρισε %1»"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/en.js b/msg/js/en.js index 3ff0f11cb7..d33ae96381 100644 --- a/msg/js/en.js +++ b/msg/js/en.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specifi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; +Blockly.Msg.REDO = "Redo"; Blockly.Msg.REMOVE_COMMENT = "Remove Comment"; Blockly.Msg.RENAME_VARIABLE = "Rename variable..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; Blockly.Msg.TODAY = "Today"; +Blockly.Msg.UNDO = "Undo"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; diff --git a/msg/js/es.js b/msg/js/es.js index b0dc73b7e8..56891f7f00 100644 --- a/msg/js/es.js +++ b/msg/js/es.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Establece el elemento en la Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Establece el elemento en la posición especificada en una lista. #1 es el primer elemento."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Establece el último elemento de una lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Establece un elemento aleatorio en una lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "hacer lista a partir de texto"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "hacer texto a partir de lista"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://es.wikipedia.org/wiki/Subru Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Ejecuta la función definida por el usuario '%1' y usa su salida."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "con:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Crear '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe esta función..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "hacer algo"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nombre de entrada:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Añadir una entrada a la función."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Añadir, eliminar o reordenar entradas para esta función."; +Blockly.Msg.REDO = "Rehacer"; Blockly.Msg.REMOVE_COMMENT = "Eliminar comentario"; Blockly.Msg.RENAME_VARIABLE = "Renombrar la variable…"; Blockly.Msg.RENAME_VARIABLE_TITLE = "Renombrar todas las variables «%1» a:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "quitar espacios iniciales de"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "quitar espacios finales de"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Devuelve una copia del texto sin los espacios de uno o ambos extremos."; Blockly.Msg.TODAY = "Hoy"; +Blockly.Msg.UNDO = "Deshacer"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "elemento"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crear 'establecer %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/fa.js b/msg/js/fa.js index f226c56390..5cd272ab7a 100644 --- a/msg/js/fa.js +++ b/msg/js/fa.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "مورد مشخص‌شده Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "آخرین مورد در یک فهرست را تعیین می‌کند."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "یک مورد تصادفی در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "ایجاد فهرست از متن"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ایجاد متن از فهرست"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "نام ورودی:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "اضافه کردن ورودی به تابع."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ورودی‌ها"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع."; +Blockly.Msg.REDO = "واگردانی"; Blockly.Msg.REMOVE_COMMENT = "حذف نظر"; Blockly.Msg.RENAME_VARIABLE = "تغییر نام متغیر..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "تغییر نام همهٔ متغیرهای «%1» به:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "تراشیدن فاصله‌ها از ط Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "تراشیدن فاصله‌ها از طرف چپ"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند."; Blockly.Msg.TODAY = "امروز"; +Blockly.Msg.UNDO = "واگردانی"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "مورد"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "درست‌کردن «تنظیم %1»"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/fi.js b/msg/js/fi.js index 3760178d80..ab84ec021b 100644 --- a/msg/js/fi.js +++ b/msg/js/fi.js @@ -9,8 +9,8 @@ goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Lisää kommentti"; Blockly.Msg.AUTH = "Valtuuta tämä ohjelma jotta voit tallettaa työsi ja jakaa sen."; Blockly.Msg.CHANGE_VALUE_TITLE = "Muuta arvoa:"; -Blockly.Msg.CHAT = "Keskustele yhteistyökumppanisi kanssa tässä laatikossa!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CHAT = "Keskustele yhteistyökumppanisi kanssa kirjoittamalla tähän kenttään!"; +Blockly.Msg.CLEAN_UP = "Siivoa lohkot"; Blockly.Msg.COLLAPSE_ALL = "Sulje lohkot"; Blockly.Msg.COLLAPSE_BLOCK = "Sulje lohko"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "väri 1"; @@ -62,7 +62,7 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "toista kunnes"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "toista niin kauan kuin"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Niin kauan kuin arvo on epätosi, suorita joukko lausekkeita."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Niin kauan kuin arvo on tosi, suorita joukko lausekkeita."; -Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Poistetaanko kaikki %1 lohkoa?"; Blockly.Msg.DELETE_BLOCK = "Poista lohko"; Blockly.Msg.DELETE_X_BLOCKS = "Poista %1 lohkoa"; Blockly.Msg.DISABLE_BLOCK = "Passivoi lohko"; @@ -143,10 +143,18 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Asettaa listan määrätyss Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Asettaa kohteen määrättyyn kohtaa listassa. Nro 1 on listan alku."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Asettaa listan viimeisen kohteen."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Asettaa satunnaisen kohteen listassa."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "tee listasta tekstiä"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "tee tekstistä lista"; -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "tee lista tekstistä"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "tee listasta teksti"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Yhdistä luettelon tekstit yhdeksi tekstiksi, erotettuina välimerkillä."; Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Jaa teksti osiin erotinmerkin perusteella ja järjestä osat listaksi."; Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "erottimen kanssa"; Blockly.Msg.LOGIC_BOOLEAN_FALSE = "epätosi"; @@ -171,7 +179,7 @@ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Lo Blockly.Msg.LOGIC_OPERATION_OR = "tai"; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Palauttaa tosi, jos kummatkin syötteet ovat tosia."; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Palauttaa tosi, jos ainakin yksi syötteistä on tosi."; -Blockly.Msg.LOGIC_TERNARY_CONDITION = "ehto"; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "testi"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "jos epätosi"; Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "jos tosi"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://fi.wikipedia.org/wiki/Alioh Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Suorittaa käyttäjän määrittelemän funktion '%1' ja käyttää sen tuotosta."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "parametrit:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Luo '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Kuvaile tämä funktio..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "tee jotain"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "palauta"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Luo funktio, jolla ei ole tuotosta."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Varoitus: tällä funktiolla on sama parametri useamman kerran."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Korosta funktion määritelmä"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Jos arvo on tosi, palauta toinen arvo."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Varoitus: tätä lohkoa voi käyttää vain funktion määrityksessä."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "syötteen nimi:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Lisää sisääntulon funktioon."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "syötteet"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Lisää, poista tai järjestele uudelleen tämän toiminnon tulot."; +Blockly.Msg.REDO = "Tee uudelleen"; Blockly.Msg.REMOVE_COMMENT = "Poista kommentti"; Blockly.Msg.RENAME_VARIABLE = "Nimeä uudelleen muuttuja..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Nimeä uudelleen kaikki '%1' muuttujaa:"; @@ -340,7 +349,7 @@ Blockly.Msg.TEXT_LENGTH_TITLE = "%1:n pituus"; Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Palauttaa annetussa tekstissä olevien merkkien määrän (välilyönnit mukaan lukien)."; Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg.TEXT_PRINT_TITLE = "tulosta %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Tulostaa annetun tekstin, numeron tia muun arvon."; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Tulostaa annetun tekstin, numeron tai muun arvon."; Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Kehottaa käyttäjää syöttämään numeron."; Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Kehottaa käyttäjää syöttämään tekstiä."; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "poistaa välilyönnit vasemmalta puolelta Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "poistaa välilyönnit oikealta puolelta"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Palauttaa kopion tekstistä siten, että välilyönnit on poistettu yhdestä tai molemmista päistä."; Blockly.Msg.TODAY = "Tänään"; +Blockly.Msg.UNDO = "Kumoa"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "kohde"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Luo 'aseta %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/fr.js b/msg/js/fr.js index 4efdbb22cc..7835f9169f 100644 --- a/msg/js/fr.js +++ b/msg/js/fr.js @@ -7,20 +7,20 @@ goog.provide('Blockly.Msg.fr'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Ajouter un commentaire"; -Blockly.Msg.AUTH = "Veuillez autoriser cette application à permettre la sauvegarde de votre travail et à l’autoriser à la partager."; +Blockly.Msg.AUTH = "Veuillez autoriser cette application à permettre la sauvegarde de votre travail et à l’autoriser d'être partagé par vous."; Blockly.Msg.CHANGE_VALUE_TITLE = "Modifier la valeur :"; -Blockly.Msg.CHAT = "Discuter avec votre collaborateur en tapant dans cette zone !"; +Blockly.Msg.CHAT = "Discutez avec votre collaborateur en tapant dans cette zone !"; Blockly.Msg.CLEAN_UP = "Nettoyer les blocs"; Blockly.Msg.COLLAPSE_ALL = "Réduire les blocs"; Blockly.Msg.COLLAPSE_BLOCK = "Réduire le bloc"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "couleur 1"; Blockly.Msg.COLOUR_BLEND_COLOUR2 = "couleur 2"; Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; -Blockly.Msg.COLOUR_BLEND_RATIO = "ratio"; +Blockly.Msg.COLOUR_BLEND_RATIO = "taux"; Blockly.Msg.COLOUR_BLEND_TITLE = "mélanger"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mélange deux couleurs avec un ratio donné (de 0.0 à 1.0)."; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Mélange deux couleurs dans une proportion donnée (de 0.0 à 1.0)."; Blockly.Msg.COLOUR_PICKER_HELPURL = "https://fr.wikipedia.org/wiki/Couleur"; -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choisir une couleur dans la palette"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choisir une couleur dans la palette."; Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated Blockly.Msg.COLOUR_RANDOM_TITLE = "couleur aléatoire"; Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choisir une couleur au hasard."; @@ -28,20 +28,20 @@ Blockly.Msg.COLOUR_RGB_BLUE = "bleu"; Blockly.Msg.COLOUR_RGB_GREEN = "vert"; Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; Blockly.Msg.COLOUR_RGB_RED = "rouge"; -Blockly.Msg.COLOUR_RGB_TITLE = "colorer avec"; -Blockly.Msg.COLOUR_RGB_TOOLTIP = "Créer une couleur avec la quantité de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100."; +Blockly.Msg.COLOUR_RGB_TITLE = "colorier avec"; +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."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "sortir de la boucle"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "continuer avec la prochaine itération de la boucle"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "quitter la boucle"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "passer à l’itération de boucle suivante"; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Sortir de la boucle englobante."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Sauter le reste de cette boucle, et poursuivre avec l’itération suivante."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Attention : Ce bloc ne devrait être utilisé que dans une boucle."; Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg.CONTROLS_FOREACH_TITLE = "pour chaque élément %1 dans la liste %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pour chaque élément dans une liste, donner la valeur de l’élément à la variable '%1', puis exécuter certains ordres."; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Pour chaque élément d’une liste, assigner la valeur de l’élément à la variable '%1', puis exécuter des instructions."; Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg.CONTROLS_FOR_TITLE = "compter avec %1 de %2 à %3 par %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Faire en sorte que la variable « %1 » prenne les valeurs depuis le numéro de début jusqu’au numéro de fin, en s’incrémentant de l’intervalle spécifié, et exécuter les ordres spécifiés."; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Faire prendre à la variable « %1 » les valeurs depuis le nombre de début jusqu’au nombre de fin, en s’incrémentant du pas spécifié, et exécuter les instructions spécifiées."; Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Ajouter une condition au bloc si."; Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Ajouter une condition finale fourre-tout au bloc si."; Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated @@ -56,13 +56,13 @@ Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Si la première valeur est vraie, alors ex Blockly.Msg.CONTROLS_REPEAT_HELPURL = "http://fr.wikipedia.org/wiki/Boucle_for"; Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "faire"; Blockly.Msg.CONTROLS_REPEAT_TITLE = "répéter %1 fois"; -Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Exécuter certains ordres plusieurs fois."; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Exécuter des instructions plusieurs fois."; Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "répéter jusqu’à"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "répéter tant que"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Tant qu’une valeur est fausse, alors exécuter certains ordres."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Tant qu’une valeur est vraie, alors exécuter certains ordres."; -Blockly.Msg.DELETE_ALL_BLOCKS = "Supprimer tous les %1 blocs ?"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Tant qu’une valeur est fausse, alors exécuter des instructions."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Tant qu’une valeur est vraie, alors exécuter des instructions."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Supprimer ces %1 blocs ?"; Blockly.Msg.DELETE_BLOCK = "Supprimer le bloc"; Blockly.Msg.DELETE_X_BLOCKS = "Supprimer %1 blocs"; Blockly.Msg.DISABLE_BLOCK = "Désactiver le bloc"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Fixe l’élément à la pos Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Fixe l’élément à la position indiquée dans une liste. #1 est le premier élément."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Fixe le dernier élément dans une liste."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Fixe un élément au hasard dans une liste."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "créer une liste depuis le texte"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "créer un texte depuis la liste"; @@ -153,13 +161,13 @@ Blockly.Msg.LOGIC_BOOLEAN_FALSE = "faux"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Renvoie soit vrai soit faux."; Blockly.Msg.LOGIC_BOOLEAN_TRUE = "vrai"; -Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://fr.wikipedia.org/wiki/Inegalite_(mathematiques)"; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Renvoyer vrai si les deux entrées sont égales."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Renvoyer vrai si la première entrée est plus grande que la seconde."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Renvoyer vrai si la première entrée est plus grande ou égale à la seconde."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Renvoyer vrai si la première entrée est plus petite que la seconde."; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Renvoyer vrai si la première entrée est plus petite ou égale à la seconde."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Renvoyer vrai si les deux entrées ne sont pas égales."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Renvoyer vrai si les deux entrées sont différentes."; Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg.LOGIC_NEGATE_TITLE = "pas %1"; Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Renvoie vrai si l’entrée est fausse. Renvoie faux si l’entrée est vraie."; @@ -177,7 +185,7 @@ Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "si faux"; Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "si vrai"; 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'."; Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://fr.wikipedia.org/wiki/Arithmetique"; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Renvoie la somme des deux nombres."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Renvoie le quotient des deux nombres."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Renvoie la différence des deux nombres."; @@ -202,9 +210,9 @@ Blockly.Msg.MATH_IS_TOOLTIP = "Vérifier si un nombre est pair, impair, premier, Blockly.Msg.MATH_IS_WHOLE = "est entier"; Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; Blockly.Msg.MATH_MODULO_TITLE = "reste de %1 ÷ %2"; -Blockly.Msg.MATH_MODULO_TOOLTIP = "Renvoyer le reste de la division des deux nombres."; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Renvoyer le reste de la division euclidienne des deux nombres."; Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_HELPURL = "https://fr.wikipedia.org/wiki/Nombre"; Blockly.Msg.MATH_NUMBER_TOOLTIP = "Un nombre."; Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "moyenne de la liste"; @@ -217,7 +225,7 @@ Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "écart-type de la liste"; Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "somme de la liste"; Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Renvoyer la moyenne (arithmétique) des valeurs numériques dans la liste."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Renvoyer le plus grand nombre dans la liste."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Renvoyer le nombre médian dans la liste."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Renvoyer le nombre médian de la liste."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Renvoyer le plus petit nombre dans la liste."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Renvoyer une liste des élément(s) le(s) plus courant(s) dans la liste."; Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Renvoyer un élément dans la liste au hasard."; @@ -232,11 +240,11 @@ Blockly.Msg.MATH_RANDOM_INT_TITLE = "entier aléatoire entre %1 et %2"; Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Renvoyer un entier aléatoire entre les deux limites spécifiées, incluses."; Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "arrondir"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrondir à l’inférieur"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrondir au supérieur"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "arrondir par défaut"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "arrondir par excès"; Blockly.Msg.MATH_ROUND_TOOLTIP = "Arrondir un nombre au-dessus ou au-dessous."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; -Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolu"; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://fr.wikipedia.org/wiki/Racine_carree"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "valeur absolue"; Blockly.Msg.MATH_SINGLE_OP_ROOT = "racine carrée"; Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Renvoie la valeur absolue d’un nombre."; Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Renvoie e à la puissance d’un nombre."; @@ -261,7 +269,7 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Renvoie le sinus d’un angle en degrés (p Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Renvoie la tangente d’un angle en degrés (pas en radians)."; Blockly.Msg.ME = "Moi"; Blockly.Msg.NEW_VARIABLE = "Nouvelle variable…"; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nom de la nouvelle variable :"; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nouveau nom de la variable :"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "autoriser les ordres"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "avec :"; @@ -271,27 +279,28 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Exécuter la fonction '%1' définie par l’utilisateur et utiliser son résultat."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "avec :"; Blockly.Msg.PROCEDURES_CREATE_DO = "Créer '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Décrire cette fonction…"; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faire quelque chose"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "à"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "pour"; Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Crée une fonction sans sortie."; Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retour"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crée une fonction avec une sortie."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attention : Cette fonction a des paramètres en double."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Surligner la définition de la fonction"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Si une valeur est vraie, alors renvoyer une seconde valeur."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attention : Ce bloc pourrait n’être utilisé que dans une définition de fonction."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom de l’entrée :"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Ajouter une entrée à la fonction."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entrées"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Ajouter, supprimer, ou réarranger les entrées de cette fonction."; +Blockly.Msg.REDO = "Refaire"; Blockly.Msg.REMOVE_COMMENT = "Supprimer un commentaire"; Blockly.Msg.RENAME_VARIABLE = "Renommer la variable…"; -Blockly.Msg.RENAME_VARIABLE_TITLE = "Renommer toutes les variables '%1' en :"; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Renommer toutes les variables « %1 » en :"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "ajouter le texte"; Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg.TEXT_APPEND_TO = "à"; @@ -333,7 +342,7 @@ Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text# Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 est vide"; Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Renvoie vrai si le texte fourni est vide."; Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "créer le texte avec"; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "créer un texte avec"; Blockly.Msg.TEXT_JOIN_TOOLTIP = "Créer un morceau de texte en agrégeant un nombre quelconque d’éléments."; Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg.TEXT_LENGTH_TITLE = "longueur de %1"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "supprimer les espaces du côté gauche"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "supprimer les espaces du côté droit"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Renvoyer une copie du texte avec les espaces supprimés d’un bout ou des deux."; Blockly.Msg.TODAY = "Aujourd'hui"; +Blockly.Msg.UNDO = "Annuler"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "élément"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Créer 'fixer %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/he.js b/msg/js/he.js index 8fed67320d..36497f7953 100644 --- a/msg/js/he.js +++ b/msg/js/he.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "הוסף תגובה"; Blockly.Msg.AUTH = "בבקשה נא לאשר את היישום הזה כדי לאפשר לעבודה שלך להישמר וכדי לאפשר את השיתוף על ידיך."; Blockly.Msg.CHANGE_VALUE_TITLE = "שנה ערך:"; Blockly.Msg.CHAT = "שוחח עם משתף פעולה שלך על-ידי הקלדה בתיבה זו!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "סידור בלוקים"; Blockly.Msg.COLLAPSE_ALL = "צמצם קטעי קוד"; Blockly.Msg.COLLAPSE_BLOCK = "צמצם קטע קוד"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "צבע 1"; @@ -53,7 +53,7 @@ Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "אם ערך נכון, לבצע כמה פע Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "אם הערך הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, לבצע את הבלוק השני של הפעולות."; Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "אם הערך הראשון הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, אם הערך השני הוא אמת, לבצע את הבלוק השני של הפעולות."; Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "אם הערך הראשון הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, אם הערך השני הוא אמת, לבצע את הבלוק השני של הפעולות. אם אף אחד מהם אינו נכון, לבצע את הבלוק האחרון של הפעולות."; -Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "http://he.wikipedia.org/wiki/בקרת_זרימה"; Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "תעשה"; Blockly.Msg.CONTROLS_REPEAT_TITLE = "חזור על הפעולה %1 פעמים"; Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "לעשות כמה פעולות מספר פעמים."; @@ -118,7 +118,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "יוצרת עותק של חלק מסו Blockly.Msg.LISTS_INDEX_OF_FIRST = "מחזירה את המיקום הראשון של פריט ברשימה"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "מחזירה את המיקום האחרון של פריט ברשימה"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "מחזירה את האינדקס של המופע ראשון/אחרון של הפריט ברשימה. מחזירה 0 אם טקסט אינו נמצא."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "מחזירה את האינדקס של המופע ראשון/אחרון של הפריט ברשימה. מחזירה 0 אם הפריט אינו נמצא."; Blockly.Msg.LISTS_INLIST = "ברשימה"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 הוא ריק"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "מגדיר את הפריט Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "מגדיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "מגדיר את הפריט האחרון ברשימה."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "מגדיר פריט אקראי ברשימה."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "יצירת רשימה מטקסט"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "יצירת טקסט מרשימה"; @@ -162,7 +170,7 @@ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "תחזיר אמת אם הקלט הרא Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "תחזיר אמת אם שני הקלטים אינם שווים זה לזה."; Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg.LOGIC_NEGATE_TITLE = "לא %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "החזר אמת אם הקלט הוא שקר. החזר שקר אם הקלט אמת."; Blockly.Msg.LOGIC_NULL = "null"; Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg.LOGIC_NULL_TOOLTIP = "תחזיר ריק."; @@ -179,10 +187,10 @@ Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "בדוק את התנאי ב'מבחן'. אם Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://he.wikipedia.org/wiki/ארבע_פעולות_החשבון"; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "תחזיר את סכום שני המספרים."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "החזרת המנה של שני המספרים."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "החזרת ההפרש בין שני מספרים."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "החזרת תוצאת הכפל בין שני מספרים."; -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "החזרת המספר הראשון בחזקת המספר השני."; Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg.MATH_CHANGE_TITLE = "change %1 by %2"; // untranslated Blockly.Msg.MATH_CHANGE_TOOLTIP = "הוסף מספר למשתנה '%1'."; @@ -204,7 +212,7 @@ Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operatio Blockly.Msg.MATH_MODULO_TITLE = "שארית החילוק %1 ÷ %2"; Blockly.Msg.MATH_MODULO_TOOLTIP = "החזרת השארית מחלוקת שני המספרים."; Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; -Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://he.wikipedia.org/wiki/מספר_ממשי"; Blockly.Msg.MATH_NUMBER_TOOLTIP = "מספר."; Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "ממוצע של רשימה"; @@ -235,30 +243,30 @@ Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "עיגול"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "עיגול למטה"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "עיגול למעלה"; Blockly.Msg.MATH_ROUND_TOOLTIP = "עיגול מספר למעלה או למטה."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; // untranslated +Blockly.Msg.MATH_SINGLE_HELPURL = "https://he.wikipedia.org/wiki/שורש_ריבועי"; Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "ערך מוחלט"; Blockly.Msg.MATH_SINGLE_OP_ROOT = "שורש ריבועי"; Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "החזרת הערך המוחלט של מספר."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "החזרת e בחזקת מספר."; Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "החזרת הלוגריתם הטבעי של מספר."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "החזרת הלוגריתם לפי בסיס עשר של מספר."; Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "החזרת הערך הנגדי של מספר."; -Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated -Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Return the square root of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "החזרת 10 בחזקת מספר."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "החזרת השורש הריבועי של מספר."; Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; Blockly.Msg.MATH_TRIG_ACOS = "acos"; Blockly.Msg.MATH_TRIG_ASIN = "asin"; Blockly.Msg.MATH_TRIG_ATAN = "atan"; Blockly.Msg.MATH_TRIG_COS = "cos"; -Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://he.wikipedia.org/wiki/פונקציות_טריגונומטריות"; Blockly.Msg.MATH_TRIG_SIN = "sin"; Blockly.Msg.MATH_TRIG_TAN = "tan"; Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "החזרת הקוסינוס של מעלה (לא רדיאן)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "החזרת הסינוס של מעלה (לא רדיאן)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "החזרת הטנגס של מעלה (לא רדיאן)."; Blockly.Msg.ME = "אותי"; Blockly.Msg.NEW_VARIABLE = "משתנה חדש..."; Blockly.Msg.NEW_VARIABLE_TITLE = "שם המשתנה החדש:"; @@ -289,7 +297,8 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "שם הקלט:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "הוסף קלט לפונקציה"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "מקורות קלט"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "הוסף, הסר או סדר מחדש קלטים לפונקציה זו"; -Blockly.Msg.REMOVE_COMMENT = "הסר הערה"; +Blockly.Msg.REDO = "ביצוע חוזר"; +Blockly.Msg.REMOVE_COMMENT = "הסר תגובה"; Blockly.Msg.RENAME_VARIABLE = "שנה את שם המשתנה..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "שנה את שם כל '%1' המשתנים ל:"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "הוספת טקסט"; @@ -313,8 +322,8 @@ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position. Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "צירוף"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "לאות # מהסוף"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "לאות #"; Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text"; // untranslated @@ -347,13 +356,14 @@ Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "בקשה למשתמש להזין טקס Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "בקשה למספר עם הודעה"; Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "בקשה להזנת טקסט עם הודעה"; Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated -Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "אות, מילה, או שורת טקסט."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "למחוק רווחים משני הקצוות"; Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "למחוק רווחים מימין"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "למחוק רווחים משמאל"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "להחזיר עותק של הטקסט לאחר מחיקת רווחים מאחד או משני הקצוות."; Blockly.Msg.TODAY = "היום"; +Blockly.Msg.UNDO = "ביטול"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "פריט"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "ליצור 'הגדר %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/hi.js b/msg/js/hi.js index 2d9afda2cd..84539aed5e 100644 --- a/msg/js/hi.js +++ b/msg/js/hi.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "सूची मे बत Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "सूची मे बताए गये स्थान में आइटम सैट करता है। #1 पहला आइटम है।"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "सूची में आखरी आइटम सैट करता है।"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "सूची में रैन्डम आइटम सैट करता है।"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "इनपुट का नाम:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "फंगक्शन को इनपुट प्रदान करें।"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "इनपुट"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "टिप्पणी हटायें"; Blockly.Msg.RENAME_VARIABLE = "चर का नाम बदलें..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "सभी '%1' चरों के नाम बदलें:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "रिक्त स्थान को Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "रिक्त स्थान को इस टेक्स्ट के दाईं तरफ से निकालें"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "आज"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "आइटम"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "सेट '%1' बनाएँ"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/hrx.js b/msg/js/hrx.js index 824460de07..bbe6bffe40 100644 --- a/msg/js/hrx.js +++ b/msg/js/hrx.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setzt das Element zu en defi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setzt das Element zu en definierte Stell in en List. #1 ist das earschte Element."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setzt das letzte Element an en List."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt en zufälliches Element an en List."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Markiear Funktionsblock"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Generier/erzeich \"Uffruf %1\""; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Parameter"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Variable:"; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Kommentar entferne"; Blockly.Msg.RENAME_VARIABLE = "Die neie Variable sei Noome:"; Blockly.Msg.RENAME_VARIABLE_TITLE = "All \"%1\" Variable umbenenne in:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "entferne Leerzeiche von Oonfang Seite"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "entferne Leerzeiche von End Seite von"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Entfernt Leerzeiche vom Oonfang und / orrer End von en Text."; Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "Element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Generier/erzeiche \"Schreibe %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/hu.js b/msg/js/hu.js index a34f944cd2..60fa8db0cf 100644 --- a/msg/js/hu.js +++ b/msg/js/hu.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "A megadott sorszámú elem c Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "A megadott sorszámú elem cseréje a listában. 1 az első elemet jelenti."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Az utolsó elem cseréje a listában."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Véletlenszerűen választott elem cseréje a listában."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lista készítése szövegből"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "sztring készítése listából"; @@ -270,8 +278,8 @@ Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Végrehajtja az eljárást."; Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Meghívja a függvényt."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "paraméterlistaː"; -Blockly.Msg.PROCEDURES_CREATE_DO = "Create \"do %1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_CREATE_DO = "„%1” létrehozása"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Írj erről a funkcióról..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "név"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "eredménye"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Függvény eredménnyel."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Figyelem: Az eljárásban azonos elnevezésű paramétert adtál meg."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Függvénydefiníció kiemelése"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ha az érték igaz, akkor visszatér a függvény értékével."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Figyelem: Ez a blokk csak függvénydefiníción belül használható."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "változó:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Bemenet hozzáadása a függvényhez."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "paraméterek"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Bemenetek hozzáadása, eltávolítása vagy átrendezése ehhez a függvényhez."; +Blockly.Msg.REDO = "Újra"; Blockly.Msg.REMOVE_COMMENT = "Megjegyzés törlése"; Blockly.Msg.RENAME_VARIABLE = "Változó átnevezése..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Minden \"%1\" változó átnevezése erre:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "szóközök levágása az elejéről"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "szóközök levágása a végéről"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Levágja a megadott szöveg végeiről a szóközöket."; Blockly.Msg.TODAY = "Ma"; +Blockly.Msg.UNDO = "Visszavonás"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "változó"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Készíts \"%1=\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/ia.js b/msg/js/ia.js index 747bed950b..c44402c486 100644 --- a/msg/js/ia.js +++ b/msg/js/ia.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Defini le valor del elemento Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Defini le valor del elemento al position specificate in un lista. № 1 es le prime elemento."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Defini le valor del ultime elemento in un lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Defini le valor de un elemento aleatori in un lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Crear un lista per un texto"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "crear un texto per un lista"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nomine del entrata:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adder un entrata al function."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entratas"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adder, remover o reordinar le entratas pro iste function."; +Blockly.Msg.REDO = "Refacer"; Blockly.Msg.REMOVE_COMMENT = "Remover commento"; Blockly.Msg.RENAME_VARIABLE = "Renominar variabile..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Renominar tote le variabiles '%1' a:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "remover spatios del sinistre latere de"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "remover spatios del dextre latere de"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retornar un copia del texto con spatios eliminate de un extremitate o ambes."; Blockly.Msg.TODAY = "Hodie"; +Blockly.Msg.UNDO = "Disfacer"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "cosa"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'mitter %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/id.js b/msg/js/id.js index 6c27e06229..c19e7ad8de 100644 --- a/msg/js/id.js +++ b/msg/js/id.js @@ -6,19 +6,19 @@ goog.provide('Blockly.Msg.id'); goog.require('Blockly.Msg'); -Blockly.Msg.ADD_COMMENT = "Tambahkan sebuah comment"; +Blockly.Msg.ADD_COMMENT = "Tambahkan Komentar"; Blockly.Msg.AUTH = "Silakan mengotorisasi aplikasi ini untuk memungkinkan pekerjaan Anda dapat disimpan dan digunakan bersama."; Blockly.Msg.CHANGE_VALUE_TITLE = "Ubah nilai:"; Blockly.Msg.CHAT = "Chatting dengan kolaborator anda dengan mengetikkan di kotak ini!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Bersihkan Blok"; Blockly.Msg.COLLAPSE_ALL = "Ciutkan Blok"; Blockly.Msg.COLLAPSE_BLOCK = "Ciutkan Blok"; -Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Warna 1"; -Blockly.Msg.COLOUR_BLEND_COLOUR2 = "Warna 2"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "warna 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "warna 2"; Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; Blockly.Msg.COLOUR_BLEND_RATIO = "rasio"; -Blockly.Msg.COLOUR_BLEND_TITLE = "Tertutup"; -Blockly.Msg.COLOUR_BLEND_TOOLTIP = "mencampur dua warna secara bersamaan dengan perbandingan (0.0-1.0)."; +Blockly.Msg.COLOUR_BLEND_TITLE = "campur"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Campur dua warna secara bersamaan dengan perbandingan (0.0 - 1.0)."; Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Pilih warna dari daftar warna."; Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated @@ -31,57 +31,57 @@ Blockly.Msg.COLOUR_RGB_RED = "merah"; Blockly.Msg.COLOUR_RGB_TITLE = "Dengan warna"; Blockly.Msg.COLOUR_RGB_TOOLTIP = "Buatlah warna dengan jumlah yang ditentukan dari merah, hijau dan biru. Semua nilai harus antarai 0 sampai 100."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Keluar dari perulangan"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "Lanjutkan dengan langkah penggulangan berikutnya"; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Keluar sementara dari perulanggan."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Abaikan sisa dari loop ini, dan lanjutkan dengan iterasi berikutnya."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Peringatan: Blok ini hanya dapat digunakan dalam loop."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "keluar dari perulangan"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "lanjutkan dengan langkah perulangan berikutnya"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Keluar dari perulangan."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Abaikan sisa dari perulangan ini, dan lanjutkan dengan langkah berikutnya."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Peringatan: Blok ini hanya dapat digunakan dalam perulangan."; Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg.CONTROLS_FOREACH_TITLE = "untuk setiap item %1 di dalam list %2"; Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Untuk tiap-tiap item di dalam list, tetapkan variabel '%1' ke dalam item, selanjutnya kerjakan beberapa statement."; Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg.CONTROLS_FOR_TITLE = "Cacah dengan %1 dari %2 ke %3 dengan step / penambahan %4"; Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Menggunakan variabel \"%1\" dengan mengambil nilai dari batas awal hingga ke batas akhir, dengan interval tertentu, dan mengerjakan block tertentu."; -Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "tambahkan prasyarat ke dalam blok IF."; -Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Terakhir, tambahkan tangkap-semua kondisi kedalam blok jika (if)."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Tambahkan prasyarat ke dalam blok IF."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Terakhir, tambahkan kondisi tangkap-semua kedalam blok IF."; Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated -Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Menambahkan, menghapus, atau menyusun kembali bagian untuk mengkonfigurasi blok IF ini."; -Blockly.Msg.CONTROLS_IF_MSG_ELSE = "else"; -Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "else if"; -Blockly.Msg.CONTROLS_IF_MSG_IF = "Jika"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "jika nilainya benar maka kerjakan perintah berikutnya."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "jika nilainya benar, maka kerjakan blok perintah yang pertama. Jika tidak, kerjakan blok perintah yang kedua."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Jika nilai pertama adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok pertama. Jika nilai kedua adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok kedua."; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Jika blok pertama adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok pertama. Atau jika blok kedua adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok kedua."; +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Tambahkan, hapus, atau susun kembali bagian untuk mengkonfigurasi blok IF ini."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "lainnya"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "atau jika"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "jika"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Jika nilainya benar, maka lakukan beberapa perintah."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Jika nilainya benar, maka kerjakan perintah blok pertama. Jika tidak, kerjakan perintah blok kedua."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Jika nilai pertama benar, maka kerjakan perintah blok pertama. Sebaliknya, jika nilai kedua benar, kerjakan perintah blok kedua."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Jika nilai pertama benar, maka kerjakan perintah blok pertama. Sebaliknya, jika nilai kedua benar, kerjakan perintah blok kedua. Jika dua-duanya tidak benar, kerjakan perintah blok terakhir."; Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "kerjakan"; Blockly.Msg.CONTROLS_REPEAT_TITLE = "ulangi %1 kali"; Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Lakukan beberapa perintah beberapa kali."; Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "Ulangi sampai"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "Ulangi jika"; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Jika sementara nilai tidak benar (false), maka lakukan beberapa perintah."; -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Jika sementara nilai benar (true), maka lakukan beberapa perintah."; -Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ulangi sampai"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ulangi jika"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Selagi nilainya salah, maka lakukan beberapa perintah."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Selagi nilainya benar, maka lakukan beberapa perintah."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Hapus semua %1 blok?"; Blockly.Msg.DELETE_BLOCK = "Hapus Blok"; Blockly.Msg.DELETE_X_BLOCKS = "Hapus %1 Blok"; Blockly.Msg.DISABLE_BLOCK = "Nonaktifkan Blok"; Blockly.Msg.DUPLICATE_BLOCK = "Duplikat"; Blockly.Msg.ENABLE_BLOCK = "Aktifkan Blok"; -Blockly.Msg.EXPAND_ALL = "Kembangkan blok-blok"; +Blockly.Msg.EXPAND_ALL = "Kembangkan Blok"; Blockly.Msg.EXPAND_BLOCK = "Kembangkan Blok"; -Blockly.Msg.EXTERNAL_INPUTS = "Input-input eksternal"; +Blockly.Msg.EXTERNAL_INPUTS = "Input Eksternal"; Blockly.Msg.HELP = "Bantuan"; -Blockly.Msg.INLINE_INPUTS = "Input inline"; +Blockly.Msg.INLINE_INPUTS = "Input Inline"; Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "buat list kosong"; -Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Mengembalikan daftar, dengan panjang 0, tidak berisi data"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Kembalikan list, dengan panjang 0, tidak berisi data"; Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "list"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Tambahkan, hapus, atau susun ulang bagian untuk mengkonfigurasi blok LIST (daftar) ini."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Tambahkan, hapus, atau susun ulang bagian untuk mengkonfigurasi blok list ini."; Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "buat daftar (list) dengan"; -Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Tambahkan sebuah item ke daftar (list)."; -Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Buat sebuah daftar (list) dengan sejumlah item."; +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "buat list dengan"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Tambahkan sebuah item ke list."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Buat sebuah list dengan sejumlah item."; Blockly.Msg.LISTS_GET_INDEX_FIRST = "pertama"; Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# dari akhir"; Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; @@ -91,44 +91,44 @@ Blockly.Msg.LISTS_GET_INDEX_LAST = "terakhir"; Blockly.Msg.LISTS_GET_INDEX_RANDOM = "acak"; Blockly.Msg.LISTS_GET_INDEX_REMOVE = "Hapus"; Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Kembalikan item pertama dalam daftar (list)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Sisipkan item ke dalam posisi yang telah ditentukan didalam list (daftar). Item pertama adalah item yang terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Sisipkan item ke dalam posisi yang telah ditentukan didalam list (daftar). Item pertama adalah item terakhir (yg paling akhir)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Mengembalikan item pertama dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Mengembalikan item acak dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Menghilangkan dan mengembalikan item pertama dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Menghilangkan dan mengembalikan barang di posisi tertentu dalam list (daftar). #1 adalah item terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Menghilangkan dan mengembalikan barang di posisi tertentu dalam list (daftar). #1 adalah item pertama."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Menghilangkan dan mengembalikan item terakhir dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Menghilangkan dan mengembalikan barang dengan acak dalam list (daftar)."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Menghapus item pertama dalam daftar."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Menghapus item dengan posisi tertentu dalam daftar. Item pertama adalah item yang terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Menghapus item dengan posisi tertentu dalam daftar. Item pertama adalah item yang terakhir."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Menghapus item terakhir dalam daftar."; -Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Menghapus sebuah item secara acak dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Kembalikan item pertama dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Kembalikan item di posisi tertentu dalam list. #1 adalah item terakhir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Kembalikan item di posisi tertentu dalam list. #1 adalah item pertama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Kembalikan item terakhir dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Kembalikan item acak dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Hapus dan kembalikan item pertama dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Hapus dan kembalikan item di posisi tertentu dalam list. #1 adalah item terakhir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Hapus dan kembalikan item di posisi tertentu dalam list. #1 adalah item pertama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Hapus dan kembalikan item terakhir dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Hapus dan kembalikan item acak dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Hapus item pertama dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Hapus item di posisi tertentu dalam list. #1 adalah item terakhir."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Hapus item di posisi tertentu dalam list. #1 adalah item pertama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Hapus item terakhir dalam list."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Hapus sebuah item acak dalam list."; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ke # dari akhir"; Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ke #"; Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "ke yang paling akhir"; Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Dapatkan bagian pertama dari list"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Dapatkan bagian list nomor # dari akhir"; -Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Dapatkan bagian daftar dari #"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "dapatkan sub-list dari pertama"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "dapatkan sub-list dari nomor # dari akhir"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "dapatkan sub-list dari #"; Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated -Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Membuat salinan dari bagian tertentu dari list."; +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Buat salinan bagian tertentu dari list."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "cari kejadian pertama item"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated -Blockly.Msg.LISTS_INDEX_OF_LAST = "Cari kejadian terakhir item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Mengembalikan indeks dari kejadian pertama/terakhir item dalam daftar. Menghasilkan 0 jika teks tidak ditemukan."; -Blockly.Msg.LISTS_INLIST = "dalam daftar"; +Blockly.Msg.LISTS_INDEX_OF_LAST = "cari kejadian terakhir item"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kembalikan indeks dari item pertama/terakhir kali muncul dalam list. Kembalikan 0 jika item tidak ditemukan."; +Blockly.Msg.LISTS_INLIST = "dalam list"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 kosong"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Mengembalikan nilai benar (true) jika list kosong."; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Kembalikan benar jika list kosong."; Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg.LISTS_LENGTH_TITLE = "panjang dari %1"; -Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Mengembalikan panjang daftar."; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Kembalikan panjang list."; Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated -Blockly.Msg.LISTS_REPEAT_TITLE = "membuat daftar dengan item %1 diulang %2 kali"; -Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Ciptakan daftar yang terdiri dari nilai yang diberikan diulang jumlah waktu yang ditentukan."; +Blockly.Msg.LISTS_REPEAT_TITLE = "buat list dengan item %1 diulang %2 kali"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Buat sebuah list yang terdiri dari nilai yang diberikan diulang sebanyak jumlah yang ditentukan."; Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "sebagai"; Blockly.Msg.LISTS_SET_INDEX_INSERT = "sisipkan di"; @@ -143,39 +143,47 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Tetapkan item ke dalam posis Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang pertama."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Menetapkan item terakhir dalam list."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Tetapkan secara acak sebuah item dalam list."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "membuat daftar dari teks"; -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "buat teks dari daftar"; +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "buat list dari teks"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "buat teks dari list"; Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Gabung daftar teks menjadi satu teks, yang dipisahkan oleh pembatas."; Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Membagi teks ke dalam daftar teks, pisahkan pada setiap pembatas."; Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "dengan pembatas"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "Salah"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "salah"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Mengembalikan betul (true) atau salah (false)."; -Blockly.Msg.LOGIC_BOOLEAN_TRUE = "Benar"; +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Kembalikan benar atau salah."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "benar"; Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Mengembalikan betul jika input kedua-duanya sama dengan satu sama lain."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Mengembalikan nilai benar (true) jika input yang pertama lebih besar dari input yang kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Mengembalikan nilai benar (true) jika input yang pertama lebih besar dari atau sama dengan input yang kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Mengembalikan nilai benar (true) jika input yang pertama lebih kecil dari input yang kedua."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Mengembalikan nilai benar (true) jika input yang pertama lebih kecil atau sama dengan input yang kedua ."; -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Mengembalikan nilai benar (true) jika kedua input tidak sama satu dengan yang lain."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Kembalikan benar jika kedua input sama satu dengan lainnya."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Kembalikan benar jika input pertama lebih besar dari input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Kembalikan benar jika input pertama lebih besar dari atau sama dengan input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Kembalikan benar jika input pertama lebih kecil dari input kedua."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Kembalikan benar jika input pertama lebih kecil atau sama dengan input kedua ."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Kembalikan benar jika kedua input tidak sama satu dengan lainnya."; Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg.LOGIC_NEGATE_TITLE = "bukan (not) %1"; -Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Mengembalikan nilai benar (true) jika input false. Mengembalikan nilai salah (false) jika input true."; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Kembalikan benar jika input salah. Kembalikan salah jika input benar."; Blockly.Msg.LOGIC_NULL = "null"; Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; -Blockly.Msg.LOGIC_NULL_TOOLTIP = "mengembalikan kosong."; +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Kembalikan null."; Blockly.Msg.LOGIC_OPERATION_AND = "dan"; Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg.LOGIC_OPERATION_OR = "atau"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Kembalikan betul jika kedua-dua input adalah betul."; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Mengembalikan nilai benar (true) jika setidaknya salah satu masukan nilainya benar (true)."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Kembalikan benar jika kedua input adalah benar."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Kembalikan benar jika minimal satu input nilainya benar."; Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; -Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "jika tidak benar (false)"; -Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "jika benar (true)"; -Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Periksa kondisi di \"test\". Jika kondisi benar (true), mengembalikan nilai \"jika benar\" ; Jik sebaliknya akan mengembalikan nilai \"jika salah\"."; +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "jika salah"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "jika benar"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Periksa kondisi di 'test'. Jika kondisi benar, kembalikan nilai 'if true'; jika sebaliknya kembalikan nilai 'if false'."; Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://id.wikipedia.org/wiki/Aritmetika"; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Kembalikan jumlah dari kedua angka."; @@ -192,48 +200,48 @@ Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28 Blockly.Msg.MATH_CONSTRAIN_TITLE = "Batasi %1 rendah %2 tinggi %3"; Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Batasi angka antara batas yang ditentukan (inklusif)."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; -Blockly.Msg.MATH_IS_DIVISIBLE_BY = "dibagi oleh"; +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "dapat dibagi oleh"; Blockly.Msg.MATH_IS_EVEN = "adalah bilangan genap"; -Blockly.Msg.MATH_IS_NEGATIVE = "adalah bilangan negatif"; +Blockly.Msg.MATH_IS_NEGATIVE = "adalah bilangan negatif"; Blockly.Msg.MATH_IS_ODD = "adalah bilangan ganjil"; -Blockly.Msg.MATH_IS_POSITIVE = "adalah bilangan positif"; +Blockly.Msg.MATH_IS_POSITIVE = "adalah bilangan positif"; Blockly.Msg.MATH_IS_PRIME = "adalah bilangan pokok"; -Blockly.Msg.MATH_IS_TOOLTIP = "Periksa apakah angka adalah bilangan genap, bilangan pokok, bilangan bulat, bilangan positif, bilangan negatif, atau apakan bisa dibagi oleh angka tertentu. Mengembalikan benar (true) atau salah (false)."; +Blockly.Msg.MATH_IS_TOOLTIP = "Periksa apakah angka adalah bilangan genap, bilangan ganjil, bilangan pokok, bilangan bulat, bilangan positif, bilangan negatif, atau apakan bisa dibagi oleh angka tertentu. Kembalikan benar atau salah."; Blockly.Msg.MATH_IS_WHOLE = "adalah bilangan bulat"; Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; -Blockly.Msg.MATH_MODULO_TITLE = "sisa %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TITLE = "sisa dari %1 ÷ %2"; Blockly.Msg.MATH_MODULO_TOOLTIP = "Kembalikan sisa dari pembagian ke dua angka."; Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; Blockly.Msg.MATH_NUMBER_TOOLTIP = "Suatu angka."; Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "rata-rata dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maximum dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "mode-mode dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "item acak dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviasi standar dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "jumlah dari list (daftar)"; -Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Kembalikan rata-rata (mean aritmetik) dari nilai numerik dari list (daftar)."; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "rata-rata dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maksimum dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "mode-mode dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "item acak dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "deviasi standar dari list"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "jumlah dari list"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Kembalikan rata-rata (mean aritmetik) dari nilai numerik dari list."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Kembalikan angka terbesar dari list."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Kembalikan median dari list."; Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Kembalikan angka terkecil dari list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Kembalikan list berisi item-item yang paling umum dari dalam list."; -Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Kembalikan element acak dari list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Kembalikan list berisi item yang paling umum dari dalam list."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Kembalikan elemen acak dari list."; Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Kembalikan standard deviasi dari list."; Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Kembalikan jumlah dari seluruh bilangan dari list."; Blockly.Msg.MATH_POWER_SYMBOL = "^"; Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; -Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "Nilai pecahan acak"; -Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Mengembalikan nilai acak pecahan antara 0.0 (inklusif) dan 1.0 (ekslusif)."; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "nilai pecahan acak"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Kembalikan nilai pecahan acak antara 0.0 (inklusif) dan 1.0 (eksklusif)."; Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; Blockly.Msg.MATH_RANDOM_INT_TITLE = "acak bulat dari %1 sampai %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Mengembalikan bilangan acak antara dua batas yang ditentukan, inklusif."; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Kembalikan bilangan acak antara dua batas yang ditentukan, inklusif."; Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "membulatkan"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "membulatkan kebawah"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "mengumpulkan"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "membulatkan keatas"; Blockly.Msg.MATH_ROUND_TOOLTIP = "Bulatkan suatu bilangan naik atau turun."; Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "mutlak"; @@ -256,12 +264,12 @@ Blockly.Msg.MATH_TRIG_TAN = "tan"; Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Kembalikan acosine dari angka."; Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Kembalikan asin dari angka."; Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Kembalikan atan dari angka."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kembalikan cos dari derajat (bukan radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Kembalikan cosinus dari derajat (bukan radian)."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Kembalikan sinus dari derajat (bukan radian)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kembalikan tangen dari derajat (tidak radian)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Kembalikan tangen dari derajat (bukan radian)."; Blockly.Msg.ME = "Saya"; -Blockly.Msg.NEW_VARIABLE = "Pembolehubah baru..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "Nama pembolehubah baru:"; +Blockly.Msg.NEW_VARIABLE = "Variabel baru..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Nama variabel baru:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "memungkinkan pernyataan"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "dengan:"; @@ -271,15 +279,15 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Menjalankan fungsi '%1' yang ditetapkan pengguna dan menggunakan outputnya."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "dengan:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Buat '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Jelaskan fungsi ini..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "buat sesuatu"; Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "untuk"; -Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Menciptakan sebuah fungsi dengan tiada output."; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Buat sebuah fungsi tanpa output."; Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "kembali"; -Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Menciptakan sebuah fungsi dengan satu output."; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Buat sebuah fungsi dengan satu output."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Peringatan: Fungsi ini memiliki parameter duplikat."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Sorot definisi fungsi"; Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated @@ -289,8 +297,9 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "masukan Nama:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Tambahkan masukan ke fungsi."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "input"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Menambah, menghapus, atau menyusun ulang masukan untuk fungsi ini."; -Blockly.Msg.REMOVE_COMMENT = "Hapus komentar"; -Blockly.Msg.RENAME_VARIABLE = "namai ulang variabel..."; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Hapus Komentar"; +Blockly.Msg.RENAME_VARIABLE = "Ubah nama variabel..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Ubah nama semua variabel '%1' menjadi:"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "tambahkan teks"; Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated @@ -322,7 +331,7 @@ Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "ambil bagian teks (substring) dari Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "ambil bagian teks (substring) dari huruf ke # dari terakhir"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "ambil bagian teks (substring) dari huruf no #"; Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Mengembalikan spesifik bagian dari teks."; +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Kembalikan spesifik bagian dari teks."; Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "dalam teks"; Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "temukan kejadian pertama dalam teks"; @@ -331,9 +340,9 @@ Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan 0 jika teks tidak ditemukan."; Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 kosong"; -Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kembalikan benar (true) jika teks yang disediakan kosong."; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Kembalikan benar jika teks yang disediakan kosong."; Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated -Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "Buat teks dengan"; +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "buat teks dengan"; Blockly.Msg.TEXT_JOIN_TOOLTIP = "Buat teks dengan cara gabungkan sejumlah item."; Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg.TEXT_LENGTH_TITLE = "panjang dari %1"; @@ -354,12 +363,13 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "pangkas ruang dari sisi kiri"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "pangkas ruang dari sisi kanan"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Kembali salinan teks dengan spasi dihapus dari satu atau kedua ujungnya."; Blockly.Msg.TODAY = "Hari ini"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "Membuat 'tetapkan %1'"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Buat 'set %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "Mengembalikan nilai variabel ini."; +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Kembalikan nilai variabel ini."; Blockly.Msg.VARIABLES_SET = "tetapkan %1 untuk %2"; -Blockly.Msg.VARIABLES_SET_CREATE_GET = "Membuat 'dapatkan %1'"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Buat 'get %1'"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg.VARIABLES_SET_TOOLTIP = "tetapkan variabel ini dengan input yang sama."; Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; diff --git a/msg/js/is.js b/msg/js/is.js index c7c07d5dfa..f9969e4e3c 100644 --- a/msg/js/is.js +++ b/msg/js/is.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "Skrifa skýringu"; Blockly.Msg.AUTH = "Vinsamlegast heimilaðu þetta forrit svo að hægt sé að vista verk þitt og svo að þú megir deila því"; Blockly.Msg.CHANGE_VALUE_TITLE = "Breyta gildi:"; Blockly.Msg.CHAT = "Spjallaðu við félaga með því að skrifa í þennan reit!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Hreinsa kubba"; Blockly.Msg.COLLAPSE_ALL = "Loka kubbum"; Blockly.Msg.COLLAPSE_BLOCK = "Loka kubbi"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "litur 1"; @@ -41,7 +41,7 @@ Blockly.Msg.CONTROLS_FOREACH_TITLE = "fyrir hvert %1 í lista %2"; Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Fyrir hvert atriði í lista er breyta '%1' stillt á atriðið og skipanir gerðar."; Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; Blockly.Msg.CONTROLS_FOR_TITLE = "telja með %1 frá %2 til %3 um %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Láta breytuna \"%1\" taka inn gildi frá fyrstu tölu til síðustu tölu hlaupandi á bilinu og endurtaka kubbana fyrir hverja tölu."; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Láta breytuna '%1' taka inn gildi frá fyrstu tölu til síðustu tölu, hlaupandi á tiltekna bilinu og gera tilteknu kubbana."; Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Bæta skilyrði við EF kubbinn."; Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Bæta við hluta EF kubbs sem grípur öll tilfelli sem uppfylla ekki hin skilyrðin."; Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; @@ -118,7 +118,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Býr til afrit af tilteknum hluta lista Blockly.Msg.LISTS_INDEX_OF_FIRST = "finna fyrsta tilfelli atriðis"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; Blockly.Msg.LISTS_INDEX_OF_LAST = "finna síðasta tilfelli atriðis"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar 0 ef textinn finnst ekki."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar 0 ef atriðið finnst ekki."; Blockly.Msg.LISTS_INLIST = "í lista"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tómur"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setur atriðið í tiltekna Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setur atriðið í tiltekna sætið í listanum. #1 er fyrsta atriðið."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setur atriðið í síðasta sæti lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setur atriðið í eitthvert sæti lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "gera lista úr texta"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "gera texta úr lista"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Keyra heimatilbúna fallið '%1' og nota úttak þess."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "með:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Búa til '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Lýstu þessari aðgerð/falli..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "gera eitthvað"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "skila"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Býr til fall sem skilar úttaki."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Aðvörun: Þetta fall er með tvítekna stika."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Sýna skilgreiningu falls"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Ef gildi er satt, skal skila öðru gildi."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "heiti inntaks:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Bæta inntaki við fallið."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inntök"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Bæta við, fjarlægja eða umraða inntökum fyrir þetta fall."; +Blockly.Msg.REDO = "Endurtaka"; Blockly.Msg.REMOVE_COMMENT = "Fjarlægja skýringu"; Blockly.Msg.RENAME_VARIABLE = "Endurnefna breytu..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Endurnefna allar '%1' breyturnar:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "eyða bilum vinstra megin við"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "eyða bilum hægra megin við"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Skila afriti af textanum þar sem möguleg bil við báða enda hafa verið fjarlægð."; Blockly.Msg.TODAY = "Í dag"; +Blockly.Msg.UNDO = "Afturkalla"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "atriði"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Búa til 'stilla %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; diff --git a/msg/js/it.js b/msg/js/it.js index 10b58ee8a6..e2f2e6d775 100644 --- a/msg/js/it.js +++ b/msg/js/it.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Imposta l'elemento nella pos Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Imposta l'elemento nella posizione indicata di una lista. 1 corrisponde al primo elemento."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Imposta l'ultimo elemento in una lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Imposta un elemento casuale in una lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "crea lista da testo"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "crea testo da lista"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://it.wikipedia.org/wiki/Funzi Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Esegue la funzione definita dall'utente '%1' ed usa il suo output."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "conː"; Blockly.Msg.PROCEDURES_CREATE_DO = "Crea '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descrivi questa funzione..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fai qualcosa"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "ritorna"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Crea una funzione con un output."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Attenzioneː Questa funzione ha parametri duplicati."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Evidenzia definizione di funzione"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se un valore è vero allora restituisce un secondo valore."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Attenzioneː Questo blocco può essere usato solo all'interno di una definizione di funzione."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome inputː"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Aggiungi un input alla funzione."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "input"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Aggiungi, rimuovi o riordina input alla funzione."; +Blockly.Msg.REDO = "Ripeti"; Blockly.Msg.REMOVE_COMMENT = "Rimuovi commento"; Blockly.Msg.RENAME_VARIABLE = "Rinomina variabile..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Rinomina tutte le variabili '%1' in:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "rimuovi spazi a sinistra"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "rimuovi spazi a destra"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Restituisce una copia del testo con gli spazi rimossi ad uno o entrambe le estremità."; Blockly.Msg.TODAY = "Oggi"; +Blockly.Msg.UNDO = "Annulla"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "elemento"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crea 'imposta %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/ja.js b/msg/js/ja.js index 59ae681511..ffb0287058 100644 --- a/msg/js/ja.js +++ b/msg/js/ja.js @@ -62,7 +62,7 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "までを繰り返します"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "つつその間、繰り返す4"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "値は false のあいだ、いくつかのステートメントを行います。"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "値は true のあいだ、いくつかのステートメントを行います。"; -Blockly.Msg.DELETE_ALL_BLOCKS = "%1 個すべてのブロックを消しますか?"; +Blockly.Msg.DELETE_ALL_BLOCKS = "%1件のすべてのブロックを消しますか?"; Blockly.Msg.DELETE_BLOCK = "ブロックを消す"; Blockly.Msg.DELETE_X_BLOCKS = "%1 個のブロックを消す"; Blockly.Msg.DISABLE_BLOCK = "ブロックを無効にします。"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "リスト内の指定され Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "リスト内の指定された位置に項目を設定します。# 1 は、最初の項目です。"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "リスト内の最後の項目を設定します。"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "リスト内にランダムなアイテムを設定します。"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "テキストからリストを作る"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "リストからテキストを作る"; @@ -289,7 +297,8 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "入力名:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "入力"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "コメントを削除します。"; +Blockly.Msg.REDO = "やり直し"; +Blockly.Msg.REMOVE_COMMENT = "コメントを削除"; Blockly.Msg.RENAME_VARIABLE = "変数の名前を変更."; Blockly.Msg.RENAME_VARIABLE_TITLE = "%1の変数すべてを名前変更します。"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "テキストを追加します。"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "左端のスペースを取り除く"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "右端のスペースを取り除く"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "スペースを 1 つまたは両方の端から削除したのち、テキストのコピーを返します。"; Blockly.Msg.TODAY = "今日"; +Blockly.Msg.UNDO = "取り消し"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "項目"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "'セット%1を作成します。"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/ko.js b/msg/js/ko.js index fded75b1af..07e4db0bd1 100644 --- a/msg/js/ko.js +++ b/msg/js/ko.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "특정 번째 위치의 아 Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "특정 번째 위치의 아이템으로 설정합니다. #1 는 첫번째 아이템."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "마지막 아이템으로 설정합니다."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "목록에서 임의 위치의 아이템을 설정합니다."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "텍스트에서 목록 만들기"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "목록에서 텍스트 만들기"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "미리 정의해 둔 '%1' 함수를 실행하고, 함수를 실행한 결과 값을 돌려줍니다."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "사용:"; Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' 생성"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "이 함수를 설명하세요..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "함수 이름"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "다음을 돌려줌"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "실행 후, 결과 값을 돌려주는 함수를 만듭니다."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "경고: 이 함수에는, 같은 이름을 사용하는 매개 변수들이 있습니다."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "함수 정의 찾기"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "값이 참이라면, 두번째 값을 반환합니다."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "경고: 이 블럭은, 함수 정의 블럭 안에서만 사용할 수 있습니다."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "매개 변수:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "함수에 값을 더합니다."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "매개 변수들"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "이 함수를 추가, 삭제, 혹은 재정렬합니다."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "내용 제거"; Blockly.Msg.RENAME_VARIABLE = "변수 이름 바꾸기:"; Blockly.Msg.RENAME_VARIABLE_TITLE = "'%1' 변수 이름을 바꾸기:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "왼쪽의 공백 문자 제거"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "오른쪽의 공백 문자 제거"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "문장의 왼쪽/오른쪽/양쪽에서 스페이스 문자를 제거해 돌려줍니다."; Blockly.Msg.TODAY = "오늘"; +Blockly.Msg.UNDO = "끄르다"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "항목"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "'집합 %1' 생성"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)"; diff --git a/msg/js/lb.js b/msg/js/lb.js index a4bd60dc56..b267f1547f 100644 --- a/msg/js/lb.js +++ b/msg/js/lb.js @@ -11,7 +11,7 @@ Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved an Blockly.Msg.CHANGE_VALUE_TITLE = "Wäert änneren:"; Blockly.Msg.CHAT = "Mat ärem Mataarbechter chatten an deem Dir an dës Këscht tippt!"; Blockly.Msg.CLEAN_UP = "Bléck opraumen"; -Blockly.Msg.COLLAPSE_ALL = "Collapse Blocks"; // untranslated +Blockly.Msg.COLLAPSE_ALL = "Bléck zesummeklappen"; Blockly.Msg.COLLAPSE_BLOCK = "Block zesummeklappen"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "Faarf 1"; Blockly.Msg.COLOUR_BLEND_COLOUR2 = "Faarf 2"; @@ -20,7 +20,7 @@ Blockly.Msg.COLOUR_BLEND_RATIO = "ratio"; Blockly.Msg.COLOUR_BLEND_TITLE = "mëschen"; Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; // untranslated -Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Wielt eng Faarf vun der Palette."; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Sicht eng Faarf an der Palette eraus."; Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated Blockly.Msg.COLOUR_RANDOM_TITLE = "zoufälleg Faarf"; Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Eng zoufälleg Faarf eraussichen."; @@ -40,7 +40,7 @@ Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/L Blockly.Msg.CONTROLS_FOREACH_TITLE = "fir all Element %1 an der Lëscht %2"; Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "zielt mat %1 vun %2 bis %3 mat %4"; Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated @@ -54,19 +54,19 @@ Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "If a value is true, then do the first block 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."; // untranslated 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."; // untranslated Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; // untranslated -Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "maachen"; -Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1 mol widderhuelen"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "maach"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "%1-mol widderhuelen"; Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; // untranslated Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "widderhuele bis"; -Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repeat while"; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated -Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "Widderhuel soulaang"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Féiert d'Uweisungen aus, soulaang wéi de Wäert falsch ass."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Féiert d'Uweisungen aus, soulaang wéi de Wäert richteg ass"; Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated Blockly.Msg.DELETE_BLOCK = "Block läschen"; Blockly.Msg.DELETE_X_BLOCKS = "%1 Bléck läschen"; Blockly.Msg.DISABLE_BLOCK = "Block desaktivéieren"; -Blockly.Msg.DUPLICATE_BLOCK = "Duplizéieren"; +Blockly.Msg.DUPLICATE_BLOCK = "Eng Kopie maachen"; Blockly.Msg.ENABLE_BLOCK = "Block aktivéieren"; Blockly.Msg.EXPAND_ALL = "Bléck opklappen"; Blockly.Msg.EXPAND_BLOCK = "Block opklappen"; @@ -83,7 +83,7 @@ Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; // untranslated Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "En Element op d'Lëscht derbäisetzen."; Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated Blockly.Msg.LISTS_GET_INDEX_FIRST = "éischt"; -Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# vum Schluss"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# vun hannen"; Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; Blockly.Msg.LISTS_GET_INDEX_GET = "get"; // untranslated Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; // untranslated @@ -136,13 +136,21 @@ Blockly.Msg.LISTS_SET_INDEX_SET = "set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Setzt d'Element um Ënn vun enger Lëscht derbäi."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Setzt d'Element um Enn vun enger Lëscht derbäi."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Setzt d'Element op eng zoufälleg Plaz an d'Lëscht derbäi."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt en zuofällegt Element an eng Lëscht."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setzt en zoufällegt Element an eng Lëscht."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -171,14 +179,14 @@ Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Lo Blockly.Msg.LOGIC_OPERATION_OR = "oder"; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; // untranslated Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; // untranslated -Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "Test"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "wa falsch"; Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "wa wouer"; 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."; // untranslated Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated -Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Gëtt d'Zomme vun zwou Zuelen."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Den Total vun den zwou Zuelen zréckginn."; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Return the quotient of the two numbers."; // untranslated Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Return the difference of the two numbers."; // untranslated Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "D'Produkt vun den zwou Zuelen zréckginn."; @@ -195,7 +203,7 @@ Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated Blockly.Msg.MATH_IS_DIVISIBLE_BY = "is divisible by"; // untranslated Blockly.Msg.MATH_IS_EVEN = "ass gerued"; Blockly.Msg.MATH_IS_NEGATIVE = "ass negativ"; -Blockly.Msg.MATH_IS_ODD = "ass net gerued"; +Blockly.Msg.MATH_IS_ODD = "ass ongerued"; Blockly.Msg.MATH_IS_POSITIVE = "ass positiv"; Blockly.Msg.MATH_IS_PRIME = "ass eng Primzuel"; 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."; // untranslated @@ -207,7 +215,7 @@ Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg.MATH_NUMBER_TOOLTIP = "Eng Zuel."; Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated -Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Duerchschnëtt vun der Lëscht"; +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "Moyenne vun der Lëscht"; Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "Maximum aus der Lëscht"; Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "median of list"; // untranslated Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "min of list"; // untranslated @@ -232,10 +240,10 @@ Blockly.Msg.MATH_RANDOM_INT_TITLE = "zoufälleg ganz Zuel tëscht %1 a(n) %2"; Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "opronnen"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ofronnen"; -Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "opronnen"; -Blockly.Msg.MATH_ROUND_TOOLTIP = "Eng Zuel op- oder ofronnen."; -Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "ofrënnen"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "oprënnen"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Eng Zuel op- oder ofrënnen."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://lb.wikipedia.org/wiki/Racine carrée"; Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolut"; Blockly.Msg.MATH_SINGLE_OP_ROOT = "Quadratwuerzel"; Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "mat:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'"; // untranslated -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Dës Funktioun beschreiwen..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "eppes maachen"; @@ -289,7 +297,8 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated -Blockly.Msg.REMOVE_COMMENT = "Bemierkunge ewechhuelen"; +Blockly.Msg.REDO = "Widderhuelen"; +Blockly.Msg.REMOVE_COMMENT = "Bemierkung ewechhuelen"; Blockly.Msg.RENAME_VARIABLE = "Variabel ëmbenennen..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "All '%1' Variabelen ëmbenennen op:"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "Text drunhänken"; @@ -314,8 +323,8 @@ Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "En Element bei den Text derbäisetz Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "join"; // untranslated Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis de Buschtaf #"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "op de leschte Buschtaw"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "bis bei de Buschtaf #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "bis bei de leschte Buschtaw"; Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "am Text"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated @@ -343,7 +352,7 @@ Blockly.Msg.TEXT_PRINT_TITLE = "%1 drécken"; Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number or other value."; // untranslated Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated -Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Freet de Benotzer en Text."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Frot de Benotzer no engem Text."; Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untra Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "Haut"; +Blockly.Msg.UNDO = "Réckgängeg maachen"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "Element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/lki.js b/msg/js/lki.js index 14282648de..fff84fccc7 100644 --- a/msg/js/lki.js +++ b/msg/js/lki.js @@ -65,9 +65,9 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "تا زمانی که یک مق Blockly.Msg.DELETE_ALL_BLOCKS = "حةذف کؤل %1 بلاکةل?"; Blockly.Msg.DELETE_BLOCK = "پاک کردن بلاک"; Blockly.Msg.DELETE_X_BLOCKS = "حةذف %1 بلاکةل"; -Blockly.Msg.DISABLE_BLOCK = "إ کارکةتن بلاک"; +Blockly.Msg.DISABLE_BLOCK = "إ کار کةتن(غیرفعال‌سازی) بلاک"; Blockly.Msg.DUPLICATE_BLOCK = "کؤپی کردن"; -Blockly.Msg.ENABLE_BLOCK = "إ کارآشتن بلاک"; +Blockly.Msg.ENABLE_BLOCK = "إ کارآشتن(فعال)بلاک"; Blockly.Msg.EXPAND_ALL = "کةلنگآ کردِن بلاکةل"; Blockly.Msg.EXPAND_BLOCK = "کةلنگآ کردِن بلاک"; Blockly.Msg.EXTERNAL_INPUTS = "ورودیةل خروجی"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "مورد مشخص‌شده Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "آخرین مورد در یک فهرست را تعیین می‌کند."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "یک مورد تصادفی در یک فهرست را تعیین می‌کند."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "ساخت لیست إژ متن"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ساخت متن إژ لیست"; @@ -205,7 +213,7 @@ Blockly.Msg.MATH_MODULO_TITLE = "باقی‌ماندهٔ %1 + %2"; Blockly.Msg.MATH_MODULO_TOOLTIP = "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند."; Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; -Blockly.Msg.MATH_NUMBER_TOOLTIP = "یک عدد."; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "شؤمارە یەک"; Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "میانگین فهرست"; Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "بزرگ‌ترین فهرست"; @@ -289,7 +297,8 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "نام ورودی:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "اضافه کردن ورودی به تابع."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ورودی‌ها"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع."; -Blockly.Msg.REMOVE_COMMENT = "گةپة پاک کة"; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "پاک کردن گةپةل/قِسةل"; Blockly.Msg.RENAME_VARIABLE = "تغییر نام متغیر..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "تغییر نام همهٔ متغیرهای «%1» به:"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "چسباندن متن"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "تراشیدن فاصله‌ها از ط Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "تراشیدن فاصله‌ها از طرف چپ"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند."; Blockly.Msg.TODAY = "ایمڕۆ"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "آیتم"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "درست‌کردن «تنظیم %1»"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/lrc.js b/msg/js/lrc.js index 65ff060aa6..a616694e52 100644 --- a/msg/js/lrc.js +++ b/msg/js/lrc.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specifi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "نوم داده:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "داده یا"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "نظر جا وه جا کو"; Blockly.Msg.RENAME_VARIABLE = "د نو نوم نیائن آلشتگر..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "د نو نوم نیائن %1 د تموم آلشتگریا د:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untra Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "ئمروٙ"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "قلم"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/lt.js b/msg/js/lt.js index 9fd4a39d98..9bfa65c0af 100644 --- a/msg/js/lt.js +++ b/msg/js/lt.js @@ -62,7 +62,7 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "kartok, kol pasieksi"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "kartok kol"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Kartoja veiksmus, kol bus pasiekta nurodyta sąlyga."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Kartoja veiksmus, kol sąlyga tenkinama."; -Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Ištrinti visus %1 blokus?"; Blockly.Msg.DELETE_BLOCK = "Ištrinti bloką"; Blockly.Msg.DELETE_X_BLOCKS = "Ištrinti %1 blokus"; Blockly.Msg.DISABLE_BLOCK = "Išjungti bloką"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specifi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "parametro pavadinimas:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Pridėti funkcijos parametrą (gaunamų duomenų pavadinimą)."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "gaunami duomenys (parametrai)"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Tvarkyti komandos gaunamus duomenis (parametrus)."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Pašalinti komentarą"; Blockly.Msg.RENAME_VARIABLE = "Pervardyti kintamajį..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Pervadinti visus '%1' kintamuosius į:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "išvalyk tarpus pradžioje"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "išvalyk tarpus pabaigoje"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "Šiandien"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "elementas"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Sukurk \"priskirk %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/mk.js b/msg/js/mk.js index f0c61a778d..b42a5387f4 100644 --- a/msg/js/mk.js +++ b/msg/js/mk.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specifi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Отстрани коментар"; Blockly.Msg.RENAME_VARIABLE = "Преименувај променлива..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Преименувај ги сите променливи „%1“ во:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untra Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "елемент"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/ms.js b/msg/js/ms.js index 3bfaddfb94..7ceccd71ba 100644 --- a/msg/js/ms.js +++ b/msg/js/ms.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "Berikan Komen"; Blockly.Msg.AUTH = "Sila benarkan aplikasi ini untuk membolehkan hasil kerja anda disimpan, malah dikongsikan oleh anda."; Blockly.Msg.CHANGE_VALUE_TITLE = "Ubah nilai:"; Blockly.Msg.CHAT = "Bersembang dengan rakan kerjasama anda dengan menaip di dalam petak ini!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Kemaskan Blok"; Blockly.Msg.COLLAPSE_ALL = "Lipat Blok²"; Blockly.Msg.COLLAPSE_BLOCK = "Lipat Blok"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "warna 1"; @@ -41,7 +41,7 @@ Blockly.Msg.CONTROLS_FOREACH_TITLE = "untuk setiap perkara %1 dalam senarai %2"; Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Untuk setiap perkara dalam senarai, tetapkan pembolehubah '%1' pada perkara, kemudian lakukan beberapa perintah."; Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg.CONTROLS_FOR_TITLE = "kira dengan %1 dari %2 hingga %3 selang %4"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Gunakan pembolehubah \"%1\" pada nilai-nilai dari nombor pangkal hingga nombor hujung, mengira mengikut selang yang ditentukan, dan lakukan blok-blok yang tertentu."; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Gunakan pembolehubah '%1' pada nilai-nilai dari nombor pangkal hingga nombor hujung, mengira mengikut selang yang ditentukan, dan lakukan blok-blok yang tertentu."; Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Tambah satu syarat kepada blok jika."; Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Tambah yang terakhir, alihkan semua keadaan ke blok jika."; Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated @@ -118,7 +118,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Wujudkan salinan bahagian yang ditentuk Blockly.Msg.LISTS_INDEX_OF_FIRST = "cari pertama item kejadian"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "cari kejadian akhir item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Kembalikan indeks kejadian pertama/terakhir item dalam senarai. Kembalikan 0 jika teks tidak ditemui."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Menyatakan indeks kejadian pertama/terakhir item berkenaan dalam senarai. Menyatakan 0 jika item berkenaan tidak ditemui."; Blockly.Msg.LISTS_INLIST = "dalam senarai"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 adalah kosong"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Masukkan item pada posisi ya Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Set item terakhir dalam senarai."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Set item rawak dalam senarai."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "buat senarai dgn teks"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "buat teks drpd senarai"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ms.wikipedia.org/wiki/Fungs Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "dengan:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Hasilkan '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Terangkan fungsi ini..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Buat sesuatu"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "kembali"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Mencipta satu fungsi dengan pengeluaran."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Amaran: Fungsi ini mempunyai parameter yang berganda."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Serlahkan definisi fungsi"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Amaran: Blok ini hanya boleh digunakan dalam fungsi definisi."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Nama input:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Tambah satu input pada fungsi."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Input-input"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Tambah, alih keluar atau susun semula input pada fungsi ini."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Padamkan Komen"; Blockly.Msg.RENAME_VARIABLE = "Tukar nama pembolehubah..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Tukar nama semua pembolehubah '%1' kepada:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "mengurangkan ruang dari sebelah kiri"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "mengurangkan kawasan dari sisi kanan"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Kembali salinan teks dengan ruang yang dikeluarkan daripada satu atau hujung kedua belah."; Blockly.Msg.TODAY = "Hari ini"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "Perkara"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Hasilkan 'set %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/nb.js b/msg/js/nb.js index 0acb26bca9..2f09735ffe 100644 --- a/msg/js/nb.js +++ b/msg/js/nb.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "Legg til kommentar"; Blockly.Msg.AUTH = "Vennligst godkjenn at denne appen gjør det mulig for deg å lagre arbeidet slik at du kan dele det."; Blockly.Msg.CHANGE_VALUE_TITLE = "Bytt verdi:"; Blockly.Msg.CHAT = "Chat med din medarbeider ved å skrive i dette feltet!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Rydd opp Blocks"; Blockly.Msg.COLLAPSE_ALL = "Skjul blokker"; Blockly.Msg.COLLAPSE_BLOCK = "Skjul blokk"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "farge 1"; @@ -118,7 +118,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Kopiérer en ønsket del av en liste."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "finn første forekomst av elementet"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "finn siste forekomst av elementet"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer posisjonen til den første/siste forekomsten av elementet i en liste. Returnerer 0 hvis ikke funnet."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returnerer indeksen av den første/siste forekomsten av elementet i lista. Returnerer 0 hvis ikke funnet."; Blockly.Msg.LISTS_INLIST = "i listen"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 er tom"; @@ -143,9 +143,17 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setter inn elementet ved den Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det første elementet."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Angir det siste elementet i en liste."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Angir et tilfeldig element i en liste."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lag liste av tekst"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "lag tekst av liste"; Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Navn på parameter:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Legg til en input til funksjonen."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "parametere"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Legg til, fjern eller endre rekkefølgen på input til denne funksjonen."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Fjern kommentar"; Blockly.Msg.RENAME_VARIABLE = "Gi nytt navn til variabel..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Endre navnet til alle '%1' variabler til:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "fjern mellomrom fra venstre side av"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "fjern mellomrom fra høyre side av"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returner en kopi av teksten med mellomrom fjernet fra en eller begge sidene."; Blockly.Msg.TODAY = "I dag"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Opprett 'sett %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/nl.js b/msg/js/nl.js index 9c25ae61e5..1bbdb1e1c2 100644 --- a/msg/js/nl.js +++ b/msg/js/nl.js @@ -11,8 +11,8 @@ Blockly.Msg.AUTH = "Sta deze app toe om uw werk op te slaan het uw werk te delen Blockly.Msg.CHANGE_VALUE_TITLE = "Waarde wijzigen:"; Blockly.Msg.CHAT = "Chat met iemand die ook aan het werk is via dit venster!"; Blockly.Msg.CLEAN_UP = "Blokken opschonen"; -Blockly.Msg.COLLAPSE_ALL = "Blokken inklappen"; -Blockly.Msg.COLLAPSE_BLOCK = "Blok inklappen"; +Blockly.Msg.COLLAPSE_ALL = "Blokken samenvouwen"; +Blockly.Msg.COLLAPSE_BLOCK = "Blok samenvouwen"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "kleur 1"; Blockly.Msg.COLOUR_BLEND_COLOUR2 = "kleur 2"; Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Stelt het item op een opgege Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Stelt het item op de opgegeven positie in de lijst in. Item 1 is het eerste item."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Stelt het laatste item van een lijst in."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Stelt een willekeurig item uit de lijst in."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "lijst maken van tekst"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "tekst maken van lijst"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subpr Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Voer de door de gebruiker gedefinieerde functie \"%1\" uit en gebruik de uitvoer."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "met:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Maak \"%1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Deze functie beschrijven..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://nl.wikipedia.org/wiki/Subprogramma"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "doe iets"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "uitvoeren"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Maakt een functie met een uitvoer."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Waarschuwing: deze functie heeft parameters met dezelfde naam."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Accentueer functiedefinitie"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Als de eerste waarde \"waar\" is, geef dan de tweede waarde terug."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Waarschuwing: dit blok mag alleen gebruikt worden binnen de definitie van een functie."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "invoernaam:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Een invoer aan de functie toevoegen."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ingangen"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Invoer van deze functie toevoegen, verwijderen of herordenen."; +Blockly.Msg.REDO = "Opnieuw"; Blockly.Msg.REMOVE_COMMENT = "Opmerking verwijderen"; Blockly.Msg.RENAME_VARIABLE = "Variabele hernoemen..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Alle variabelen \"%1\" hernoemen naar:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "spaties van de linkerkant verwijderen van Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "spaties van de rechterkant verwijderen van"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Geeft een kopie van de tekst met verwijderde spaties van één of beide kanten."; Blockly.Msg.TODAY = "Vandaag"; +Blockly.Msg.UNDO = "Ongedaan maken"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Maak \"verander %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; diff --git a/msg/js/oc.js b/msg/js/oc.js index a657ad6f46..2947d8b6b1 100644 --- a/msg/js/oc.js +++ b/msg/js/oc.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specifi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nom de l’entrada :"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Suprimir un comentari"; Blockly.Msg.RENAME_VARIABLE = "Renomenar la variabla…"; Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; // untranslated @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untra Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crear 'fixar %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/pl.js b/msg/js/pl.js index 5a9f8ba606..fa0ad887a5 100644 --- a/msg/js/pl.js +++ b/msg/js/pl.js @@ -7,7 +7,7 @@ goog.provide('Blockly.Msg.pl'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Dodaj komentarz"; -Blockly.Msg.AUTH = "Proszę autoryzować ten program, aby można było zapisać swoją pracę i umożliwić Ci dzielenie się nią."; +Blockly.Msg.AUTH = "Autoryzuj ten program, aby można było zapisać Twoją pracę i umożliwić Ci dzielenie się nią z innymi."; Blockly.Msg.CHANGE_VALUE_TITLE = "Zmień wartość:"; Blockly.Msg.CHAT = "Rozmawiaj z swoim współpracownikiem, pisząc w tym polu!"; Blockly.Msg.CLEAN_UP = "Uporządkuj bloki"; @@ -35,10 +35,10 @@ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "wyjdź z pętli"; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "przejdź do kolejnej iteracji pętli"; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Wyjdź z zawierającej pętli."; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Pomiń resztę pętli i kontynuuj w kolejnej iteracji."; -Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Ostrzeżenie: Ten blok może być użyty tylko w pętli."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Uwaga: Ten blok może być użyty tylko w pętli."; Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg.CONTROLS_FOREACH_TITLE = "dla każdego elementu %1 na liście %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Dla każdego elementu z listy przyporządkuj zmienną '%1', a następnie wykonaj kilka instrukcji."; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Dla każdego elementu listy ustaw zmienną %1 na ten element, a następnie wykonaj kilka instrukcji."; Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg.CONTROLS_FOR_TITLE = "licz z %1 od %2 do %3 co %4 (wartość kroku)"; Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Przypisuje zmiennej %1 wartości od numeru startowego do numeru końcowego, licząc co określony interwał, wykonując określone bloki."; @@ -62,11 +62,11 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "powtarzaj aż"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "powtarzaj dopóki"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Gdy wartość jest nieprawdziwa, wykonaj kilka instrukcji."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Gdy wartość jest prawdziwa, wykonaj kilka instrukcji."; -Blockly.Msg.DELETE_ALL_BLOCKS = "Usunąć wszystkie %1 bloki?"; +Blockly.Msg.DELETE_ALL_BLOCKS = "Usunąć wszystkie %1 bloki(ów)?"; Blockly.Msg.DELETE_BLOCK = "Usuń blok"; -Blockly.Msg.DELETE_X_BLOCKS = "Usunąć %1 bloki(ów)"; +Blockly.Msg.DELETE_X_BLOCKS = "Usuń %1 bloki(ów)"; Blockly.Msg.DISABLE_BLOCK = "Wyłącz blok"; -Blockly.Msg.DUPLICATE_BLOCK = "Powiel"; +Blockly.Msg.DUPLICATE_BLOCK = "Duplikuj"; Blockly.Msg.ENABLE_BLOCK = "Włącz blok"; Blockly.Msg.EXPAND_ALL = "Rozwiń bloki"; Blockly.Msg.EXPAND_BLOCK = "Rozwiń blok"; @@ -77,7 +77,7 @@ Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "utwórz pustą listę"; Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Zwraca listę, o długości 0, nie zawierającą rekordów z danymi"; Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "lista"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Dodać, usunąć lub zmienić kolejność sekcji żeby zrekonfigurować blok tej listy."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Dodaj, usuń lub zmień kolejność sekcji żeby skonfigurować ten blok listy."; Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "Tworzenie listy z"; Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Dodaj element do listy."; @@ -139,10 +139,18 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Wstawia element w odpow Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Dodaj element na koniec listy."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Wstawia element w losowym miejscu na liście."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Ustawia pierwszy element na liście."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Ustawia element w odpowiednie miejsce na liście. #1 to ostatni element."; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Ustawia element w odpowiednie miejsce na liście. #1 to pierwszy element."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Ustawia element w określonym miejscu na liście. #1 to ostatni element."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Ustawia element w określonym miejscu na liście. #1 to pierwszy element."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Ustawia ostatni element na liście."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Ustawia losowy element na liście."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "stwórz listę z tekstu"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "stwórz tekst z listy"; @@ -256,9 +264,9 @@ Blockly.Msg.MATH_TRIG_TAN = "tg"; Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Zwróć arcus cosinus danej liczby."; Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Zwróć arcus sinus danej liczby."; Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Zwróć arcus tangens danej liczby."; -Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Zwróć wartość cosinusa o stopniu (nie radianach)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Zwróć wartość sinusa o stopniu (nie radianach)."; -Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Zwróć tangens o stopniu (nie radianach)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Zwróć wartość cosinusa o stopniu (nie w radianach)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Zwróć wartość sinusa o stopniu (nie w radianach)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Zwróć tangens o stopniu (nie w radianach)."; Blockly.Msg.ME = "Ja"; Blockly.Msg.NEW_VARIABLE = "Nowa zmienna..."; Blockly.Msg.NEW_VARIABLE_TITLE = "Nowa nazwa zmiennej:"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Uruchom funkcję zdefiniowaną przez użytkownika '%1' i skorzystaj z jej wyniku."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "z:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Stwórz '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Opisz tę funkcję..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "zrób coś"; @@ -280,16 +288,17 @@ Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Tworzy funkcję bez wyniku."; Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "zwróć"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Tworzy funkcję z wynikiem."; -Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Ostrzeżenie: Ta funkcja ma powtórzone parametry."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Uwaga: Ta funkcja ma powtórzone parametry."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Podświetl definicję funkcji"; Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Jeśli wartość jest prawdziwa, zwróć drugą wartość."; -Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Ostrzeżenie: Ten blok może być używany tylko w definicji funkcji."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Uwaga: Ten blok może być używany tylko w definicji funkcji."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nazwa wejścia:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Dodaj dane wejściowe do funkcji."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "wejścia"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Dodaj, usuń lub zmień kolejność danych wejściowych dla tej funkcji."; -Blockly.Msg.REMOVE_COMMENT = "Usuń Komentarz"; +Blockly.Msg.REDO = "Ponów"; +Blockly.Msg.REMOVE_COMMENT = "Usuń komentarz"; Blockly.Msg.RENAME_VARIABLE = "Zmień nazwę zmiennej..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Zmień nazwy wszystkich '%1' zmiennych na:"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "dołącz tekst"; @@ -313,14 +322,14 @@ Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Zwraca literę z określonej pozycji."; Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Dodaj element do tekstu."; Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "połącz"; Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Dodaj, usuń lub zmień kolejność sekcji, aby zmodyfikować blok tekstowy."; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "do litery # od końca"; -Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "do litery #"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "do # litery od końca"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "do # litery"; Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "do ostatniej litery"; Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "w tekście"; Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "pobierz podciąg od pierwszej litery"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "pobierz podciąg od litery # od końca"; -Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "pobierz podciąg od litery #"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "pobierz podciąg od # litery od końca"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "pobierz podciąg od # litery"; Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Zwraca określoną część tekstu."; Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated @@ -340,7 +349,7 @@ Blockly.Msg.TEXT_LENGTH_TITLE = "długość %1"; Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Zwraca liczbę liter (łącznie ze spacjami) w podanym tekście."; Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg.TEXT_PRINT_TITLE = "wydrukuj %1"; -Blockly.Msg.TEXT_PRINT_TOOLTIP = "Drukuj określony tekst, liczbę lub coś innego."; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Drukuj określony tekst, liczbę lub inną wartość."; Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Zapytaj użytkownika o liczbę."; Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Zapytaj użytkownika o jakiś tekst."; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "usuń spacje z lewej strony"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "usuń spacje z prawej strony"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Zwraca kopię tekstu z usuniętymi spacjami z jednego lub z obu końców tekstu."; Blockly.Msg.TODAY = "Dzisiaj"; +Blockly.Msg.UNDO = "Cofnij"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Utwórz blok 'ustaw %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/pms.js b/msg/js/pms.js index e868b476f6..df68de18e1 100644 --- a/msg/js/pms.js +++ b/msg/js/pms.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "A fissa l'element a la posis Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "A fissa l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "A fissa l'ùltim element an na lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "A fissa n'element a l'ancàpit an na lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "fé na lista da 'n test"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fé 'n test da na lista"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Eseguì la fonsion '%1' definìa da l'utent e dovré sò arzultà."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "con:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Creé '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descrive sa fonsion..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "fé cheicòs"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "artorn"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "A crea na fonsion con na surtìa."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atension: Costa fonsion a l'ha dij paràmeter duplicà."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Sot-ligné la definission dla fonsion"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se un valor a l'é ver, antlora smon-e un second valor."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Atension: Ës blòch a podria esse dovrà mach an na definission ëd fonsion."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nòm ëd l'imission:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Gionté n'imission a la fonsion."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "imission"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Gionté, gavé o riordiné j'imission ëd sa fonsion."; +Blockly.Msg.REDO = "Fé torna"; Blockly.Msg.REMOVE_COMMENT = "Scancelé un coment"; Blockly.Msg.RENAME_VARIABLE = "Arnomé la variàbil..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Arnomé tute le variàbij '%1' 'me:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "gavé jë spassi da la banda snistra ëd" Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "gavé jë spassi da la banda drita ëd"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "A smon na còpia dël test con jë spassi gavà da n'estremità o da tute doe."; Blockly.Msg.TODAY = "Ancheuj"; +Blockly.Msg.UNDO = "Anulé"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Creé 'fissé %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/pt-br.js b/msg/js/pt-br.js index 9a91b88bbf..032c6dedb7 100644 --- a/msg/js/pt-br.js +++ b/msg/js/pt-br.js @@ -122,7 +122,7 @@ Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna o índice da primeira/última ocor Blockly.Msg.LISTS_INLIST = "na lista"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 é vazia"; -Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Retona verdadeiro se a lista estiver vazia."; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Retorna ao verdadeiro se a lista estiver vazia."; Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg.LISTS_LENGTH_TITLE = "tamanho de %1"; Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Retorna o tamanho de uma lista."; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Define o item da posição e Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Define o item da posição especificada de uma lista. #1 é o primeiro item."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Define o último item de uma lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Define um item aleatório de uma lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Fazer uma lista a partir do texto"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fazer um texto a partir da lista"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://pt.wikipedia.org/wiki/Sub-r Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executa a função definida pelo usuário \"%1\" e usa seu retorno."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "com:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Criar \"%1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descreva esta função..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faça algo"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "retorna"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Cria uma função que possui um valor de retorno."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Atenção: Esta função tem parâmetros duplicados."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Destacar definição da função"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Se um valor é verdadeiro, então retorna um valor."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome da entrada:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adiciona uma entrada para esta função"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adiciona, remove, ou reordena as entradas para esta função."; +Blockly.Msg.REDO = "Refazer"; Blockly.Msg.REMOVE_COMMENT = "Remover comentário"; Blockly.Msg.RENAME_VARIABLE = "Renomear variável..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Renomear todas as variáveis '%1' para:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "remover espaços à esquerda de"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "remover espaços à direita de"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retorna uma cópia do texto com os espaços removidos de uma ou ambas extremidades."; Blockly.Msg.TODAY = "Hoje"; +Blockly.Msg.UNDO = "Desfazer"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Criar \"definir %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/pt.js b/msg/js/pt.js index 0f252e1c90..58facb1f0d 100644 --- a/msg/js/pt.js +++ b/msg/js/pt.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "Adicionar Comentário"; Blockly.Msg.AUTH = "Por favor autorize esta aplicação para permitir que o seu trabalho seja gravado e que o possa partilhar."; Blockly.Msg.CHANGE_VALUE_TITLE = "Alterar valor:"; Blockly.Msg.CHAT = "Converse com o seu colaborador, ao digitar nesta caixa!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Limpar os blocos"; Blockly.Msg.COLLAPSE_ALL = "Recolher Blocos"; Blockly.Msg.COLLAPSE_BLOCK = "Colapsar Bloco"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "cor 1"; @@ -62,7 +62,7 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "repita até"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "repita enquanto"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Enquanto um valor for falso, então faça algumas instruções."; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Enquanto um valor for verdadeiro, então faça algumas instruções."; -Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Apagar todos os %1 blocos?"; Blockly.Msg.DELETE_BLOCK = "Remover Bloco"; Blockly.Msg.DELETE_X_BLOCKS = "Remover %1 Blocos"; Blockly.Msg.DISABLE_BLOCK = "Desabilitar Bloco"; @@ -118,7 +118,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Cria uma cópia da porção especificad Blockly.Msg.LISTS_INDEX_OF_FIRST = "encontre a primeira ocorrência do item"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "encontre a última ocorrência do item"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do item na lista. Retorna 0 se o texto não for encontrado."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Retorna a posição da primeira/última ocorrência do item na lista. Retorna 0 se o item não for encontrado."; Blockly.Msg.LISTS_INLIST = "na lista"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 está vazia"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Define o item na posição e Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Define o item na posição especificada de uma lista. #1 é o primeiro item."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Define o último item de uma lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Define um item aleatório de uma lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "fazer lista a partir de texto"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fazer texto a partir da lista"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "http://pt.wikipedia.org/wiki/Sub-ro Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Executa a função \"%1\" e usa o seu retorno."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "com:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Criar \"%1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Descreva esta função..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "faz algo"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nome da entrada:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adicionar uma entrada para a função."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "entradas"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adicionar, remover ou reordenar as entradas para esta função."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Remover Comentário"; Blockly.Msg.RENAME_VARIABLE = "Renomear variável..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Renomear todas as variáveis '%1' para:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "remover espaços à esquerda de"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "remover espaços à direita"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Retorna uma cópia do texto com os espaços removidos de uma ou ambas as extremidades."; Blockly.Msg.TODAY = "Hoje"; +Blockly.Msg.UNDO = "Desfazer"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Criar \"definir %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/ro.js b/msg/js/ro.js index a29f9132ed..d5db5f0242 100644 --- a/msg/js/ro.js +++ b/msg/js/ro.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Setează elementul la poziţ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Setează elementul la poziţia specificată într-o listă. #1 este primul element."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Setează ultimul element într-o listă."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Setează un element aleator într-o listă."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "convertește textul în listă"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "convertește lista în text"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nume de intrare:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Adaugă un parametru de intrare pentru funcție."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "intrări"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Adăugă, șterge sau reordonează parametrii de intrare ai acestei funcții."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Elimină comentariu"; Blockly.Msg.RENAME_VARIABLE = "Redenumirea variabilei..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Redenumeşte toate variabilele '%1' în:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "tăiaţi spațiile din partea stângă a" Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "taie spațiile din partea dreaptă a"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returnează o copie a textului fără spațiile de la unul sau ambele capete."; Blockly.Msg.TODAY = "Astăzi"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Crează 'set %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/ru.js b/msg/js/ru.js index 9eb7911882..f2d69ec88f 100644 --- a/msg/js/ru.js +++ b/msg/js/ru.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Присваивает зн Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Присваивает значение элементу в указанной позиции списка (№1 - первый элемент)."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Присваивает значение последнему элементу списка."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Присваивает значение случайному элементу списка."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "сделать список из текста"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "собрать текст из списка"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://ru.wikipedia.org/wiki/Фу Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Исполняет определённую пользователем процедуру '%1' и возвращает вычисленное значение."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "с:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Создать вызов '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Опишите эту функцию…"; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "выполнить что-то"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "вернуть"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Создаёт процедуру, возвращающую значение."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Предупреждение: эта функция имеет повторяющиеся параметры."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Выделить определение процедуры"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Если первое значение истинно, возвращает второе значение."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Предупреждение: Этот блок может использоваться только внутри определения функции."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "имя параметра:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Добавить входной параметр в функцию."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "параметры"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Добавить, удалить или изменить порядок входных параметров для этой функции."; +Blockly.Msg.REDO = "Повторить"; Blockly.Msg.REMOVE_COMMENT = "Удалить комментарий"; Blockly.Msg.RENAME_VARIABLE = "Переименовать переменную…"; Blockly.Msg.RENAME_VARIABLE_TITLE = "Переименовать все переменные '%1' в:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "обрезать пробелы слев Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "обрезать пробелы справа"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Возвращает копию текста с пробелами, удалеными с одного или обоих концов."; Blockly.Msg.TODAY = "Сегодня"; +Blockly.Msg.UNDO = "Отменить"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "элемент"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Создать блок \"присвоить\" для %1"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/sc.js b/msg/js/sc.js index b9358383e7..aeeb71ff32 100644 --- a/msg/js/sc.js +++ b/msg/js/sc.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Impostat s'elementu in su po Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Impostat s'elementu in su postu inditau de una lista. Postu 1 est po su primu elementu."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Impostat s'urtimu elementu in una lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Impostat unu elementu random in una lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "fai una lista de unu testu"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "fai unu testu de una lista"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "nomini input:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Aciungi un input a sa funtzioni."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Aciungi, fùlia, o assenta is inputs a custa funtzioni."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Fùlia unu cumentu"; Blockly.Msg.RENAME_VARIABLE = "Muda nòmini a variabili..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "A is variabilis '%1' muda nòmini a:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "bogat spàtzius de su càbudu de manca de Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "bogat spàtzius de su càbudu de dereta de"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Torrat una copia de su testu bogaus is spàtzius de unu o de ambus is càbudus."; Blockly.Msg.TODAY = "Oe"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Fait 'imposta %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/sd.js b/msg/js/sd.js new file mode 100644 index 0000000000..0f7f05bfac --- /dev/null +++ b/msg/js/sd.js @@ -0,0 +1,394 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.sd'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "تاثرات ڏيو"; +Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated +Blockly.Msg.CHANGE_VALUE_TITLE = "قدر بدلايو"; +Blockly.Msg.CHAT = "هن دٻيءَ ۾ ٽائيپ ڪري پنهنجي ساٿاريءَ سان ڳالهايو"; +Blockly.Msg.CLEAN_UP = "بندشون هٽايو"; +Blockly.Msg.COLLAPSE_ALL = "بلاڪَ ڍڪيو"; +Blockly.Msg.COLLAPSE_BLOCK = "بلاڪ ڍڪيو"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "رنگ 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "رنگ 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "تناسب"; +Blockly.Msg.COLOUR_BLEND_TITLE = "blend"; // untranslated +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "ڄاڻايل تناسب سان ٻہ رنگ پاڻ ۾ ملايو (0.0-1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "رنگ دٻيءَ مان رنگ چونڊيو."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "بلا ترتيب رنگ"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "ڪو بہ ‌ڃڳ چونڊيو."; +Blockly.Msg.COLOUR_RGB_BLUE = "نيرو"; +Blockly.Msg.COLOUR_RGB_GREEN = "سائو"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "ڳاڙهو"; +Blockly.Msg.COLOUR_RGB_TITLE = "سان رڱيو"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "ڳاڙهي، سائي، ۽ نيري جو مقدار ڄاڻائي گھربل رنگ ٺاهيو. سمورا قدر 0 ۽ 100 جي وچ ۾ هجن."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "چڪر مان ٻاهر نڪرو"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "چڪر جاري رکندر نئين ڦيري پايو"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration."; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop."; // untranslated +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "for each item %1 in list %2"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; // untranslated +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."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block."; // untranslated +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block."; // untranslated +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "نہ تہ"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "نہ تہ جي"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "جيڪڏهن"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "If a value is true, then do some statements."; // untranslated +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."; // untranslated +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."; // untranslated +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."; // untranslated +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "ڪريو"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "1٪ ڀيرا ورجايو"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Do some statements several times."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ورجايو جيستائين"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ورجايو جڏهن"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "While a value is false, then do some statements."; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "While a value is true, then do some statements."; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated +Blockly.Msg.DELETE_BLOCK = "بلاڪ ڊاهيو"; +Blockly.Msg.DELETE_X_BLOCKS = "1٪ بلاڪ ڊاهيو"; +Blockly.Msg.DISABLE_BLOCK = "بلاڪ کي غيرفعال بڻايو"; +Blockly.Msg.DUPLICATE_BLOCK = "نقل"; +Blockly.Msg.ENABLE_BLOCK = "بلاڪ کي فعال بڻايو"; +Blockly.Msg.EXPAND_ALL = "بلاڪَ نمايو"; +Blockly.Msg.EXPAND_BLOCK = "بلاڪ نمايو"; +Blockly.Msg.EXTERNAL_INPUTS = "خارجي ڄاڻ"; +Blockly.Msg.HELP = "مدد"; +Blockly.Msg.INLINE_INPUTS = "Inline Inputs"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "خالي فهرست تخليق ڪريو"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "لسٽ"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "create list with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "فهرست ۾ ڪا شي شامل ڪريو."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Create a list with any number of items."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_FIRST = "پهريون"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "# آخر کان"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "get"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "get and remove"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_LAST = "آخري"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "بي ترتيب"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "هٽايو"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Removes and returns the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Removes and returns the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Removes the first item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Removes the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Removes the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Removes the last item in a list."; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Removes a random item in a list."; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "ڏانهن # آخر کان"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "ڏانهن #"; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "آخري ڏانهن"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "get sub-list from first"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "get sub-list from # from end"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "get sub-list from #"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg.LISTS_INDEX_OF_FIRST = "find first occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "find last occurrence of item"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found."; // untranslated +Blockly.Msg.LISTS_INLIST = "فهرست ۾"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Returns true if the list is empty."; // untranslated +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Returns the length of a list."; // untranslated +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "create list with item %1 repeated %2 times"; // untranslated +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "جيان"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "تي داخل ڪريو"; +Blockly.Msg.LISTS_SET_INDEX_SET = "ميڙ"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Inserts the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Inserts the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Append the item to the end of a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Sets the first item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specified position in a list. #1 is the last item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "ڪُوڙ"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "درست يا غير درست وراڻي ٿو."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "سچ"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "جيڪڏهن ٻئي ان پُٽس برابر آهن تہ درست وراڻيو"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان وڏو آهي تہ درست وراڻيو."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان وڏو آهي يا ٻئي برابر آهن تہ درست وراڻيو."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان ننڍو آهي تہ درست وراڻيو"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان ننڍو آهي يا ٻئي برابر آهن تہ درست وراڻيو"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "جيڪڏهن ٻئي ان پُٽس اڻ برابر آهن تہ درست وراڻيو"; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "نڪي %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "ان پُٽ غير درست آهي تہ درست وراڻيو. ان پُٽ درست آهي تہ غير درست وراڻيو."; +Blockly.Msg.LOGIC_NULL = "null"; // untranslated +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Returns null."; // untranslated +Blockly.Msg.LOGIC_OPERATION_AND = "۽"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "يا"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "جيڪڏهن ٻئي ان پُٽ درست آهن تہ درست وراڻيو."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "جيڪڏهن ٻنهي ان پُٽس مان ڪو هڪ بہ درست آهي تہ درست وراڻيو."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; // untranslated +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "جيڪڏهن ڪوڙو"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "جيڪڏهن سچو"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "ٻن انگن جي جوڙ اپت ڏيو."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "ٻنهي انگن جي ونڊ ڏيو."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "ٻنهي انگن جو تفاوت ڏيو."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "ٻنهي انگن جي ضرب اُپت ڏيو."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg.MATH_CHANGE_TITLE = "%1 کي %2 سان مَٽايو"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Add a number to variable '%1'."; // untranslated +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/رياضياتي استقلال"; +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)."; // untranslated +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "constrain %1 low %2 high %3"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "سان ونڊجندڙ آهي"; +Blockly.Msg.MATH_IS_EVEN = "ٻڌي آهي"; +Blockly.Msg.MATH_IS_NEGATIVE = "ڪاٽو آهي"; +Blockly.Msg.MATH_IS_ODD = "اِڪي آهي"; +Blockly.Msg.MATH_IS_POSITIVE = "واڌو آهي"; +Blockly.Msg.MATH_IS_PRIME = "مفرد آهي"; +Blockly.Msg.MATH_IS_TOOLTIP = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated +Blockly.Msg.MATH_IS_WHOLE = "سڄو آهي"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg.MATH_MODULO_TITLE = "remainder of %1 ÷ %2"; // untranslated +Blockly.Msg.MATH_MODULO_TOOLTIP = "Return the remainder from dividing the two numbers."; // untranslated +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; // untranslated +Blockly.Msg.MATH_NUMBER_TOOLTIP = "ڪو انگ."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "لسٽ جي سراسري"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "لسٽ جو وڏي ۾ وڏو قدر"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "لسٽ جو مڌيان"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "لسٽ جو ننڍي ۾ ننڍو قدر"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modes of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "random item of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standard deviation of list"; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "sum of list"; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "لسٽ ۾ وڏي کان وڏو قدر ڄاڻايو."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "لسٽ جو مڌيان انگ ڄاڻايو."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "لسٽ ۾ ننڍي کان ننڍو قدر ڄاڻايو."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Return a random element from the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Return the standard deviation of the list."; // untranslated +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Return the sum of all the numbers in the list."; // untranslated +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "random fraction"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TITLE = "random integer from %1 to %2"; // untranslated +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "round"; // untranslated +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "round down"; // untranslated +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "round up"; // untranslated +Blockly.Msg.MATH_ROUND_TOOLTIP = "Round a number up or down."; // untranslated +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/ٻيون مول"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "ٺپ"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "ٻيون مول"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Return the absolute value of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Return e to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "ڪنهن انگ جو قدرتي لاگ ڄاڻايو."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "ڪنهن انگ جو 10 بنيادي لاگ ڄاڻايو."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "ڪنهن انگ جو ڪاٽو ڄاڻايو."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Return 10 to the power of a number."; // untranslated +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "ڪنهن انگ جو ٻيون مول ڄاڻايو."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/ٽڪنڊور ڪاڄ"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Return the arccosine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Return the arcsine of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Return the arctangent of a number."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Return the cosine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian)."; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg.ME = "آئون"; +Blockly.Msg.NEW_VARIABLE = "نئون ڦرڻو"; +Blockly.Msg.NEW_VARIABLE_TITLE = "ڦرڻي جو نئون نالو:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "سان:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "سان:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "تخليق ڪريو '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "ڪجھ ڪريو"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "ڏانهن"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Creates a function with no output."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "واپس ورو"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Creates a function with an output."; // untranslated +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Highlight function definition"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "If a value is true, then return a second value."; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "ان پُٽس"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "تاثرات مِٽايو"; +Blockly.Msg.RENAME_VARIABLE = "ڦرڻي کي نئون نالو ڏيو..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; // untranslated +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "append text"; // untranslated +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "to"; // untranslated +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Append some text to variable '%1'."; // untranslated +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "ننڍن اکر ڏانهن"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "to Title Case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "وڏن اکرن ڏانهن"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg.TEXT_CHARAT_FIRST = "get first letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_END = "get letter # from end"; // untranslated +Blockly.Msg.TEXT_CHARAT_FROM_START = "get letter #"; // untranslated +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "in text"; // untranslated +Blockly.Msg.TEXT_CHARAT_LAST = "get last letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_RANDOM = "get random letter"; // untranslated +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Returns the letter at the specified position."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Add an item to the text."; // untranslated +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "شامل ٿيو"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "to letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "to letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "to last letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "in text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "get substring from first letter"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "get substring from letter # from end"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "get substring from letter #"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Returns a specified portion of the text."; // untranslated +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "in text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "find first occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "find last occurrence of text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found."; // untranslated +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "create text with"; // untranslated +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "length of %1"; // untranslated +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "ڇاپيو %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "ڄاڻايل تحرير، انگ يا ڪو ٻيو قدر ڇاپيو."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number."; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text."; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "prompt for number with message"; // untranslated +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "prompt for text with message"; // untranslated +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg.TEXT_TEXT_TOOLTIP = "A letter, word, or line of text."; // untranslated +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "trim spaces from both sides of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg.TODAY = "اڄ"; +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "اسم"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Returns the value of this variable."; // untranslated +Blockly.Msg.VARIABLES_SET = "set %1 to %2"; // untranslated +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Create 'get %1'"; // untranslated +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; \ No newline at end of file diff --git a/msg/js/shn.js b/msg/js/shn.js index a483b9bad4..55ab61cca6 100644 --- a/msg/js/shn.js +++ b/msg/js/shn.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specifi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "ဢဝ်ဢွၵ်ႇ ၶေႃႈၵႂၢမ်း"; Blockly.Msg.RENAME_VARIABLE = "လိုမ်ႉၶိုၼ်း ဢၼ်လၢႆႈမႂ်ႇ"; Blockly.Msg.RENAME_VARIABLE_TITLE = "လိုမ်ႉၶိုၼ်း ဢၼ်လၢႆႈမႂ်ႇၸိူဝ်းၼၼ်ႉ '%1' ထိုင်"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untra Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "မိူဝ်ႈၼႆႉ"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "ဢၼ်"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/sk.js b/msg/js/sk.js index 53d2bf4e4d..e08997513e 100644 --- a/msg/js/sk.js +++ b/msg/js/sk.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "Pridať komentár"; Blockly.Msg.AUTH = "Autorizujte prosím túto aplikáciu, aby ste mohli uložiť a zdieľať vašu prácu."; Blockly.Msg.CHANGE_VALUE_TITLE = "Zmeniť hodnotu:"; Blockly.Msg.CHAT = "Písaním do tohto políčka komunikujte so spolupracovníkmi!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "Narovnať bloky"; Blockly.Msg.COLLAPSE_ALL = "Zvinúť bloky"; Blockly.Msg.COLLAPSE_BLOCK = "Zvinúť blok"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "farba 1"; @@ -118,7 +118,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Skopíruje určený úsek zoznamu."; Blockly.Msg.LISTS_INDEX_OF_FIRST = "nájdi prvý výskyt prvku"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "nájdi posledný výskyt prvku"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vráti index prvého/posledného výskytu prvku v zozname. Ak nenašiel, vráti 0."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vráti index prvého/posledného výskytu prvku v zozname. Ak sa nič nenašlo, vráti 0."; Blockly.Msg.LISTS_INLIST = "v zozname"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prázdny"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Nastaví prvok na určenej p Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Nastaví prvok na určenej pozícii v zozname. #1 je prvý prvok."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Nastaví posledný prvok v zozname."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Nastaví posledný prvok v zozname."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "vytvoriť zoznam z textu"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "vytvoriť text zo zoznamu"; @@ -246,9 +254,9 @@ Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Vráť opačné číslo."; Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Vráť 10 umocnené číslom."; Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Vráť druhú odmocninu čísla."; Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated -Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated -Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated -Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "arccos"; +Blockly.Msg.MATH_TRIG_ASIN = "arcsin"; +Blockly.Msg.MATH_TRIG_ATAN = "arctan"; Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Spustí používateľom definovanú funkciu '%1' a použije jej výstup."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "s:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Vytvoriť '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Doplň, čo robí táto funkcia..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "urob niečo"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "názov vstupu:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Pridať vstup do funkcie."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "vstupy"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Pridať, odstrániť alebo zmeniť poradie vstupov tejto funkcie."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Odstrániť komentár"; Blockly.Msg.RENAME_VARIABLE = "Premenovať premennú..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Premenovať všetky premenné '%1' na:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "odstráň medzery z ľavej strany"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "odstráň medzery z pravej strany"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Vráť kópiu textu bez medzier na jednom alebo oboch koncoch."; Blockly.Msg.TODAY = "Dnes"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "prvok"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Vytvoriť \"nastaviť %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/sl.js b/msg/js/sl.js new file mode 100644 index 0000000000..c995cb3569 --- /dev/null +++ b/msg/js/sl.js @@ -0,0 +1,394 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +goog.provide('Blockly.Msg.sl'); + +goog.require('Blockly.Msg'); + +Blockly.Msg.ADD_COMMENT = "Dodaj komentar"; +Blockly.Msg.AUTH = "Prosimo, avtoriziraj to aplikacijo, da boš lahko svoje delo shranil(-a) in delil(-a) z drugimi."; +Blockly.Msg.CHANGE_VALUE_TITLE = "Spremeni vrednost:"; +Blockly.Msg.CHAT = "Klepetaj s sodelavcem tako, da tipkaš v to okno!"; +Blockly.Msg.CLEAN_UP = "Ponastavi kocke"; +Blockly.Msg.COLLAPSE_ALL = "Skrči kocke"; +Blockly.Msg.COLLAPSE_BLOCK = "Skrči kocko"; +Blockly.Msg.COLOUR_BLEND_COLOUR1 = "barva 1"; +Blockly.Msg.COLOUR_BLEND_COLOUR2 = "barva 2"; +Blockly.Msg.COLOUR_BLEND_HELPURL = "http://meyerweb.com/eric/tools/color-blend/"; // untranslated +Blockly.Msg.COLOUR_BLEND_RATIO = "razmerje"; +Blockly.Msg.COLOUR_BLEND_TITLE = "mešanica"; +Blockly.Msg.COLOUR_BLEND_TOOLTIP = "Zmeša dve barvi v danem razmerju (0.0 - 1.0)."; +Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Izberi barvo s palete."; +Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com"; // untranslated +Blockly.Msg.COLOUR_RANDOM_TITLE = "naključna barva"; +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Izbere naključno barvo."; +Blockly.Msg.COLOUR_RGB_BLUE = "modra"; +Blockly.Msg.COLOUR_RGB_GREEN = "zelena"; +Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html"; // untranslated +Blockly.Msg.COLOUR_RGB_RED = "rdeča"; +Blockly.Msg.COLOUR_RGB_TITLE = "določena barva"; +Blockly.Msg.COLOUR_RGB_TOOLTIP = "Ustvari barvo z določeno količino rdeče, zelene in modre. Vse vrednosti morajo biti med 0 in 100."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "izstopi iz zanke"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "nadaljuj z naslednjo ponovitvijo zanke"; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Izstopi iz trenutne zanke."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Preskoči preostanek te zanke in nadaljuje z naslednjo ponovitvijo."; +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Pozor: To kocko lahko uporabiš samo znotraj zanke."; +Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "za vsak element %1 v seznamu %2"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Za vsak element v seznamu, nastavi spremenljivko '%1' na ta element. Pri tem se izvedejo določene kocke."; +Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "štej s/z %1 od %2 do %3 s korakom %4"; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Vrednost spremenljivke '%1' se spreminja od začetnega števila do končnega števila, z določenim korakom. Pri tem se izvedejo določene kocke."; +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Dodaj pogoj »če« kocki."; +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Dodaj končni pogoj »če« kocki."; +Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Dodaj, odstrani ali spremeni vrstni red odsekov za ponovno nastavitev »če« kocke."; +Blockly.Msg.CONTROLS_IF_MSG_ELSE = "sicer"; +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "sicer če"; +Blockly.Msg.CONTROLS_IF_MSG_IF = "če"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "Če je vrednost resnična, izvedi določene kocke."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "Če je vrednost resnična, izvedi prvo skupino kock. Sicer izvedi drugo skupino kock."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "Če je prva vrednost resnična, izvedi prvo skupino kock. Sicer, če je resnična druga vrednost, izvedi drugo skupino kock."; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "Če je prva vrednost resnična, izvedi prvo skupino kock. Sicer, če je resnična druga vrednost, izvedi drugo skupino kock. Če nobena izmed vrednosti ni resnična, izvedi zadnjo skupino kock."; +Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "izvedi"; +Blockly.Msg.CONTROLS_REPEAT_TITLE = "ponavljaj %1 krat"; +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "Kocke se izvedejo večkrat."; +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ponavljaj dokler"; +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ponavljaj"; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "Kocke se izvajajo dokler je vrednost neresnična."; +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "Kocke se izvajajo dokler je vrednost resnična."; +Blockly.Msg.DELETE_ALL_BLOCKS = "Izbrišem vseh %1 kock?"; +Blockly.Msg.DELETE_BLOCK = "Izbriši kocko"; +Blockly.Msg.DELETE_X_BLOCKS = "Izbriši kocke"; +Blockly.Msg.DISABLE_BLOCK = "Onemogoči kocko"; +Blockly.Msg.DUPLICATE_BLOCK = "Podvoji"; +Blockly.Msg.ENABLE_BLOCK = "Omogoči kocko"; +Blockly.Msg.EXPAND_ALL = "Razširi kocke"; +Blockly.Msg.EXPAND_BLOCK = "Razširi kocko"; +Blockly.Msg.EXTERNAL_INPUTS = "Vnosi zunaj"; +Blockly.Msg.HELP = "Pomoč"; +Blockly.Msg.INLINE_INPUTS = "Vnosi v vrsti"; +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "ustvari prazen seznam"; +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "Vrne seznam, dolžine 0, ki ne vsebuje nobenih podatkov."; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "seznam"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "Doda, odstrani ali spremeni vrstni red elementov tega seznama."; +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "ustvari seznam s/z"; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = "Doda element seznamu."; +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = "Ustvari seznam s poljubnim številom elementov."; +Blockly.Msg.LISTS_GET_INDEX_FIRST = "prvo mesto"; +Blockly.Msg.LISTS_GET_INDEX_FROM_END = "mesto št. od konca"; +Blockly.Msg.LISTS_GET_INDEX_FROM_START = "#"; // untranslated +Blockly.Msg.LISTS_GET_INDEX_GET = "vrni"; +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "odstrani in vrni"; +Blockly.Msg.LISTS_GET_INDEX_LAST = "zadnje mesto"; +Blockly.Msg.LISTS_GET_INDEX_RANDOM = "naključno mesto"; +Blockly.Msg.LISTS_GET_INDEX_REMOVE = "odstrani"; +Blockly.Msg.LISTS_GET_INDEX_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Vrne prvi element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Vrne element na določenem mestu v seznamu. Zadnji element je št. 1."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Vrne element na določenem mestu v seznamu. Prvi element je št. 1."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Vrne zadnji element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = "Vrne naključni element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = "Odstrani in vrne prvi element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END = "Odstrani in vrne element na določenem mestu v seznamu. Zadnji element je št. 1."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START = "Odstrani in vrne element na določenem mestu v seznamu. Prvi element je št. 1."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = "Odstrani in vrne zadnji element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = "Odstrani in vrne naključni element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = "Odstrani prvi element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END = "Odstrani element na določenem mestu v seznamu. Zadnji element je št. 1."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START = "Odstrani element na določenem mestu v seznamu. Prvi element je št. 1."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = "Odstrani zadnji element seznama."; +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = "Odstrani naključni element seznama."; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = "do mesta št. od konca"; +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = "do mesta št."; +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = "do zadnjega mesta"; +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "ustvari podseznam od prvega mesta"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "ustvari podseznam od mesta št. od konca"; +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "ustvari podseznam od mesta št."; +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ""; // untranslated +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Ustvari nov seznam, kot kopijo določenega dela seznama."; +Blockly.Msg.LISTS_INDEX_OF_FIRST = "najdi prvo pojavitev elementa"; +Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg.LISTS_INDEX_OF_LAST = "najdi zadnjo pojavitev elementa"; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne 0."; +Blockly.Msg.LISTS_INLIST = "v seznamu"; +Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 je prazen"; +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = "Vrne resnično, če je seznam prazen."; +Blockly.Msg.LISTS_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg.LISTS_LENGTH_TITLE = "dolžina %1"; +Blockly.Msg.LISTS_LENGTH_TOOLTIP = "Vrne dolžino seznama."; +Blockly.Msg.LISTS_REPEAT_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg.LISTS_REPEAT_TITLE = "ustvari seznam z elementom %1, ki se ponovi %2 krat"; +Blockly.Msg.LISTS_REPEAT_TOOLTIP = "Ustvari seznam z danim elementom, ki se poljubno mnogo krat ponovi."; +Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "element"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "vstavi na"; +Blockly.Msg.LISTS_SET_INDEX_SET = "nastavi na"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "Vstavi element na začetek seznama."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "Vstavi element na določeno mesto v seznamu. Zadnji element je št. 1."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "Vstavi element na določeno mesto v seznamu. Prvi element je št. 1."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "Doda element na konec seznama."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = "Vstavi element na naključno mesto v seznamu."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = "Nastavi prvi element seznama."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Nastavi element na določenem mestu v seznamu. Zadnji element je št. 1."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Nastavi element na določenem mestu v seznamu. Prvi element je št. 1."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Nastavi zadnji element seznama."; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Nastavi naključni element seznama."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated +Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "ustvari seznam iz besedila"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ustvari besedilo iz seznama"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Združi seznam besedil v eno besedilo, ločeno z ločilom."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Razdruži besedilo v seznam besedil. Za razdruževanje besedila uporabi ločilo."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "z ločilom"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "neresnično"; +Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Vrne resnično ali neresnično."; +Blockly.Msg.LOGIC_BOOLEAN_TRUE = "resnično"; +Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Vrne resnično, če sta vnosa enaka."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Vrne resnično, če je prvi vnos večji od drugega."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Vrne resnično, če je prvi vnos večji ali enak drugemu."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Vrne resnično, če je prvi vnos manjši od drugega."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Vrne resnično, če je prvi vnos manjši ali enak drugemu."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Vrne resnično, če vnosa nista enaka."; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg.LOGIC_NEGATE_TITLE = "ne %1"; +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Vrne resnično, če je vnos neresničen. Vrne neresnično, če je vnos resničen."; +Blockly.Msg.LOGIC_NULL = "prazno"; +Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg.LOGIC_NULL_TOOLTIP = "Vrne prazno."; +Blockly.Msg.LOGIC_OPERATION_AND = "in"; +Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg.LOGIC_OPERATION_OR = "ali"; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Vrne resnično, če sta oba vnosa resnična."; +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Vrne resnično, če je vsaj eden od vnosov resničen."; +Blockly.Msg.LOGIC_TERNARY_CONDITION = "test"; +Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = "če neresnično"; +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = "če resnično"; +Blockly.Msg.LOGIC_TERNARY_TOOLTIP = "Preveri pogoj v »testu«. Če je pogoj resničen, potem vrne vrednost »če resnično«; sicer vrne vrednost »če neresnično«."; +Blockly.Msg.MATH_ADDITION_SYMBOL = "+"; // untranslated +Blockly.Msg.MATH_ARITHMETIC_HELPURL = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "Vrne vsoto dveh števil."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "Vrne kvocient dveh števil."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = "Vrne razliko dveh števil."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "Vrne zmnožek dveh števil."; +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "Vrne prvo število na potenco drugega števila."; +Blockly.Msg.MATH_CHANGE_HELPURL = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg.MATH_CHANGE_TITLE = "spremeni %1 za %2"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "Prišteje število k spremenljivki '%1'."; +Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Vrne eno izmed običajnih konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ali ∞ (neskončno)."; +Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated +Blockly.Msg.MATH_CONSTRAIN_TITLE = "omeji %1 na najmanj %2 in največ %3"; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Omeji število, da bo med določenima (vključenima) mejama."; +Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; // untranslated +Blockly.Msg.MATH_IS_DIVISIBLE_BY = "je deljivo s/z"; +Blockly.Msg.MATH_IS_EVEN = "je sodo"; +Blockly.Msg.MATH_IS_NEGATIVE = "je negativno"; +Blockly.Msg.MATH_IS_ODD = "je liho"; +Blockly.Msg.MATH_IS_POSITIVE = "je pozitivno"; +Blockly.Msg.MATH_IS_PRIME = "je praštevilo"; +Blockly.Msg.MATH_IS_TOOLTIP = "Preveri, če je število sodo, liho, praštevilo, celo, pozitivno, negativno ali, če je deljivo z določenim številom. Vrne resnično ali neresnično."; +Blockly.Msg.MATH_IS_WHOLE = "je celo"; +Blockly.Msg.MATH_MODULO_HELPURL = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg.MATH_MODULO_TITLE = "ostanek pri %1 ÷ %2"; +Blockly.Msg.MATH_MODULO_TOOLTIP = "Vrne ostanek pri deljenju dveh števil."; +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "×"; // untranslated +Blockly.Msg.MATH_NUMBER_HELPURL = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg.MATH_NUMBER_TOOLTIP = "Število."; +Blockly.Msg.MATH_ONLIST_HELPURL = ""; // untranslated +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = "povprečje seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = "maksimum seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = "mediana seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = "minimum seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = "modus seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = "naključni element seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = "standardni odklon seznama"; +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = "vsota seznama"; +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = "Vrne povprečje (aritmetično sredino) števil na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = "Vrne največje število na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = "Vrne mediano števil na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = "Vrne najmanjše število na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = "Vrne seznam najpogostejšega elementa(-ov) na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = "Vrne naključno število izmed števil na seznamu."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = "Vrne standardni odklon seznama."; +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = "Vrne vsoto vseh števil na seznamu."; +Blockly.Msg.MATH_POWER_SYMBOL = "^"; // untranslated +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "naključni ulomek"; +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Vrne naključni ulomek med (vključno) 0.0 in 1.0 (izključno)."; +Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg.MATH_RANDOM_INT_TITLE = "naključno število med %1 in %2"; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Vrne naključno število med dvema določenima mejama, vključno z mejama."; +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "zaokroži"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "zaokroži navzdol"; +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "zaokroži navzgor"; +Blockly.Msg.MATH_ROUND_TOOLTIP = "Zaokroži število navzgor ali navzdol."; +Blockly.Msg.MATH_SINGLE_HELPURL = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = "absolutno"; +Blockly.Msg.MATH_SINGLE_OP_ROOT = "kvadratni koren"; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = "Vrne absolutno vrednost števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = "Vrne e na potenco števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = "Vrne naravni logaritem števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = "Vrne desetiški logaritem števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = "Vrne negacijo števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = "Vrne 10 na potenco števila."; +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = "Vrne kvadratni koren števila."; +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "-"; // untranslated +Blockly.Msg.MATH_TRIG_ACOS = "acos"; // untranslated +Blockly.Msg.MATH_TRIG_ASIN = "asin"; // untranslated +Blockly.Msg.MATH_TRIG_ATAN = "atan"; // untranslated +Blockly.Msg.MATH_TRIG_COS = "cos"; // untranslated +Blockly.Msg.MATH_TRIG_HELPURL = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg.MATH_TRIG_SIN = "sin"; // untranslated +Blockly.Msg.MATH_TRIG_TAN = "tan"; // untranslated +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = "Vrne arkus kosinus števila."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = "Vrne arkus sinus števila."; +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Vrne arkus tangens števila."; +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Vrne kosinus kota v stopinjah (ne radianih)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Vrne sinus kota v stopinjah (ne radianih)."; +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Vrne tangens kota v stopinjah (ne radianih)."; +Blockly.Msg.ME = "Jaz"; +Blockly.Msg.NEW_VARIABLE = "Nova spremenljivka..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "Ime nove spremenljivke:"; +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "dovoli korake"; +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "s/z:"; +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Izvede uporabniško funkcijo '%1'."; +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Izvede uporabniško funkcijo '%1' in uporabi njen izhod."; +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "s/z:"; +Blockly.Msg.PROCEDURES_CREATE_DO = "Ustvari '%1'"; +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Opišite funkcijo ..."; +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "nekaj"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "izvedi"; +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = "Ustvari funkcijo brez izhoda."; +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "vrni"; +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Ustvari funkcijo z izhodom."; +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Pozor: Ta funkcija ima podvojene parametre."; +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Označi definicijo funkcije"; +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Če je vrednost resnična, vrne drugo vrednost."; +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Pozor: To kocko lahko uporabiš samo znotraj definicije funkcije."; +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "ime vnosa:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Funkciji doda vnos."; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "vnosi"; +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Doda, odstrani ali spremeni vrstni red vnosov te funkcije."; +Blockly.Msg.REDO = "Redo"; // untranslated +Blockly.Msg.REMOVE_COMMENT = "Odstrani komentar"; +Blockly.Msg.RENAME_VARIABLE = "Preimenuj spremenljivko..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "Preimenuj vse spremenljivke '%1' v:"; +Blockly.Msg.TEXT_APPEND_APPENDTEXT = "dodaj besedilo"; +Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_APPEND_TO = "k"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "Doda besedilo k spremenljivki '%1'."; +Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "v male črke"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "v Velike Začetnice"; +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = "v VELIKE ČRKE"; +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = "Vrne kopijo besedila v drugi obliki."; +Blockly.Msg.TEXT_CHARAT_FIRST = "vrni prvo črko"; +Blockly.Msg.TEXT_CHARAT_FROM_END = "vrni črko št. od konca"; +Blockly.Msg.TEXT_CHARAT_FROM_START = "vrni črko št."; +Blockly.Msg.TEXT_CHARAT_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg.TEXT_CHARAT_INPUT_INTEXT = "iz besedila"; +Blockly.Msg.TEXT_CHARAT_LAST = "vrni zadnjo črko"; +Blockly.Msg.TEXT_CHARAT_RANDOM = "vrni naključno črko"; +Blockly.Msg.TEXT_CHARAT_TAIL = ""; // untranslated +Blockly.Msg.TEXT_CHARAT_TOOLTIP = "Vrne črko na določenem mestu v besedilu."; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = "Doda element k besedilu."; +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = "združi"; +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = "Doda, odstrani ali spremeni vrstni red elementov tega besedila."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = "do črke št. od konca"; +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = "do črke št."; +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = "do zadnje črke"; +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = "iz besedila"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = "vrni del od prve črke"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = "vrni del od črke št. od konca"; +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = "vrni del od črke št."; +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ""; // untranslated +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = "Vrne določen del besedila."; +Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "v besedilu"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "najdi prvo pojavitev besedila"; +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "najdi zadnjo pojavitev besedila"; +Blockly.Msg.TEXT_INDEXOF_TAIL = ""; // untranslated +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne 0."; +Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 je prazno"; +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = "Vrne resnično, če je določeno besedilo prazno."; +Blockly.Msg.TEXT_JOIN_HELPURL = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = "ustvari besedilo iz"; +Blockly.Msg.TEXT_JOIN_TOOLTIP = "Ustvari besedilo tako, da združi poljubno število elementov."; +Blockly.Msg.TEXT_LENGTH_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg.TEXT_LENGTH_TITLE = "dolžina %1"; +Blockly.Msg.TEXT_LENGTH_TOOLTIP = "Vrne število črk oz. znakov (vključno s presledki) v določenem besedilu."; +Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg.TEXT_PRINT_TITLE = "izpiši %1"; +Blockly.Msg.TEXT_PRINT_TOOLTIP = "Izpiše določeno besedilo, število ali drugo vrednost."; +Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Vpraša uporabnika za vnos števila."; +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Vpraša uporabnika za vnos besedila."; +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = "vprašaj za število s sporočilom"; +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "vprašaj za besedilo s sporočilom"; +Blockly.Msg.TEXT_TEXT_HELPURL = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg.TEXT_TEXT_TOOLTIP = "Črka, beseda ali vrstica besedila."; +Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "odstrani presledke z obeh strani"; +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "odstrani presledke z leve strani"; +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "odstrani presledke z desne strani"; +Blockly.Msg.TEXT_TRIM_TOOLTIP = "Vrne kopijo besedila z odstranjenimi presledki z ene ali obeh strani."; +Blockly.Msg.TODAY = "Danes"; +Blockly.Msg.UNDO = "Undo"; // untranslated +Blockly.Msg.VARIABLES_DEFAULT_NAME = "element"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "Ustvari 'nastavi %1'"; +Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg.VARIABLES_GET_TOOLTIP = "Vrne vrednost spremenljivke."; +Blockly.Msg.VARIABLES_SET = "nastavi %1 na %2"; +Blockly.Msg.VARIABLES_SET_CREATE_GET = "Ustvari 'vrni %1'"; +Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg.VARIABLES_SET_TOOLTIP = "Nastavi, da je vrednost spremenljivke enaka vnosu."; +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; \ No newline at end of file diff --git a/msg/js/sq.js b/msg/js/sq.js index 03f0d9538d..607c0579bf 100644 --- a/msg/js/sq.js +++ b/msg/js/sq.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Vendos sendin ne pozicionin Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Vendos sendin në pozicionin e specifikuar në listë. #1 është sendi i parë."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Vendos sendin e fundit në listë."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Vendos një send të rastësishëm në listë."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "Fut emrin:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "Informacioni i futur"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Fshij komentin"; Blockly.Msg.RENAME_VARIABLE = "Ndrysho emrin variables..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Ndrysho emrin e te gjitha '%1' variablave ne :"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "prit hapesirat nga ana e majte"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "prit hapesirat nga ana e djathte"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Pergjigju me nje kopje te tekstit me hapesira te fshira nga njera ane ose te dyja anet."; Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "send"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Krijo 'vendos %1"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/sr.js b/msg/js/sr.js index 6bdddbb38c..6f640b4a74 100644 --- a/msg/js/sr.js +++ b/msg/js/sr.js @@ -7,10 +7,10 @@ goog.provide('Blockly.Msg.sr'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "Додај коментар"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated +Blockly.Msg.AUTH = "Пријавите се молим то је апликација да се окрену свој посао, да побегне и да му се омогући да буде заједничко за вас."; Blockly.Msg.CHANGE_VALUE_TITLE = "Промените вредност:"; -Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!"; // untranslated -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CHAT = "Комуницирају са својим колегом, уносећи у то поље!"; +Blockly.Msg.CLEAN_UP = "Уклоните блокова"; Blockly.Msg.COLLAPSE_ALL = "Скупи блокове"; Blockly.Msg.COLLAPSE_BLOCK = "Скупи блок"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "боја 1"; @@ -118,7 +118,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Прави копију одређен Blockly.Msg.LISTS_INDEX_OF_FIRST = "пронађи прво појављивање ставке"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "пронађи последње појављивање ставке"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Враћа однос првог/последнјег појавлјиванја ставке у листи. Враћа 0 ако се текст не наће."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Враћа број првог и/последњег уласка елемента у листу. Враћа 0 Ако елемент није пронађен."; Blockly.Msg.LISTS_INLIST = "на списку"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 је празан"; @@ -143,12 +143,20 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Поставља ставк Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Поставља ставку на одређени положај на списку. #1 је прва ставка."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Поставља последњу ставку на списку."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Поставља случајну ставку на списку."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "направите листу са текста"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "да текст из листе"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Да се придружи листу текстова у један текст, подељених за раздвајање."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Поделити текст у листу текстова, разбијање на сваком граничник."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "са раздвајање"; Blockly.Msg.LOGIC_BOOLEAN_FALSE = "нетачно"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "враћа вредност или тачно или нетачно."; @@ -259,11 +267,11 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = "Враћа аркус тангенс бр Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "Враћа косинус степена (не радијан)."; Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Враћа синус степена (не радијан)."; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Враћа тангенс степена (не радијан)."; -Blockly.Msg.ME = "Me"; // untranslated +Blockly.Msg.ME = "Ми"; Blockly.Msg.NEW_VARIABLE = "Нова променљива…"; Blockly.Msg.NEW_VARIABLE_TITLE = "Име нове променљиве:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "дозволити изреке"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "са:"; Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://sr.wikipedia.org/wiki/Функција_(програмирање)"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Покрените прилагођену функцију „%1“."; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://sr.wikipedia.org/wiki/Фу Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Покрените прилагођену функцију „%1“ и користи њен излаз."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "са:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Направи „%1“"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Описати ову функцију..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "урадите нешто"; @@ -286,9 +294,10 @@ Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Уколико је вредност тачна, врати другу вредност."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Упозорење: Овај блок се може користити једино у дефиницији функције."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "назив улаза:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Додајте улазна функција."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "улази"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Да додате, уклоните или переупорядочить улаза за ову функцију."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Уклони коментар"; Blockly.Msg.RENAME_VARIABLE = "Преименуј променљиву…"; Blockly.Msg.RENAME_VARIABLE_TITLE = "Преименујте све „%1“ променљиве у:"; @@ -349,11 +358,12 @@ Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = "питај за текст са порук Blockly.Msg.TEXT_TEXT_HELPURL = "https://sr.wikipedia.org/wiki/Ниска"; Blockly.Msg.TEXT_TEXT_TOOLTIP = "Слово, реч или ред текста."; Blockly.Msg.TEXT_TRIM_HELPURL = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated -Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "скратити простор са обе стране"; +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "трим празнине са обе стране"; Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "скратити простор са леве стране"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "скратити простор са десне стране"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Враћа копију текста са уклонјеним простором са једног од два краја."; -Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.TODAY = "Данас"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "ставка"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Направи „постави %1“"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/sv.js b/msg/js/sv.js index 4e7ba3ed08..247b73295e 100644 --- a/msg/js/sv.js +++ b/msg/js/sv.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sätter in objektet vid en s Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sätter in objektet vid en specificerad position i en lista. #1 är det första objektet."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Anger det sista elementet i en lista."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sätter in ett slumpat objekt i en lista."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "skapa lista från text"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "skapa text från lista"; @@ -190,7 +198,7 @@ Blockly.Msg.MATH_CONSTANT_HELPURL = "https://sv.wikipedia.org/wiki/Matematisk_ko Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Returnerar en av de vanliga konstanterna: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) eller ∞ (oändligt)."; Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated Blockly.Msg.MATH_CONSTRAIN_TITLE = "begränsa %1 till mellan %2 och %3"; -Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begränsa ett tal till att mellan de angivna gränsvärden (inklusive)."; +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Begränsa ett tal till att mellan de angivna gränsvärden (inkluderande)."; Blockly.Msg.MATH_DIVISION_SYMBOL = "÷"; Blockly.Msg.MATH_IS_DIVISIBLE_BY = "är delbart med"; Blockly.Msg.MATH_IS_EVEN = "är jämnt"; @@ -229,7 +237,7 @@ Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = "slumpat decimaltal"; Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "Ger tillbaka ett slumpat decimaltal mellan 0.0 (inkluderat) och 1.0 (exkluderat)."; Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://sv.wikipedia.org/wiki/Slumptalsgenerator"; Blockly.Msg.MATH_RANDOM_INT_TITLE = "slumpartat heltal från %1 till %2"; -Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Ger tillbaka ett slumpat heltal mellan två värden (inklusive)."; +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Ger tillbaka ett slumpat heltal mellan två värden, inkluderande."; Blockly.Msg.MATH_ROUND_HELPURL = "https://sv.wikipedia.org/wiki/Avrundning"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "avrunda"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "avrunda nedåt"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funkt Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kör den användardefinierade funktionen \"%1\" och använd resultatet av den."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "med:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Skapa '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Beskriv denna funktion..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "göra något"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "returnera"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Skapar en funktion med output."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Varning: Denna funktion har dubbla parametrar."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Markera funktionsdefinition"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Om ett värde är sant returneras ett andra värde."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Varning: Detta block får användas endast i en funktionsdefinition."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "inmatningsnamn:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Lägg till en inmatning till funktionen."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inmatningar"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Lägg till, ta bort och ändra ordningen för inmatningar till denna funktion."; +Blockly.Msg.REDO = "Gör om"; Blockly.Msg.REMOVE_COMMENT = "Radera kommentar"; Blockly.Msg.RENAME_VARIABLE = "Byt namn på variabel..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Byt namn på alla'%1'-variabler till:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "ta bort mellanrum från vänstra sidan av Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "ta bort mellanrum från högra sidan av"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Returnerar en kopia av texten med borttagna mellanrum från en eller båda ändar."; Blockly.Msg.TODAY = "Idag"; +Blockly.Msg.UNDO = "Ångra"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "föremål"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Skapa \"välj %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/ta.js b/msg/js/ta.js index f0109bbcc3..d2d87debf8 100644 --- a/msg/js/ta.js +++ b/msg/js/ta.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "பட்டியலில Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை. #1, முதல் உருப்படி."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "மதிப்பை பட்டியலில் கடைசி உருப்படியில் வை"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "மதிப்பை பட்டியலில் சீரற்ற உருப்படியில் வை"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "உரையில் இருந்து பட்டியல் உருவாக்கு"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "பட்டியலில் இருந்து உரை உருவாக்கு"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "பெயரை உள்ளிடு Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "செயல்கூறுக்கு ஒரு உள்ளீட்டை சேர்."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "உள்ளீடுகள்"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "செயல்கூறுகளின் உள்ளீட்டை சேர், நீக்கு, or மீண்டும் வரிசை செய்."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "கருத்தை நீக்கு"; Blockly.Msg.RENAME_VARIABLE = "மாறிலியை மறுபெயரிடுக..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "அனைத்து '%1' மாறிலிகளையும் பின்வருமாறு மறுபெயரிடுக:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "இடது பக்கத்தில Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "வலது பக்கத்தில் இடைவெளி எழுத்து நேர்த்தி செய்."; Blockly.Msg.TEXT_TRIM_TOOLTIP = "உரை நகல் எடுத்து இடைவெளி எழுத்து நீக்கி பின்கொடு."; Blockly.Msg.TODAY = "இன்று"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "உருப்படி"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "'%1 நியமி' உருவாக்கு"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/tcy.js b/msg/js/tcy.js index 9844fbfac0..2bc9e5b4bd 100644 --- a/msg/js/tcy.js +++ b/msg/js/tcy.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "ಟಿಪ್ಪಣಿ ಸೇರ್ಸಲೆ"; Blockly.Msg.AUTH = "ಈರೆನ ಕೆಲಸೊನು ಒರಿಪಾಯರೆ ಬುಕ್ಕೊ ಈರೆನಟ್ಟುಗು ಪಟ್ಟೊನುಯರೆ ಅವಕಾಸೊ."; Blockly.Msg.CHANGE_VALUE_TITLE = "ಮೌಲ್ಯೊದ ಬದಲಾವಣೆ"; Blockly.Msg.CHAT = "ನಿಕ್ಲೆನ ಸಹಬೋಗಿನೊಟ್ಟುಗೆ ಈ ಪೆಟ್ಟಿಗೆಡ್ ಚಾಟಿಂಗ್‍ ನಮೂದು ಮಲ್ಪುಲೆ"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "ನಿರ್ಬಂದೊಲೆನ್ ಸ್ವೊಚ್ಚೊ ಮಲ್ಪುಲೆ"; Blockly.Msg.COLLAPSE_ALL = "ಕುಗ್ಗಿಸಾದ್ ನಿರ್ಬಂಧಿಸಾಪುನೆ"; Blockly.Msg.COLLAPSE_BLOCK = "ಕುಗ್ಗಿಸಾದ್ ತಡೆಪತ್ತುನೆ"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "ಬಣ್ಣೊ ೧(ಒಂಜಿ)"; @@ -37,10 +37,10 @@ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "ಬಳಕೆಡುಪ್ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "ದುಂಬುದ ಆವೃತಿಡ್ ಉಪ್ಪುನಂಚನೆ ಮಾಂತ ಕೊಲಿಕೆಲೆನ್ ದೆತ್ಪುಲೆ ಬುಕ್ಕೊ ದುಂಬರಿಲೆ"; Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "ಎಚ್ಚರೊ: ಈ ನಿರ್ಬಂದೊನು ಕೇವಲ ಒಂಜಿ ಕೊಲಿಕೆದಾಕಾರೊದ ಮುಕ್ತಮಾರ್ಗೊದ ಪರಿಮಿತಿದುಲಯಿಡ್ ಬಳಸೊಲಿ"; Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated -Blockly.Msg.CONTROLS_FOREACH_TITLE = "for each item %1 in list %2"; // untranslated +Blockly.Msg.CONTROLS_FOREACH_TITLE = "ಅತ್ತಂದೆ ಪ್ರತೀ ಅಂಸೊ %1ದ ಉಲಯಿ %2ದ ಪಟ್ಟಿ"; Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಪ್ರತಿ ವಸ್ತುಗು, ಜೋಡಾಯಿನ ವಸ್ತು ಬದಲಾಪುನಂಚ '% 1', ಬುಕ್ಕೊ ಒಂತೆ ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಲಪುಲೆ."; Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated -Blockly.Msg.CONTROLS_FOR_TITLE = "count with %1 from %2 to %3 by %4"; // untranslated +Blockly.Msg.CONTROLS_FOR_TITLE = "%1ಡ್ದ್ %2ಗ್ ಮುಟ್ಟ %3 ಬುಕ್ಕೊ %4ನ್ ಒಟ್ಟೂಗು ಗೆನ್ಪಿ"; Blockly.Msg.CONTROLS_FOR_TOOLTIP = "ಸುರೂತ ನಂಬ್ರೊಡ್ದು ಅಕೇರಿದ ನಂಬ್ರೊಗು ಬಿಲೆಟ್ ಮಸ್ತ್ ಹೆಚ್ಚ್‌ಕಮ್ಮಿ ಇತ್ತ್ಂಡಲಾ %1 ದೆತೊಂದ್, ನಿರ್ದಿಸ್ಟೊ ಮಧ್ಯಂತರೊದ ಮೂಲಕೊ ಲೆಕ್ಕೊದೆತೊಂದು ಬುಕ್ಕೊ ನಿಗಂಟ್ ಮಲ್ತ್‌ನ ಬ್ಲಾಕ್‍ಲೆನ್ ಲೆಕ್ಕೊ ಮಲ್ಪುಲ."; Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "ಒಂಜಿ ವೇಲೆ ಒಂಜಿ ತಡೆಕ್ ಈ ಪರಿಸ್ಥಿತಿನ್ ಸೇರಲೆ"; Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "ಒಂಜಿ ವೇಲೆ ಮಾಂತೆನ್ಲಾ ದೀಡೊಂದು ಅಕೇರಿದ ಪರಿಸ್ಥಿಡ್ ಸೇರಲೆ"; @@ -62,7 +62,7 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ಬುಕ್ಕೊ ಮುಟ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ಬುಕ್ಕೊ ಅಂಚನೇ"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "ಈ ತಿರ್ತ್‍ದ ತಪ್ಪಾದುಂಡು, ಬುಕ್ಕೊದ ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಪಪುಲ"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "ಈ ತಿರ್ತ್‌ದ ಸರಿ ಇತ್ತ್ಂಡಲಾ, ಬುಕ್ಕೊದ ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಪುಲ"; -Blockly.Msg.DELETE_ALL_BLOCKS = "Delete all %1 blocks?"; // untranslated +Blockly.Msg.DELETE_ALL_BLOCKS = "ಮಾತ %1 ನಿರ್ಬಂದೊಲೆನ್ ದೆತ್ತ್ ಪಾಡ್ಲೆ ?"; Blockly.Msg.DELETE_BLOCK = "ಮಾಜಯರ ತಡೆಯಾತ್ಂಡ್"; Blockly.Msg.DELETE_X_BLOCKS = "ಮಾಜಯರ ಶೇಕಡಾ ೧ ತಡೆಯಾತ್ಂಡ್"; Blockly.Msg.DISABLE_BLOCK = "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಾದ್ ತಡೆಪತ್ತುನೆ"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specifi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -154,12 +162,12 @@ Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logi Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false."; // untranslated Blockly.Msg.LOGIC_BOOLEAN_TRUE = "ಸತ್ಯೊ"; Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "Return true if both inputs equal each other."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "Return true if the first input is greater than the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "Return true if the first input is greater than or equal to the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "Return true if the first input is smaller than the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "Return true if the first input is smaller than or equal to the second input."; // untranslated -Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "Return true if both inputs are not equal to each other."; // untranslated +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "ರಡ್ಡ್ ಅತ್ತಂದೆ ಬೇತೆ ಸೂಚನೆಲು ನಿಜೊಕ್ಕುಲಾ ಸಮೊ ಇತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ."; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆಡ್ದ್ ನಿಜೊಕ್ಕುಲಾ ಮಲ್ಲೆ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆ ನಿಜೊಕ್ಕುಲಾ ದಿಂಜ ಮಲ್ಲೆ ಅತ್ತಂಡ ಸಮೊ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆ ನಿಜೊಕ್ಕುಲಾ ಒಂಜಿ ವೇಲೆ ಎಲ್ಯೆ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "ಸುರುತ ಅತ್ತಂದೆ ರಡ್ಡನೆದ ಸೂಚನೆ ನಿಜೊಕ್ಕುಲಾ ದಿಂಜ ಎಲ್ಯೆ ಅತ್ತಂಡ ಸಮೊ ಆದಿತ್ತ್ಂಡ ಪಿರ ಕೊರ್ಲೆ"; +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "ರಡ್ಡ್ ಅತ್ತಂದೆ ಬೇತೆ ಸೂಚನೆಲು ನಿಜೊಕ್ಕುಲಾ ಸಮೊ ಆತಿಜಂಡ ಪಿರ ಕೊರ್ಲೆ"; Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg.LOGIC_NEGATE_TITLE = "not %1"; // untranslated Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "Returns true if the input is false. Returns false if the input is true."; // untranslated @@ -169,7 +177,7 @@ Blockly.Msg.LOGIC_NULL_TOOLTIP = "ಸೊನ್ನೆನ್ ಪರಿಕೊರ್ Blockly.Msg.LOGIC_OPERATION_AND = "ಬುಕ್ಕೊ"; Blockly.Msg.LOGIC_OPERATION_HELPURL = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg.LOGIC_OPERATION_OR = "ಅತ್ತಂಡ"; -Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "Return true if both inputs are true."; // untranslated +Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "ರಡ್ಡ್ ಸೂಚನೆಲಾ ನಿಜೊ ಆದಿತ್ತ್ಂಡ ನಿಜವಾತ್ ಪಿರಕೊರ್ಲೆ"; Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "Return true if at least one of the inputs is true."; // untranslated Blockly.Msg.LOGIC_TERNARY_CONDITION = "ಪರೀಕ್ಷೆ"; Blockly.Msg.LOGIC_TERNARY_HELPURL = "https://en.wikipedia.org/wiki/%3F:"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; // untranslated Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "ಟಿಪ್ಪಣಿನ್ ದೆತ್ತ್‌ಪಾಡ್ಲೆ"; Blockly.Msg.RENAME_VARIABLE = "ಬದಲಾವಣೆ ಆಯಿನ ಪುದರ್‍ನ್ ನಾನೊರೊ ಪನ್ಲೆ"; Blockly.Msg.RENAME_VARIABLE_TITLE = "ನಾನೊರೊ ಪುದರ್ ಬದಲಾವಣೆ ಆಯಿನ ಮಾಂತ '% 1':"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side of"; // untra Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side of"; // untranslated Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg.TODAY = "ಇನಿ"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "ವಸ್ತು"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; // untranslated Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/th.js b/msg/js/th.js index 8ee388bf94..ef98e239a2 100644 --- a/msg/js/th.js +++ b/msg/js/th.js @@ -62,7 +62,7 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "ทำซ้ำจนกระ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "ทำซ้ำตราบเท่าที่"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "ตราบเท่าที่ค่าเป็นเท็จ ก็จะทำบางคำสั่ง"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "ตราบเท่าที่ค่าเป็นจริง ก็จะทำบางคำสั่ง"; -Blockly.Msg.DELETE_ALL_BLOCKS = "ต้องการลบบล็อกทั้ง %1 บล็อกใช่หรือไม่?"; +Blockly.Msg.DELETE_ALL_BLOCKS = "ต้องการลบบล็อกทั้ง %1 บล็อกหรือไม่"; Blockly.Msg.DELETE_BLOCK = "ลบบล็อก"; Blockly.Msg.DELETE_X_BLOCKS = "ลบ %1 บล็อก"; Blockly.Msg.DISABLE_BLOCK = "ปิดใช้งานบล็อก"; @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "กำหนดไอเท Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ #1 คือไอเท็มอันแรกสุด"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "กำหนดไอเท็มอันสุดท้ายในรายการ"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "กำหนดไอเท็มแบบสุ่มในรายการ"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "สร้างรายการจากข้อความ"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "สร้างข้อความจากรายการ"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "ชื่อนำเข้า:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "นำเข้า"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "เอาคำอธิบายออก"; Blockly.Msg.RENAME_VARIABLE = "เปลี่ยนชื่อตัวแปร..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "เปลี่ยนชื่อตัวแปร '%1' ทั้งหมดเป็น:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "ลบช่องว่างด้า Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "ลบช่องว่างข้างท้ายของ"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "คืนค่าสำเนาของข้อความที่ลบเอาช่องว่างหน้าและหลังข้อความออกแล้ว"; Blockly.Msg.TODAY = "วันนี้"; +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "รายการ"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "สร้าง \"กำหนด %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/tl.js b/msg/js/tl.js index db4baf23fd..2834e10b52 100644 --- a/msg/js/tl.js +++ b/msg/js/tl.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Pag set ng item sa tinukoy n Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Pag set ng item sa tinukoy na position sa isang list. #1 ay ang unang item."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Pag set sa huling item sa isang list."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Pag set ng walang pinipiling item sa isang list."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "input name:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "inputs"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Remove Comment"; Blockly.Msg.RENAME_VARIABLE = "Rename variable..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Rename all '%1' variables to:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "trim spaces from left side"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "trim spaces from right side"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "item"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Create 'set %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/tlh.js b/msg/js/tlh.js index d5d349508a..5385d73838 100644 --- a/msg/js/tlh.js +++ b/msg/js/tlh.js @@ -10,7 +10,7 @@ Blockly.Msg.ADD_COMMENT = "QInHom chel"; Blockly.Msg.AUTH = "ngogh nablIj DapollaHmeH qoj latlhvaD DangeHlaHmeH chaw' yInob."; Blockly.Msg.CHANGE_VALUE_TITLE = "choH:"; Blockly.Msg.CHAT = "beqpu'lI'vaD bIjawmeH naDev yIrI'!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "ngoghmeyvaD tlhegh rurmoH"; Blockly.Msg.COLLAPSE_ALL = "ngoghmey DejmoH"; Blockly.Msg.COLLAPSE_BLOCK = "ngogh DejmoH"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "rItlh wa'"; @@ -143,12 +143,20 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Sets the item at the specifi Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Sets the item at the specified position in a list. #1 is the first item."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Sets the last item in a list."; // untranslated Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Sets a random item in a list."; // untranslated +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "tetlh ghermeH ghItlh wav"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "ghItlh chenmoHmeH tetlh gherHa'"; Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "rarwI'Hom lo'"; Blockly.Msg.LOGIC_BOOLEAN_FALSE = "teHbe'"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Returns either true or false."; // untranslated @@ -263,7 +271,7 @@ Blockly.Msg.ME = "Me"; // untranslated Blockly.Msg.NEW_VARIABLE = "lIw chu'..."; Blockly.Msg.NEW_VARIABLE_TITLE = "lIw chu' pong:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "mu'tlhegh chaw'"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "qel:"; Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'."; // untranslated @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Proce Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "qel:"; Blockly.Msg.PROCEDURES_CREATE_DO = "chel '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "mIw yIDel..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "mIw"; @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "pong:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "qelwI'mey"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.REDO = "vangqa'"; Blockly.Msg.REMOVE_COMMENT = "QInHom chelHa'"; Blockly.Msg.RENAME_VARIABLE = "lIw pong choH..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Hoch \"%1\" lIwmey pongmey choH:"; @@ -353,7 +362,8 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = "poSnIHlogh pei"; Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "poSlogh pei"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "nIHlogh pei"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Return a copy of the text with spaces removed from one or both ends."; // untranslated -Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.TODAY = "DaHjaj"; +Blockly.Msg.UNDO = "vangHa'"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "Doch"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "chel 'choH %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/tr.js b/msg/js/tr.js index 24adcaa6a5..5f1b31fc30 100644 --- a/msg/js/tr.js +++ b/msg/js/tr.js @@ -41,7 +41,7 @@ Blockly.Msg.CONTROLS_FOREACH_TITLE = "her öğe için %1 listede %2"; Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "Bir listedeki her öğe için '%1' değişkenini maddeye atayın ve bundan sonra bazı açıklamalar yapın."; Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg.CONTROLS_FOR_TITLE = "ile sayılır %1 %2 den %3 ye, her adımda %4 değişim"; -Blockly.Msg.CONTROLS_FOR_TOOLTIP = "\"%1\" değişkenini başlangıç numarasından bitiş numarasına kadar tanımlı farkla değerler verirken tanımlı blokları yap."; +Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Başlangıç sayısından bitiş sayısına kadar belirtilen aralık ve belirtilen engeller ile devam eden değerler alan '%1' değişkeni oluştur."; Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "If bloğuna bir koşul ekleyin."; Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "If bloğuna kalan durumları \"yakalayan\" bir son ekle."; Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse"; // untranslated @@ -118,7 +118,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Listenin belirli bir kısmının kopyas Blockly.Msg.LISTS_INDEX_OF_FIRST = "Öğenin ilk varolduğu yeri bul"; Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg.LISTS_INDEX_OF_LAST = "Öğenin son varolduğu yeri bul"; -Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Öğenin listede , ilk ve son görüldüğü dizinleri döndürür . Öğe bulunmassa , 0 döndürür ."; +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Listedeki öğenin ilk/son oluşumunun indeksini döndürür. Eğer öğe bulunamaz ise 0 döndürür."; Blockly.Msg.LISTS_INLIST = "Listede"; Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 boş"; @@ -143,12 +143,20 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Bir öğeyi belirtilen yere Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Bir öğeyi belirtilen yere göre listeye yerleştirir . #1 ilk öğedir ."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Bir listedeki son öğeyi yerleştirir ."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Listeye rast gele bir öğe yerleştirir ."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "metinden liste yap"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "listeden metin yap"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Bir sınırlayıcı tarafından kesilen metinlerin listesini bir metine ekle."; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Her sınırlayıcıda kesen metinleri bir metin listesine ayır."; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "sınırlayıcı ile"; Blockly.Msg.LOGIC_BOOLEAN_FALSE = "false = Olumsuz"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "Ya 'True' yada 'False' değerini verir."; @@ -230,7 +238,7 @@ Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = "0.0(dahil) ve 1.0 (hariç) sayıları a Blockly.Msg.MATH_RANDOM_INT_HELPURL = "https://tr.wikipedia.org/wiki/Rastgele_say%C4%B1_%C3%BCretimi"; Blockly.Msg.MATH_RANDOM_INT_TITLE = "%1 ile %2 arasında rastgele tam sayı üret"; Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = "Herhangi iki sayı arasında , sayılar dahil olmak üzere , rastgele bir tam sayı döndür."; -Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding"; // untranslated +Blockly.Msg.MATH_ROUND_HELPURL = "https://en.wikipedia.org/wiki/Rounding Yuvarlama fonksiyonu için araştırma yapınız, sayfanın Türkçe çevirisi henüz mevcut değil."; Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = "Yuvarla"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = "aşağı yuvarla"; Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = "yukarı yuvarla"; @@ -265,13 +273,13 @@ Blockly.Msg.NEW_VARIABLE_TITLE = "Yeni değişken ismi :"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Eğer ifadelerine izin ver"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "ile :"; -Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Kullanıcı tanımlı fonksiyonu çalıştır '%1' ."; Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Kullanıcı tanımlı fonksiyonu çalıştır '%1' ve çıktısını kullan ."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "ile :"; Blockly.Msg.PROCEDURES_CREATE_DO = "'%1' oluştur"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Bu işlevi açıkla..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "birşey yap"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "Geri dön"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Çıktı veren bir fonksiyon oluşturur."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Uyarı: Bu fonksiyon yinelenen parametreler vardır."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Fonksiyon tanımı vurgulamak"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Eğer değer doğruysa, ikinci değere geri dön."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Uyarı: Bu blok yalnızca bir fonksiyon tanımı içinde kullanılır."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "girdi adı:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "İşleve bir girdi ekleyin."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "girdiler"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Bu işlevin girdilerini ekleyin, çıkarın, ya da yeniden sıralayın."; +Blockly.Msg.REDO = "Yinele"; Blockly.Msg.REMOVE_COMMENT = "Yorumu Sil"; Blockly.Msg.RENAME_VARIABLE = "Değişkeni yeniden adlandır..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Tüm '%1' değişkenlerini yeniden isimlendir:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "solundan boşlukları temizle"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "sağından boşlukları temizle"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Metnin bir veya her iki sondan da boşlukları silinmiş şekilde kopyasını verir."; Blockly.Msg.TODAY = "Bugün"; +Blockly.Msg.UNDO = "Geri al"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "öge"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "'set %1' oluştur"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/uk.js b/msg/js/uk.js index c5dff10cdb..cf97fe2d41 100644 --- a/msg/js/uk.js +++ b/msg/js/uk.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Задає елемент с Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Задає елемент списку у вказаній позиції. #1 - це перший елемент."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Задає останній елемент списку."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Задає випадковий елемент у списку."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "зробити з тексту список"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "зробити зі списку текст"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://uk.wikipedia.org/wiki/Пі Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Запустити користувацьку функцію \"%1\" і використати її вивід."; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "з:"; Blockly.Msg.PROCEDURES_CREATE_DO = "Створити \"%1\""; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Опишіть цю функцію..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "блок тексту"; Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://uk.wikipedia.org/wiki/Підпрограма"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "щось зробити"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "повернути"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "Створює функцію з виводом."; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "Увага: ця функція має дубльовані параметри."; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "Підсвітити визначення функції"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "Якщо значення істинне, то повернути друге значення."; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "Попередження: цей блок може використовуватися лише в межах визначення функції."; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "назва входу:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Додати до функції вхідні параметри."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "входи"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Додайте, вилучіть або змініть порядок вхідних параметрів для цієї функції."; +Blockly.Msg.REDO = "Повторити"; Blockly.Msg.REMOVE_COMMENT = "Видалити коментар"; Blockly.Msg.RENAME_VARIABLE = "Перейменувати змінну..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Перейменувати усі змінні \"%1\" до:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "вилучити пропуски з лі Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "вилучити пропуски з правого боку"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Повертає копію тексту з вилученими пропусками з одного або обох кінців."; Blockly.Msg.TODAY = "Сьогодні"; +Blockly.Msg.UNDO = "Скасувати"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "елемент"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Створити 'встановити %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/vi.js b/msg/js/vi.js index 1cff2cc849..a95546692a 100644 --- a/msg/js/vi.js +++ b/msg/js/vi.js @@ -143,6 +143,14 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "Đặt giá trị của thà Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "Đặt giá trị của thành tố ở vị trí ấn định trong một danh sách. #1 là thành tố đầu tiên."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "Đặt giá trị của thành tố cuối cùng trong danh sách."; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "Đặt giá trị của thành tố ngẫu nhiên trong danh sách."; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated @@ -289,6 +297,7 @@ Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "biến:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Thêm một đầu vào cho hàm."; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "các tham số"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Thêm, xóa hoặc sắp xếp lại các đầu vào cho hàm này."; +Blockly.Msg.REDO = "Redo"; // untranslated Blockly.Msg.REMOVE_COMMENT = "Xóa Chú Giải"; Blockly.Msg.RENAME_VARIABLE = "Thay tên biến..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "Thay tên tất cả \"%1\" biến này thành:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "cắt các không gian từ bên trái c Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "cắt các không gian từ bên phải của"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "Hoàn trả bản sao của văn bản sau khi xóa khoảng trắng từ một hoặc hai bên."; Blockly.Msg.TODAY = "Today"; // untranslated +Blockly.Msg.UNDO = "Undo"; // untranslated Blockly.Msg.VARIABLES_DEFAULT_NAME = "vật"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "Tạo mảnh \"đặt vào %1\""; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/zh-hans.js b/msg/js/zh-hans.js index 3b968ac6f3..e9aa87c1a0 100644 --- a/msg/js/zh-hans.js +++ b/msg/js/zh-hans.js @@ -50,9 +50,9 @@ Blockly.Msg.CONTROLS_IF_MSG_ELSE = "否则"; Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "否则如果"; Blockly.Msg.CONTROLS_IF_MSG_IF = "如果"; Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "如果值为真,执行一些语句。"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "如果值为真,则执行语句的第一块;否则,则执行语句的第二块。"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "如果第一个值为真,则执行语句的第一个块;否则,如果第二个值为真,则执行语句的第二块。"; -Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "如果第一个值为真,则执行语句的第一块;否则,如果第二个值为真,则执行语句的第二块;如果没有值为真,则执行语句的最后一块。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "如果值为真,则执行语句的第一块。否则,则执行语句的第二块。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "如果第一个值为真,则执行语句的第一个块。否则,如果第二个值为真,则执行语句的第二块。"; +Blockly.Msg.CONTROLS_IF_TOOLTIP_4 = "如果第一个值为真,则执行语句的第一块。否则,如果第二个值为真,则执行语句的第二块。如果没有值为真,则执行语句的最后一块。"; Blockly.Msg.CONTROLS_REPEAT_HELPURL = "https://zh.wikipedia.org/wiki/For循环"; Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = "执行"; Blockly.Msg.CONTROLS_REPEAT_TITLE = "重复 %1 次"; @@ -143,15 +143,23 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "设置在列表中指定位 Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "设置在列表中指定位置的项。#1是第一项。"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "设置列表中的最后一项。"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "设置列表中一个随机的项目。"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "从文本制作列表"; Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "从列表拆出文本"; Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "加入文本列表至一个文本,由分隔符分隔。"; Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "拆分文本到文本列表,按每个分隔符拆分。"; Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "用分隔符"; -Blockly.Msg.LOGIC_BOOLEAN_FALSE = "错"; +Blockly.Msg.LOGIC_BOOLEAN_FALSE = "假"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "同时返回真或假。"; +Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "返回真或假。"; Blockly.Msg.LOGIC_BOOLEAN_TRUE = "真"; Blockly.Msg.LOGIC_COMPARE_HELPURL = "https://zh.wikipedia.org/wiki/不等"; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "如果两个输入结果相等,则返回真。"; @@ -160,8 +168,8 @@ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "如果第一个输入结果大于或等 Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "如果第一个输入结果比第二个小,则返回真。"; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "如果第一个输入结果小于或等于第二个输入结果,则返回真。"; Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "如果两个输入结果不相等,则返回真。"; -Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://zh.wikipedia.org/wiki/逻辑非"; -Blockly.Msg.LOGIC_NEGATE_TITLE = "并非%1"; +Blockly.Msg.LOGIC_NEGATE_HELPURL = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg.LOGIC_NEGATE_TITLE = "非%1"; Blockly.Msg.LOGIC_NEGATE_TOOLTIP = "如果输入结果为假,则返回真;如果输入结果为真,则返回假。"; Blockly.Msg.LOGIC_NULL = "空"; Blockly.Msg.LOGIC_NULL_HELPURL = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated @@ -196,7 +204,7 @@ Blockly.Msg.MATH_IS_DIVISIBLE_BY = "可被整除"; Blockly.Msg.MATH_IS_EVEN = "是偶数"; Blockly.Msg.MATH_IS_NEGATIVE = "为负"; Blockly.Msg.MATH_IS_ODD = "是奇数"; -Blockly.Msg.MATH_IS_POSITIVE = "是正值"; +Blockly.Msg.MATH_IS_POSITIVE = "为正"; Blockly.Msg.MATH_IS_PRIME = "是质数"; Blockly.Msg.MATH_IS_TOOLTIP = "如果数字是偶数、奇数、非负整数、正数、负数或如果它可被某数字整除,则返回真或假。"; Blockly.Msg.MATH_IS_WHOLE = "为整数"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://zh.wikipedia.org/wiki/子 Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "运行用户定义的函数“%1”,并使用它的输出值。"; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "与:"; Blockly.Msg.PROCEDURES_CREATE_DO = "创建“%1”"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "描述该功能..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "空白"; Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程序"; Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "做点什么"; @@ -282,13 +290,14 @@ Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = "返回"; Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = "创建一个有输出值的函数。"; Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = "警告: 此函数具有重复参数。"; Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "突出显示函数定义"; -Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "如果值为真,则返回第二个值。"; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "警告: 仅在定义函数内可使用此块。"; Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "输入名称:"; Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "添加函数输入。"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "输入"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "添加、删除或重新排此函数的输入。"; +Blockly.Msg.REDO = "重做"; Blockly.Msg.REMOVE_COMMENT = "删除注释"; Blockly.Msg.RENAME_VARIABLE = "重命名变量..."; Blockly.Msg.RENAME_VARIABLE_TITLE = "将所有“%1”变量重命名为:"; @@ -354,6 +363,7 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "消除左侧空格"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "消除右侧空格"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "复制这段文字的同时删除两端多余的空格。"; Blockly.Msg.TODAY = "今天"; +Blockly.Msg.UNDO = "撤销"; Blockly.Msg.VARIABLES_DEFAULT_NAME = "项目"; Blockly.Msg.VARIABLES_GET_CREATE_SET = "创建“设定%1”"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/zh-hant.js b/msg/js/zh-hant.js index 85ce0d2908..c02df83d78 100644 --- a/msg/js/zh-hant.js +++ b/msg/js/zh-hant.js @@ -7,10 +7,10 @@ goog.provide('Blockly.Msg.zh.hant'); goog.require('Blockly.Msg'); Blockly.Msg.ADD_COMMENT = "加入註解"; -Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you."; // untranslated +Blockly.Msg.AUTH = "請授權這個應用程式以保存您的作品並共享。"; Blockly.Msg.CHANGE_VALUE_TITLE = "修改值:"; Blockly.Msg.CHAT = "與您的合作者洽談藉由在此框輸入!"; -Blockly.Msg.CLEAN_UP = "Clean up Blocks"; // untranslated +Blockly.Msg.CLEAN_UP = "清理積木"; Blockly.Msg.COLLAPSE_ALL = "收合積木"; Blockly.Msg.COLLAPSE_BLOCK = "收合積木"; Blockly.Msg.COLOUR_BLEND_COLOUR1 = "顏色 1"; @@ -38,7 +38,7 @@ Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "跳過這個迴圈的 Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "警告: 此積木僅可用於迴圈內。"; Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg.CONTROLS_FOREACH_TITLE = "取出每個 %1 自列表 %2"; -Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "遍歷每個列表中的項目,將變量 '%1' 設定到該項目中,然後執行某些語句"; +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "遍歷每個列表中的項目,將變數 '%1' 設定到該項目中,然後執行某些語句"; Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg.CONTROLS_FOR_TITLE = "使用 %1 從範圍 %2 到 %3 每隔 %4"; Blockly.Msg.CONTROLS_FOR_TOOLTIP = "從起始數到結尾數中取出變數 \"%1\" 的值,按指定的時間間隔,執行指定的積木。"; @@ -62,7 +62,7 @@ Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = "重複 直到"; Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = "重複 當"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "當值為否時,執行一些語句"; Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "當值為真時,執行一些語句"; -Blockly.Msg.DELETE_ALL_BLOCKS = "刪除共%1個積木?"; +Blockly.Msg.DELETE_ALL_BLOCKS = "刪除共 %1 塊積木?"; Blockly.Msg.DELETE_BLOCK = "刪除積木"; Blockly.Msg.DELETE_X_BLOCKS = "刪除 %1 塊積木"; Blockly.Msg.DISABLE_BLOCK = "停用積木"; @@ -76,7 +76,7 @@ Blockly.Msg.INLINE_INPUTS = "單行輸入"; Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = "建立空列表"; Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = "返回一個長度為 0 的列表,不包含任何資料記錄"; -Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "加入"; +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = "列表"; Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = "添加、 刪除或重新排列各區塊來此重新配置這個 列表 積木。"; Blockly.Msg.LISTS_CREATE_WITH_HELPURL = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = "使用這些值建立列表"; @@ -131,9 +131,9 @@ Blockly.Msg.LISTS_REPEAT_TITLE = "建立列表使用項目 %1 重複 %2 次數"; Blockly.Msg.LISTS_REPEAT_TOOLTIP = "建立包含指定重複次數的 值 的列表。"; Blockly.Msg.LISTS_SET_INDEX_HELPURL = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = "為"; -Blockly.Msg.LISTS_SET_INDEX_INSERT = "插入到"; +Blockly.Msg.LISTS_SET_INDEX_INSERT = "插入在"; Blockly.Msg.LISTS_SET_INDEX_SET = "設定"; -Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "在列表的起始處添加一個項目。"; +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = "在列表的起始處添加一個項目"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END = "插入在列表中的指定位置的項目。#1 是最後一個項目。"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START = "插入在列表中的指定位置的項目。#1 是第一個項目。"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = "在列表的尾端加入一個項目"; @@ -143,12 +143,20 @@ Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_END = "設定在列表中的指定 Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM_START = "設定在列表中的指定位置的項目。#1 是第一個項目。"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = "設定列表中的最後一個項目"; Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = "設定列表中隨機的一個項目"; +Blockly.Msg.LISTS_SORT_HELPURL = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "ascending"; // untranslated +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "descending"; // untranslated +Blockly.Msg.LISTS_SORT_TITLE = "sort %1 %2 %3"; // untranslated +Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list."; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "alphabetic, ignore case"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "numeric"; // untranslated +Blockly.Msg.LISTS_SORT_TYPE_TEXT = "alphabetic"; // untranslated Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated -Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "make list from text"; // untranslated -Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "make text from list"; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "Join a list of texts into one text, separated by a delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "Split text into a list of texts, breaking at each delimiter."; // untranslated -Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "with delimiter"; // untranslated +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "從文本製作列表"; +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "從列表拆出文本"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = "串起文本列表成一個文本,由分隔符分隔。"; +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = "拆分文本到文本列表,按每個分隔符拆分。"; +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = "用分隔符"; Blockly.Msg.LOGIC_BOOLEAN_FALSE = "否"; Blockly.Msg.LOGIC_BOOLEAN_HELPURL = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "返回 真 或 否。"; @@ -185,7 +193,7 @@ Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "返回兩個數字的乘積。"; Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = "返回第二個數字的指數的第一個數字。"; Blockly.Msg.MATH_CHANGE_HELPURL = "https://zh.wikipedia.org/wiki/加法"; Blockly.Msg.MATH_CHANGE_TITLE = "修改 %1 自 %2"; -Blockly.Msg.MATH_CHANGE_TOOLTIP = "將數字添加到變量 '%1'。"; +Blockly.Msg.MATH_CHANGE_TOOLTIP = "將數字添加到變數 '%1'。"; Blockly.Msg.MATH_CONSTANT_HELPURL = "https://zh.wikipedia.org/wiki/數學常數"; Blockly.Msg.MATH_CONSTANT_TOOLTIP = "返回一個的常見常量: π (3.141......),e (2.718...)、 φ (1.618...)、 開方(2) (1.414......)、 開方(½) (0.707......) 或 ∞ (無窮大)。"; Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; // untranslated @@ -260,10 +268,10 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_COS = "返回指定角度的餘弦值(非弧度) Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "返回指定角度的正弦值(非弧度)。"; Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "返回指定角度的正切值(非弧度)。"; Blockly.Msg.ME = "我"; -Blockly.Msg.NEW_VARIABLE = "新變量..."; -Blockly.Msg.NEW_VARIABLE_TITLE = "新變量名稱:"; +Blockly.Msg.NEW_VARIABLE = "新變數..."; +Blockly.Msg.NEW_VARIABLE_TITLE = "新變數名稱:"; Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ""; // untranslated -Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "allow statements"; // untranslated +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "允許語句"; Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "與:"; Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://zh.wikipedia.org/wiki/子程式"; Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "執行使用者定義的函數 '%1'。"; @@ -271,7 +279,7 @@ Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://zh.wikipedia.org/wiki/子 Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "執行使用者定義的函數 '%1' 並使用它的回傳值"; Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "與:"; Blockly.Msg.PROCEDURES_CREATE_DO = "建立 '%1'"; -Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function..."; // untranslated +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "描述此函數..."; Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ""; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; // untranslated Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "流程"; @@ -285,17 +293,18 @@ Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = "反白顯示函式定義"; Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = "如果值為 真,則返回第二個值。"; Blockly.Msg.PROCEDURES_IFRETURN_WARNING = "警告: 此積木僅可在定義函式時使用。"; -Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "變量:"; -Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "Add an input to the function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = "變數:"; +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = "添加函數輸入。"; Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = "參數"; -Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = "添加、刪除或重新排列此函數的輸入。"; +Blockly.Msg.REDO = "重試"; Blockly.Msg.REMOVE_COMMENT = "移除註解"; -Blockly.Msg.RENAME_VARIABLE = "重新命名變量..."; -Blockly.Msg.RENAME_VARIABLE_TITLE = "將所有 \"%1\" 變量重新命名為:"; +Blockly.Msg.RENAME_VARIABLE = "重新命名變數..."; +Blockly.Msg.RENAME_VARIABLE_TITLE = "將所有 \"%1\" 變數重新命名為:"; Blockly.Msg.TEXT_APPEND_APPENDTEXT = "後加入文字"; Blockly.Msg.TEXT_APPEND_HELPURL = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg.TEXT_APPEND_TO = "在"; -Blockly.Msg.TEXT_APPEND_TOOLTIP = "將一些文字追加到變量 '%1'。"; +Blockly.Msg.TEXT_APPEND_TOOLTIP = "將一些文字追加到變數 '%1'。"; Blockly.Msg.TEXT_CHANGECASE_HELPURL = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = "轉成 小寫"; Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = "轉成 首字母大寫"; @@ -354,14 +363,15 @@ Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = "消除左側空格"; Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = "消除右側空格"; Blockly.Msg.TEXT_TRIM_TOOLTIP = "複製這段文字的同時刪除兩端多餘的空格。"; Blockly.Msg.TODAY = "今天"; -Blockly.Msg.VARIABLES_DEFAULT_NAME = "變量"; -Blockly.Msg.VARIABLES_GET_CREATE_SET = "創立 '設定 %1'"; +Blockly.Msg.UNDO = "還原"; +Blockly.Msg.VARIABLES_DEFAULT_NAME = "變數"; +Blockly.Msg.VARIABLES_GET_CREATE_SET = "建立 '設定 %1'"; Blockly.Msg.VARIABLES_GET_HELPURL = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated -Blockly.Msg.VARIABLES_GET_TOOLTIP = "返回此變量的值。"; +Blockly.Msg.VARIABLES_GET_TOOLTIP = "返回此變數的值。"; Blockly.Msg.VARIABLES_SET = "賦值 %1 到 %2"; Blockly.Msg.VARIABLES_SET_CREATE_GET = "建立 '取得 %1'"; Blockly.Msg.VARIABLES_SET_HELPURL = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated -Blockly.Msg.VARIABLES_SET_TOOLTIP = "設定此變量,好和輸入值相等。"; +Blockly.Msg.VARIABLES_SET_TOOLTIP = "設定此變數,好和輸入值相等。"; Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; diff --git a/msg/json/ar.json b/msg/json/ar.json deleted file mode 100644 index 3afd05a1e8..0000000000 --- a/msg/json/ar.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Meno25", - "Test Create account", - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "البند", - "DUPLICATE_BLOCK": "ادمج", - "ADD_COMMENT": "اضافة تعليق", - "REMOVE_COMMENT": "ازل التعليق", - "EXTERNAL_INPUTS": "ادخال خارجي", - "INLINE_INPUTS": "ادخال خطي", - "DELETE_BLOCK": "إحذف القطعة", - "DELETE_X_BLOCKS": "إحذف قطع %1", - "DELETE_ALL_BLOCKS": "حذف كل بلوكات %1؟", - "COLLAPSE_BLOCK": "إخفاء القطعة", - "COLLAPSE_ALL": "إخفاء القطع", - "EXPAND_BLOCK": "وسٌّع القطعة", - "EXPAND_ALL": "وسٌّع القطع", - "DISABLE_BLOCK": "عطّل القطعة", - "ENABLE_BLOCK": "أعد تفعيل القطعة", - "HELP": "مساعدة", - "CHAT": "دردش مع زملائك بالكتابة في هذا الصندوق!", - "CHANGE_VALUE_TITLE": "تغيير قيمة:", - "NEW_VARIABLE": "متغير جديد...", - "NEW_VARIABLE_TITLE": "اسم المتغير الجديد:", - "RENAME_VARIABLE": "إعادة تسمية المتغير...", - "RENAME_VARIABLE_TITLE": "إعادة تسمية كافة المتغيرات '%1' إلى:", - "COLOUR_PICKER_HELPURL": "https://ar.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "اختر لون من اللوحة.", - "COLOUR_RANDOM_TITLE": "لون عشوائي", - "COLOUR_RANDOM_TOOLTIP": "اختر لون بشكل عشوائي.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "لون مع", - "COLOUR_RGB_RED": "أحمر", - "COLOUR_RGB_GREEN": "أخضر", - "COLOUR_RGB_BLUE": "أزرق", - "COLOUR_RGB_TOOLTIP": "إنشئ لون بالكمية المحددة من الأحمر, الأخضر والأزرق. بحيث يجب تكون كافة القيم بين 0 و 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "دمج", - "COLOUR_BLEND_COLOUR1": "اللون 1", - "COLOUR_BLEND_COLOUR2": "اللون 2", - "COLOUR_BLEND_RATIO": "نسبة", - "COLOUR_BLEND_TOOLTIP": "دمج لونين ببعضهما البعض بنسبة (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "كرر %1 مرات", - "CONTROLS_REPEAT_INPUT_DO": "نفّذ", - "CONTROLS_REPEAT_TOOLTIP": "نفّذ بعض الأوامر عدة مرات.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "اكرّر طالما", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "اكرّر حتى", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "بما ان القيمة صحيحة, نفّذ بعض الأوامر.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "بما ان القيمة خاطئة, نفّذ بعض الأوامر.", - "CONTROLS_FOR_TOOLTIP": "اجعل المتغير %1 يأخذ القيم من رقم البداية الى رقم النهاية، قم بالعد داخل المجال المحدد، وطبق أوامر القطع المحددة.", - "CONTROLS_FOR_TITLE": "عد بـ %1 من %2 إلى %3 بمعدل %4", - "CONTROLS_FOREACH_TITLE": "لكل عنصر %1 في قائمة %2", - "CONTROLS_FOREACH_TOOLTIP": "لكل عنصر في قائمة ما، عين المتغير '%1' لهذا الغنصر، ومن ثم نفذ بعض الأوامر.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "اخرج من الحلقة", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "استمر ابتداءا من التكرار التالي من الحلقة", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "اخرج من الحلقة الحالية.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "تخط ما تبقى من هذه الحلقة، واستمر ابتداءا من التكرار التالي.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "تحذير: يمكن استخدام هذه القطعة فقط داخل حلقة.", - "CONTROLS_IF_TOOLTIP_1": "إذا كانت قيمة ما تساوي صحيح, إذن قم بتنفيذ أمر ما.", - "CONTROLS_IF_TOOLTIP_2": "إذا كانت قيمة ما تساوي \"صحيح\"، إذن قم بتنفيذ أول قطعة من الأوامر. والا ،قم بتنفيذ القطعة الثانية من الأوامر.", - "CONTROLS_IF_TOOLTIP_3": "إذا كانت القيمة الأولى تساوي \"صحيح\", إذن قم بتنفيذ القطعة الأولى من الأوامر. والا, إذا كانت القيمة الثانية تساوي \"صحيح\", قم بتنفيذ القطعة الثانية من الأوامر.", - "CONTROLS_IF_TOOLTIP_4": "إذا كانت القيمة الأولى تساوي \"صحيح\", إذن قم بتنفيذ القطعة الأولى من الأوامر. والا , إذا كانت القيمة الثانية تساوي \"صحيح\", قم بتنفيذ القطعة الثانية من الأوامر. إذا لم تكن هناك أي قيمة تساوي صحيح, قم بتنفيذ آخر قطعة من الأوامر.", - "CONTROLS_IF_MSG_IF": "إذا", - "CONTROLS_IF_MSG_ELSEIF": "وإﻻ إذا", - "CONTROLS_IF_MSG_ELSE": "والا", - "CONTROLS_IF_IF_TOOLTIP": "أضف, إزل, أو أعد ترتيب المقاطع لإعادة تكوين القطعة الشرطية \"إذا\".", - "CONTROLS_IF_ELSEIF_TOOLTIP": "إضف شرطا إلى القطعة الشرطية \"إذا\".", - "CONTROLS_IF_ELSE_TOOLTIP": "أضف شرط \"نهاية، إجمع\" إلى القطعة الشرطية \"إذا\".", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "يرجع صحيح إذا كان كلا المدخلات مساوية بعضها البعض.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "يرجع صحيح إذا كانت كلا المدخلات غير مساوية لبعضها البعض.", - "LOGIC_COMPARE_TOOLTIP_LT": "يرجع صحيح إذا كان الإدخال الأول أصغر من الإدخال الثاني.", - "LOGIC_COMPARE_TOOLTIP_LTE": "يرجع صحيح إذا كان الإدخال الأول أصغر من أو يساوي الإدخال الثاني.", - "LOGIC_COMPARE_TOOLTIP_GT": "يرجع صحيح إذا كان الإدخال الأول أكبر من الإدخال الثاني.", - "LOGIC_COMPARE_TOOLTIP_GTE": "يرجع صحيح إذا كان الإدخال الأول أكبر من أو يساوي الإدخال الثاني.", - "LOGIC_OPERATION_TOOLTIP_AND": "ترجع صحيح إذا كان كلا المٌدخلات صحيح.", - "LOGIC_OPERATION_AND": "و", - "LOGIC_OPERATION_TOOLTIP_OR": "ترجع صحيح إذا كان واحد على الأقل من المدخلات صحيح.", - "LOGIC_OPERATION_OR": "أو", - "LOGIC_NEGATE_TITLE": "ليس من %1", - "LOGIC_NEGATE_TOOLTIP": "يرجع صحيح إذا كان الإدخال خاطئ . يرجع خاطئ إذا كان الإدخال صحيح.", - "LOGIC_BOOLEAN_TRUE": "صحيح", - "LOGIC_BOOLEAN_FALSE": "خاطئ", - "LOGIC_BOOLEAN_TOOLTIP": "يرجع صحيح أو خاطئ.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "ملغى", - "LOGIC_NULL_TOOLTIP": "ترجع ملغى.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "اختبار", - "LOGIC_TERNARY_IF_TRUE": "إذا كانت العبارة صحيحة", - "LOGIC_TERNARY_IF_FALSE": "إذا كانت العبارة خاطئة", - "LOGIC_TERNARY_TOOLTIP": "تحقق الشرط في 'الاختبار'. إذا كان الشرط صحيح، يقوم بإرجاع قيمة 'اذا كانت العبارة صحيحة'؛ خلاف ذلك يرجع قيمة 'اذا كانت العبارة خاطئة'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "عدد ما.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "جيب", - "MATH_TRIG_COS": "جيب تمام", - "MATH_TRIG_TAN": "ظل", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "يرجع مجموع الرقمين.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "يرجع الفرق بين الرقمين.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "يرجع حاصل ضرب الرقمين.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "يرجع حاصل قسمة الرقمين.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "يرجع الرقم الأول مرفوع إلى تربيع الرقم الثاني.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "الجذر التربيعي", - "MATH_SINGLE_TOOLTIP_ROOT": "يرجع الجذر التربيعي للرقم.", - "MATH_SINGLE_OP_ABSOLUTE": "مطلق", - "MATH_SINGLE_TOOLTIP_ABS": "يرجع القيمة المطلقة لرقم.", - "MATH_SINGLE_TOOLTIP_NEG": "يرجع عدد سالب.", - "MATH_SINGLE_TOOLTIP_LN": "يرجع اللوغاريتم الطبيعي لرقم.", - "MATH_SINGLE_TOOLTIP_LOG10": "يرجع لوغاريتم عدد معين للاساس 10.", - "MATH_SINGLE_TOOLTIP_EXP": "يرجع e الذي هو الاس المرفوع للرقم.", - "MATH_SINGLE_TOOLTIP_POW10": "يرجع مضروب الرقم 10 في نفسه .", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "يرجع جيب التمام لدرجة (لا زواية نصف قطرية).", - "MATH_TRIG_TOOLTIP_COS": "يرجع جيب التمام لدرجة (لا زواية نصف قطرية).", - "MATH_TRIG_TOOLTIP_TAN": "يرجع الظل لدرجة (لا دائرة نصف قطرية).", - "MATH_TRIG_TOOLTIP_ASIN": "يرجع قوس الجيب للرقم.", - "MATH_TRIG_TOOLTIP_ACOS": "يرجع قوس جيب التمام لرقم.", - "MATH_TRIG_TOOLTIP_ATAN": "يرجع قوس الظل للرقم.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "ير جع واحد من الثوابت الشائعة : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", - "MATH_IS_EVEN": "هو زوجي", - "MATH_IS_ODD": "هو فرذي", - "MATH_IS_PRIME": "هو أولي", - "MATH_IS_WHOLE": "هو صحيح", - "MATH_IS_POSITIVE": "هو موجب", - "MATH_IS_NEGATIVE": "هو سالب", - "MATH_IS_DIVISIBLE_BY": "قابل للقسمة", - "MATH_IS_TOOLTIP": "تحقق إذا كان عدد ما زوجيا، فرذيا, أوليا، صحيحا،موجبا أو سالبا، أو إذا كان قابلا للقسمة على عدد معين. يرجع صحيح أو خاطئ.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "غير %1 بـ %2", - "MATH_CHANGE_TOOLTIP": "إضف رقم إلى متغير '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "تقريب الى اكبر عدد صحيح أو الى اصغر عدد صحيح.", - "MATH_ROUND_OPERATOR_ROUND": "تقريب", - "MATH_ROUND_OPERATOR_ROUNDUP": "تقريب الى اكبر عدد صحيح", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "تقريب إلى اصغر عدد صحيح", - "MATH_ONLIST_OPERATOR_SUM": "مجموع القائمة", - "MATH_ONLIST_TOOLTIP_SUM": "يرجع مجموع كافة الأرقام الموجودة في القائمة.", - "MATH_ONLIST_OPERATOR_MIN": "الحد الأدنى من قائمة", - "MATH_ONLIST_TOOLTIP_MIN": "يرجع أصغر رقم في القائمة.", - "MATH_ONLIST_OPERATOR_MAX": "الحد الأقصى لقائمة", - "MATH_ONLIST_TOOLTIP_MAX": "يرجع أكبر عدد في القائمة.", - "MATH_ONLIST_OPERATOR_AVERAGE": "متوسط القائمة", - "MATH_ONLIST_TOOLTIP_AVERAGE": "يرجع المعدل (الوسط الحسابي) للقيم الرقمية في القائمة.", - "MATH_ONLIST_OPERATOR_MEDIAN": "متوسط القائمة", - "MATH_ONLIST_TOOLTIP_MEDIAN": "يرجع وسيط العدد في القائمة.", - "MATH_ONLIST_OPERATOR_MODE": "منوال القائمة", - "MATH_ONLIST_TOOLTIP_MODE": "يرجع قائمة من العنصر أو العناصر الأكثر شيوعاً في القائمة.", - "MATH_ONLIST_OPERATOR_STD_DEV": "الانحراف المعياري للقائمة", - "MATH_ONLIST_TOOLTIP_STD_DEV": "يرجع الانحراف المعياري للقائمة.", - "MATH_ONLIST_OPERATOR_RANDOM": "عنصر عشوائي من القائمة", - "MATH_ONLIST_TOOLTIP_RANDOM": "يرجع عنصر عشوائي من القائمة.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "باقي %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "يرجع الباقي من قسمة الرقمين.", - "MATH_CONSTRAIN_TITLE": "تقيد %1 منخفض %2 مرتفع %3", - "MATH_CONSTRAIN_TOOLTIP": "تقييد العددليكون بين الحدود المحددة (ضمناً).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": " عدد صحيح عشوائي من %1 إلى %2", - "MATH_RANDOM_INT_TOOLTIP": "يرجع عدد صحيح عشوائي بين حدين محددين, ضمنيا.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "كسر عشوائي", - "MATH_RANDOM_FLOAT_TOOLTIP": "يرجع جزء عشوائي بين 0.0 (ضمنياً) و 1.0 (خارجيا).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "حرف أو كلمة أو سطر من النص.", - "TEXT_JOIN_TITLE_CREATEWITH": "انشئ نص مع", - "TEXT_JOIN_TOOLTIP": "أنشئ جزء من النص بالصاق أي عدد من العناصر ببعضها البعض.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "الانضمام إلى", - "TEXT_CREATE_JOIN_TOOLTIP": "أضف, إحذف, أو أعد ترتيب المقاطع لإعادة تكوين النص من القطع التالية.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "إضف عنصر إلى النص.", - "TEXT_APPEND_TO": "إلى", - "TEXT_APPEND_APPENDTEXT": "إلصق نص", - "TEXT_APPEND_TOOLTIP": "إلصق جزءا من النص إلى متغير '%1'.", - "TEXT_LENGTH_TITLE": "طول %1", - "TEXT_LENGTH_TOOLTIP": "تقوم بإرجاع عدد الاحرف (بما في ذلك الفراغات) في النص المقدم.", - "TEXT_ISEMPTY_TITLE": "%1 فارغ", - "TEXT_ISEMPTY_TOOLTIP": "يرجع \"صحيح\" إذا كان النص المقدم فارغ.", - "TEXT_INDEXOF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع 0 إذا لم يتم العثور على النص.", - "TEXT_INDEXOF_INPUT_INTEXT": "في النص", - "TEXT_INDEXOF_OPERATOR_FIRST": "ابحث عن التواجد الأول للنص", - "TEXT_INDEXOF_OPERATOR_LAST": "ابحث عن التواجد الأخير للنص", - "TEXT_CHARAT_INPUT_INTEXT": "في النص", - "TEXT_CHARAT_FROM_START": "الحصول على الحرف #", - "TEXT_CHARAT_FROM_END": "الحصول على الحرف # من نهاية", - "TEXT_CHARAT_FIRST": "احصل على الحرف الأول", - "TEXT_CHARAT_LAST": "احصل على آخر حرف", - "TEXT_CHARAT_RANDOM": "الحصول على حرف عشوائي", - "TEXT_CHARAT_TOOLTIP": "يرجع حرف ما في الموضع المحدد.", - "TEXT_GET_SUBSTRING_TOOLTIP": "يرجع جزء معين من النص.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "في النص", - "TEXT_GET_SUBSTRING_START_FROM_START": "الحصول على سلسلة حروف فرعية من الحرف #", - "TEXT_GET_SUBSTRING_START_FROM_END": "الحصول على سلسلة حروف فرعية من الحرف # من نهاية", - "TEXT_GET_SUBSTRING_START_FIRST": "الحصول على سلسلة فرعية من الحرف الأول", - "TEXT_GET_SUBSTRING_END_FROM_START": "إلى حرف #", - "TEXT_GET_SUBSTRING_END_FROM_END": "إلى حرف # من نهاية", - "TEXT_GET_SUBSTRING_END_LAST": "إلى آخر حرف", - "TEXT_CHANGECASE_TOOLTIP": "يرجع نسخة من النص في حالة مختلفة.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "الى حروف كبيرة", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "الى حروف صغيرة", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "الى حروف العنوان", - "TEXT_TRIM_TOOLTIP": "يرجع نسخة من النص مع حذف من أحد أو كلا الفراغات من أطرافه.", - "TEXT_TRIM_OPERATOR_BOTH": "إزالة الفراغات من كلا الجانبين", - "TEXT_TRIM_OPERATOR_LEFT": "إزالة الفراغات من الجانب الأيسر من", - "TEXT_TRIM_OPERATOR_RIGHT": "إزالة الفراغات من الجانب الأيمن من", - "TEXT_PRINT_TITLE": "اطبع %1", - "TEXT_PRINT_TOOLTIP": "اطبع النص المحدد أو العدد أو قيمة أخرى.", - "TEXT_PROMPT_TYPE_TEXT": "انتظر ادخال المستخدم لنص ما مع اظهار رسالة", - "TEXT_PROMPT_TYPE_NUMBER": "انتظر ادخال المستخدم لرقم ما مع اظهار رسالة", - "TEXT_PROMPT_TOOLTIP_NUMBER": "انتظر ادخال المستخذم لرقم ما.", - "TEXT_PROMPT_TOOLTIP_TEXT": "انتظر ادخال المستخدم لنص ما.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "إنشئ قائمة فارغة", - "LISTS_CREATE_EMPTY_TOOLTIP": "تقوم بإرجاع قائمة، طولها 0, لا تحتوي على أية سجلات البيانات", - "LISTS_CREATE_WITH_TOOLTIP": "أنشيء قائمة من أي عدد من العناصر.", - "LISTS_CREATE_WITH_INPUT_WITH": "أتشئ قائمة مع", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "قائمة", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "أضف, إزل, أو أعد ترتيب المقاطع لإعادة تكوين القطعة قائمة القطع التالية.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "أضف عنصرا إلى القائمة.", - "LISTS_REPEAT_TOOLTIP": "انشئ قائمة تتألف من القيمة المعطاة متكررة لعدد محدد من المرات.", - "LISTS_REPEAT_TITLE": "إنشئ قائمة مع العنصر %1 %2 مرات", - "LISTS_LENGTH_TITLE": "الطول من %1", - "LISTS_LENGTH_TOOLTIP": "تقوم بإرجاع طول قائمة.", - "LISTS_ISEMPTY_TITLE": "%1 فارغ", - "LISTS_ISEMPTY_TOOLTIP": "يرجع \"صحيح\" إذا كانت القائمة فارغة.", - "LISTS_INLIST": "في قائمة", - "LISTS_INDEX_OF_FIRST": "ابحث على على التواجد الأول للعنصر", - "LISTS_INDEX_OF_LAST": "ابحث على التواجد الأخير للعنصر", - "LISTS_INDEX_OF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع 0 إذا لم يتم العثور على النص.", - "LISTS_GET_INDEX_GET": "احصل على", - "LISTS_GET_INDEX_GET_REMOVE": "احصل على و ازل", - "LISTS_GET_INDEX_REMOVE": "ازل", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# من نهاية", - "LISTS_GET_INDEX_FIRST": "أول", - "LISTS_GET_INDEX_LAST": "أخير", - "LISTS_GET_INDEX_RANDOM": "عشوائي", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "يرجع العنصر الأول في قائمة ما.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "يرجع العنصر الأخير في قائمة ما.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "يرجع عنصرا عشوائيا في قائمة.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "يزيل ويرجع العنصر الأول في قائمة.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "يزيل ويرجع العنصر الأخير في قائمة ما.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "يزيل و يرجع عنصرا عشوائيا في قائمة ما.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "يزيل العنصر الموجود في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "يزيل العنصر الموجود في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "يزيل العنصر الأول في قائمة ما.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "يزيل العنصر الأخير في قائمة ما.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "يزيل عنصرا عشوائيا في قائمة ما.", - "LISTS_SET_INDEX_SET": "تعيين", - "LISTS_SET_INDEX_INSERT": "أدخل في", - "LISTS_SET_INDEX_INPUT_TO": "مثل", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "يحدد العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "يحدد العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "يحدد العنصر الأول في قائمة.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "يحدد العنصر الأخير في قائمة.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "يحدد عنصرا عشوائيا في قائمة.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأول.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما. #1 هو العنصر الأخير.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "يقوم بإدراج هذا العنصر في بداية قائمة.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "ألصق هذا العنصر بنهاية قائمة.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "ادخل العنصر عشوائياً في القائمة.", - "LISTS_GET_SUBLIST_START_FROM_START": "احصل على قائمة فرعية من #", - "LISTS_GET_SUBLIST_START_FROM_END": "احصل على قائمة فرعية من # من نهاية", - "LISTS_GET_SUBLIST_START_FIRST": "احصل على قائمة فرعية من الأول", - "LISTS_GET_SUBLIST_END_FROM_START": "إلى #", - "LISTS_GET_SUBLIST_END_FROM_END": "إلى # من نهاية", - "LISTS_GET_SUBLIST_END_LAST": "إلى الأخير", - "LISTS_GET_SUBLIST_TOOLTIP": "يقوم بإنشاء نسخة من الجزء المحدد من قائمة ما.", - "LISTS_SPLIT_LIST_FROM_TEXT": "إعداد قائمة من النصوص", - "LISTS_SPLIT_TEXT_FROM_LIST": "إعداد نص من القائمة", - "VARIABLES_GET_TOOLTIP": "يرجع قيمة هذا المتغير.", - "VARIABLES_GET_CREATE_SET": "انشئ 'التعيين %1'", - "VARIABLES_SET": "تعيين %1 إلى %2", - "VARIABLES_SET_TOOLTIP": "تعيين هذا المتغير لتكون مساوية للقيمة المدخلة.", - "VARIABLES_SET_CREATE_GET": "انشئ 'احصل على %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "إلى", - "PROCEDURES_DEFNORETURN_PROCEDURE": "القيام بشيء ما", - "PROCEDURES_BEFORE_PARAMS": "مع:", - "PROCEDURES_CALL_BEFORE_PARAMS": "مع:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "انشئ دالة بدون مخرجات .", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "يرجع", - "PROCEDURES_DEFRETURN_TOOLTIP": "انشئ دالة مع المخرجات.", - "PROCEDURES_DEF_DUPLICATE_WARNING": "تحذير: هذه الدالة تحتوي على معلمات مكررة.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "تشغيل الدالة المعرفة من قبل المستخدم '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "تشغيل الدالة المعرفة من قبل المستخدم %1 واستخدام مخرجاتها.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "المدخلات", - "PROCEDURES_MUTATORARG_TITLE": "اسم الإدخال:", - "PROCEDURES_HIGHLIGHT_DEF": "تسليط الضوء على تعريف الدالة", - "PROCEDURES_CREATE_DO": "إنشئ '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "إذا كانت القيمة صحيحة ، اذان قم بارجاع القيمة الثانية.", - "PROCEDURES_IFRETURN_WARNING": "تحذير:هذه القطعة تستخدم فقط داخل تعريف دالة." -} diff --git a/msg/json/az.json b/msg/json/az.json deleted file mode 100644 index 79b1208456..0000000000 --- a/msg/json/az.json +++ /dev/null @@ -1,288 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Cekli829" - ] - }, - "VARIABLES_DEFAULT_NAME": "element", - "DUPLICATE_BLOCK": "Dublikat", - "ADD_COMMENT": "Şərh əlavə et", - "REMOVE_COMMENT": "Şərhi sil", - "EXTERNAL_INPUTS": "Xarici girişlər", - "INLINE_INPUTS": "Sətiriçi girişlər", - "DELETE_BLOCK": "Bloku sil", - "DELETE_X_BLOCKS": "%1 bloku sil", - "COLLAPSE_BLOCK": "Bloku yığ", - "COLLAPSE_ALL": "Blokları yığ", - "EXPAND_BLOCK": "Bloku aç", - "EXPAND_ALL": "Blokları aç", - "DISABLE_BLOCK": "Bloku söndür", - "ENABLE_BLOCK": "Bloku aktivləşdir", - "HELP": "Kömək", - "CHANGE_VALUE_TITLE": "Qiyməti dəyiş:", - "NEW_VARIABLE": "Yeni dəyişən...", - "NEW_VARIABLE_TITLE": "Yeni dəyişənin adı:", - "RENAME_VARIABLE": "Dəyişənin adını dəyiş...", - "RENAME_VARIABLE_TITLE": "Bütün '%1' dəyişənlərinin adını buna dəyiş:", - "COLOUR_PICKER_TOOLTIP": "Palitradan bir rəng seçin.", - "COLOUR_RANDOM_TITLE": "təsadüfi rəng", - "COLOUR_RANDOM_TOOLTIP": "Təsadüfi bir rəng seçin.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "rəngin komponentləri:", - "COLOUR_RGB_RED": "qırmızı", - "COLOUR_RGB_GREEN": "yaşıl", - "COLOUR_RGB_BLUE": "mavi", - "COLOUR_RGB_TOOLTIP": "Qırmızı, yaşıl və mavinin göstərilən miqdarı ilə bir rəng düzəlt. Bütün qiymətlər 0 ilə 100 arasında olmalıdır.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "qarışdır", - "COLOUR_BLEND_COLOUR1": "rəng 1", - "COLOUR_BLEND_COLOUR2": "rəng 2", - "COLOUR_BLEND_RATIO": "nisbət", - "COLOUR_BLEND_TOOLTIP": "İki rəngi verilmiş nisbətdə (0,0 - 1,0) qarışdırır.", - "CONTROLS_REPEAT_TITLE": "%1 dəfə təkrar et", - "CONTROLS_REPEAT_INPUT_DO": "icra et", - "CONTROLS_REPEAT_TOOLTIP": "Bəzi əmrləri bir neçə dəfə yerinə yetir.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "təkrar et, hələ ki", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "təkrar et, ta ki", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Hələ ki, qiymət \"doğru\"dur, bəzi əmrləri yerinə yetir.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Hələ ki, qiymət \"yalan\"dır, bəzi əmrləri yerinə yetir.", - "CONTROLS_FOR_TOOLTIP": "\"%1\" dəyişəni başlanğıc ədəddən son ədədə qədər göstərilən aralıqla qiymətlər aldıqca göstərilən blokları yerinə yetir.", - "CONTROLS_FOR_TITLE": "say: %1 %2 ilə başlayıb, %3 qiymətinə kimi %4 qədər dəyiş", - "CONTROLS_FOREACH_TITLE": "hər element üçün %1 siyahıda %2", - "CONTROLS_FOREACH_TOOLTIP": "Siyahıdakı hər element üçün \"%1\" dəyişənini elementə mənimsət və bundan sonra bəzi əmrləri yerinə yetir.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "dövrdən çıx", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "dövrün növbəti addımından davam et", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Cari dövrdən çıx.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Bu dövrün qalanını ötür və növbəti addımla davam et.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Xəbərdarlıq: Bu blok ancaq dövr daxilində istifadə oluna bilər.", - "CONTROLS_IF_TOOLTIP_1": "Əgər qiymət doğrudursa, onda bəzi əmrləri yerinə yetir.", - "CONTROLS_IF_TOOLTIP_2": "Əgər qiymət doğrudursa, onda birinci əmrlər blokunu yerinə yetir. Əks halda isə ikinci əmrlər blokunu yerinə yetir.", - "CONTROLS_IF_TOOLTIP_3": "Əgər birinci qiymət doğrudursa, onda birinci əmrlər blokunu yerinə yetir. Əks halda əgər ikinci qiymət doğrudursa, onda ikinci əmrlər blokunu yerinə yetir.", - "CONTROLS_IF_TOOLTIP_4": "Əgər birinci qiymət doğrudursa, onda birinci əmrlər blokunu yerinə yetir. Əks halda əgər ikinci qiymət doğrudursa, onda ikinci əmrlər blokunu yerinə yetir. Əgər qiymətlərdən heç biri doğru deyilsə, onda axırıncı əmrlər blokunu yerinə yetir.", - "CONTROLS_IF_MSG_IF": "əgər", - "CONTROLS_IF_MSG_ELSEIF": "əks halda əgər", - "CONTROLS_IF_MSG_ELSE": "əks halda", - "CONTROLS_IF_IF_TOOLTIP": "Bu \"əgər\" blokunu dəyişdirmək üçün bölümlərin yenisini əlavə et, sil və ya yerini dəyiş.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "\"Əgər\" blokuna bir şərt əlavə et.", - "CONTROLS_IF_ELSE_TOOLTIP": "\"Əgər\" blokuna qalan bütün halları əhatə edəb son bir şərt əlavə et.", - "LOGIC_COMPARE_TOOLTIP_EQ": "Girişlər bir birinə bərabərdirsə \"doğru\" cavabını qaytarır.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Girişlər bərabər deyillərsə \"doğru\" cavabını qaytarır.", - "LOGIC_COMPARE_TOOLTIP_LT": "Birinci giriş ikincidən kiçikdirsə \"doğru\" cavabını qaytarır.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Birinci giriş ikincidən kiçik və ya bərarbərdirsə \"doğru\" cavabını qaytarır.", - "LOGIC_COMPARE_TOOLTIP_GT": "Birinci giriş ikincidən böyükdürsə \"doğru\" cavabını qaytarır.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Birinci giriş ikincidən böyük və ya bərarbərdirsə \"doğru\" cavabını qaytarır.", - "LOGIC_OPERATION_TOOLTIP_AND": "Hər iki giriş \"doğru\"-dursa \"doğru\" cavabını qaytarır.", - "LOGIC_OPERATION_AND": "və", - "LOGIC_OPERATION_TOOLTIP_OR": "Girişlərdən heç olmasa biri \"doğru\"-dursa \"doğru\" cavabını qaytarır.", - "LOGIC_OPERATION_OR": "və ya", - "LOGIC_NEGATE_TITLE": "%1 deyil", - "LOGIC_NEGATE_TOOLTIP": "Giriş \"yalan\"-dursa \"doğru\" cavabını qaytarır. Giriş \"doğru\"-dursa \"yalan\" cavabını qaytarır.", - "LOGIC_BOOLEAN_TRUE": "doğru", - "LOGIC_BOOLEAN_FALSE": "yalan", - "LOGIC_BOOLEAN_TOOLTIP": "\"doğru\" və ya \"yalan\" cavanını qaytarır.", - "LOGIC_NULL": "boş", - "LOGIC_NULL_TOOLTIP": "Boş cavab qaytarır.", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "əgər doğrudursa", - "LOGIC_TERNARY_IF_FALSE": "əgər yalandırsa", - "LOGIC_TERNARY_TOOLTIP": "'Yoxla' əmrindəki şərtə nəzər yetirin. Əgər şərt \"doğru\"-dursa \"əgər doğru\", əks halda isə \"əgər yalan\" cavabını qaytarır.", - "MATH_NUMBER_TOOLTIP": "Ədəd.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tg", - "MATH_TRIG_ASIN": "arcsin", - "MATH_TRIG_ACOS": "arccos", - "MATH_TRIG_ATAN": "arctan", - "MATH_ARITHMETIC_HELPURL": "https://az.wikipedia.org/wiki/Hesab", - "MATH_ARITHMETIC_TOOLTIP_ADD": "İki ədədin cəmini qaytarır.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "İki ədədin fərqini qaytarır.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "İki ədədin hasilini verir.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "İki ədədin nisbətini qaytarır.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Birinci ədədin ikinci ədəd dərəcəsindən qüvvətini qaytarır.", - "MATH_SINGLE_OP_ROOT": "kvadrat kök", - "MATH_SINGLE_TOOLTIP_ROOT": "Ədədin kvadrat kökünü qaytarır.", - "MATH_SINGLE_OP_ABSOLUTE": "modul", - "MATH_SINGLE_TOOLTIP_ABS": "Ədədin modulunu qaytarır.", - "MATH_SINGLE_TOOLTIP_NEG": "Ədədin əksini qaytarır.", - "MATH_SINGLE_TOOLTIP_LN": "Ədədin natural loqarifmini tapır.", - "MATH_SINGLE_TOOLTIP_LOG10": "Ədədin 10-cu dərəcədən loqarifmini tapır.", - "MATH_SINGLE_TOOLTIP_EXP": "e sabitinin verilmiş ədədə qüvvətini qaytarır.", - "MATH_SINGLE_TOOLTIP_POW10": "10-un verilmiş ədədə qüvvətini qaytarır.", - "MATH_TRIG_TOOLTIP_SIN": "Dərəcənin sinusunu qaytar (radianın yox).", - "MATH_TRIG_TOOLTIP_COS": "Dərəcənin kosinusunu qaytarır (radianın yox).", - "MATH_TRIG_TOOLTIP_TAN": "Dərəcənin tangensini qaytar (radianın yox).", - "MATH_TRIG_TOOLTIP_ASIN": "Ədədin arcsinusunu qaytarır.", - "MATH_TRIG_TOOLTIP_ACOS": "Ədədin arccosinusunu qaytarır.", - "MATH_TRIG_TOOLTIP_ATAN": "Ədədin arctanqensini qaytarır.", - "MATH_CONSTANT_TOOLTIP": "Ümumi sabitlərdən birini qaytarır π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), və ya ∞ (sonsuzluq).", - "MATH_IS_EVEN": "cütdür", - "MATH_IS_ODD": "təkdir", - "MATH_IS_PRIME": "sadədir", - "MATH_IS_WHOLE": "tamdır", - "MATH_IS_POSITIVE": "müsətdir", - "MATH_IS_NEGATIVE": "mənfidir", - "MATH_IS_DIVISIBLE_BY": "bölünür", - "MATH_IS_TOOLTIP": "Bir ədədin cüt, tək, sadə, tam, müsbət, mənfi olmasını və ya müəyyən bir ədədə bölünməsini yoxlayır. \"Doğru\" və ya \"yalan\" qiymətini qaytarır.", - "MATH_CHANGE_TITLE": "dəyiş: %1 buna: %2", - "MATH_CHANGE_TOOLTIP": "'%1' dəyişəninin üzərinə bir ədəd artır.", - "MATH_ROUND_TOOLTIP": "Ədədi aşağı və ya yuxari yuvarlaqşdır.", - "MATH_ROUND_OPERATOR_ROUND": "yuvarlaqlaşdır", - "MATH_ROUND_OPERATOR_ROUNDUP": "yuxarı yuvarlaqlaşdır", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "aşağı yuvarlaqlaşdır", - "MATH_ONLIST_OPERATOR_SUM": "Siyahının cəmi", - "MATH_ONLIST_TOOLTIP_SUM": "Siyahıdakı bütün ədədlərin cəmini qaytarır.", - "MATH_ONLIST_OPERATOR_MIN": "siyahının minimumu", - "MATH_ONLIST_TOOLTIP_MIN": "Siyahıdaki ən kiçik ədədi qaytarır.", - "MATH_ONLIST_OPERATOR_MAX": "siyahının maksimumu", - "MATH_ONLIST_TOOLTIP_MAX": "Siyahıdaki ən böyük elementi qaytarır.", - "MATH_ONLIST_OPERATOR_AVERAGE": "siyahının ədədi ortası", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Siyahıdaki ədədlərin ədədi ortasını qaytarır.", - "MATH_ONLIST_OPERATOR_MEDIAN": "siyahının medianı", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Siyahının median elementini qaytarır.", - "MATH_ONLIST_OPERATOR_MODE": "Siyahı modları( Ən çox rastlaşılan elementləri)", - "MATH_ONLIST_TOOLTIP_MODE": "Siyahıdaki ən çox rastlanan element(lər)dən ibarət siyahı qaytarır.", - "MATH_ONLIST_OPERATOR_STD_DEV": "Siyahının standart deviasiyası", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Siyahının standart deviasiyasını qaytarır.", - "MATH_ONLIST_OPERATOR_RANDOM": "siyahıdan təsadüfi seçilmiş bir element", - "MATH_ONLIST_TOOLTIP_RANDOM": "Siyahıdan təsadüfi bir element qaytarır.", - "MATH_MODULO_TITLE": "%1 ÷ %2 bölməsinin qalığı", - "MATH_MODULO_TOOLTIP": "İki ədədin nisbətindən alınan qalığı qaytarır.", - "MATH_CONSTRAIN_TITLE": "%1 üçün ən aşağı %2, ən yuxarı %3 olmağı tələb et", - "MATH_CONSTRAIN_TOOLTIP": "Bir ədədin verilmiş iki ədəd arasında olmasını tələb edir (sərhədlər də daxil olmaqla).", - "MATH_RANDOM_INT_TITLE": "%1 ilə %2 arasından təsadüfi tam ədəd", - "MATH_RANDOM_INT_TOOLTIP": "Verilmiş iki ədəd arasından (ədədrlər də daxil olmaqla) təsadüfi bir tam ədəd qaytarır.", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "təsadüfi kəsr", - "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (daxil olmaqla) və 1.0 (daxil olmamaqla) ədədlərinin arasından təsadüfi bir kəsr ədəd qaytarır.", - "TEXT_TEXT_TOOLTIP": "Mətndəki hərf, söz və ya sətir.", - "TEXT_JOIN_TITLE_CREATEWITH": "Verilmişlərlə mətn yarat", - "TEXT_JOIN_TOOLTIP": "İxtiyari sayda elementlərinin birləşməsi ilə mətn parçası yarat.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "birləşdir", - "TEXT_CREATE_JOIN_TOOLTIP": "Bu mətn blokunu yenidən konfigurasiya etmək üçün bölmələri əlavə edin, silin və ya yerlərini dəyişin.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Mətnə bir element əlavə et.", - "TEXT_APPEND_TO": "bu mətnin sonuna:", - "TEXT_APPEND_APPENDTEXT": "bu mətni əlavə et:", - "TEXT_APPEND_TOOLTIP": "'%1' dəyişəninin sonuna nəsə əlavə et.", - "TEXT_LENGTH_TITLE": "%1 - ın uzunluğu", - "TEXT_LENGTH_TOOLTIP": "Verilmiş mətndəki hərflərin(sözlər arası boşluqlar sayılmaqla) sayını qaytarır.", - "TEXT_ISEMPTY_TITLE": "%1 boşdur", - "TEXT_ISEMPTY_TOOLTIP": "Verilmiş mətn boşdursa, doğru qiymətini qaytarır.", - "TEXT_INDEXOF_TOOLTIP": "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, 0 qaytarır.", - "TEXT_INDEXOF_INPUT_INTEXT": "mətndə", - "TEXT_INDEXOF_OPERATOR_FIRST": "Bu mətn ilə ilk rastlaşmanı tap:", - "TEXT_INDEXOF_OPERATOR_LAST": "Bu mətn ilə son rastlaşmanı tap:", - "TEXT_CHARAT_INPUT_INTEXT": "növbəti mətndə", - "TEXT_CHARAT_FROM_START": "bu nömrəli hərfi götür", - "TEXT_CHARAT_FROM_END": "axırdan bu nömrəli hərfi götür", - "TEXT_CHARAT_FIRST": "birinci hərfi götür", - "TEXT_CHARAT_LAST": "axırıncı hərfi götür", - "TEXT_CHARAT_RANDOM": "təsadüfi hərf götür", - "TEXT_CHARAT_TOOLTIP": "Göstərilən mövqedəki hərfi qaytarır.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Mətnin təyin olunmuş hissəsini qaytarır.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "mətndə", - "TEXT_GET_SUBSTRING_START_FROM_START": "Mətnin surətini bu nömrəli hərfdən", - "TEXT_GET_SUBSTRING_START_FROM_END": "Mətnin surətini sondan bu nömrəli # hərfdən", - "TEXT_GET_SUBSTRING_START_FIRST": "Mətnin surətini ilk hərfdən", - "TEXT_GET_SUBSTRING_END_FROM_START": "bu nömrəli hərfə qədər", - "TEXT_GET_SUBSTRING_END_FROM_END": "axırdan bu nömrəli hərfə qədər", - "TEXT_GET_SUBSTRING_END_LAST": "son hərfə qədər", - "TEXT_CHANGECASE_TOOLTIP": "Mətndə hərflərin böyük-kiçikliyini dəyiş.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "BÖYÜK HƏRFLƏRLƏ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "kiçik hərflərlə", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Baş Hərflərlə", - "TEXT_TRIM_TOOLTIP": "Mətnin hər iki və ya yalnız bir tərəfdən olan boşluqları pozulmuş surətini qaytarın.", - "TEXT_TRIM_OPERATOR_BOTH": "Boşluqları hər iki tərəfdən pozun", - "TEXT_TRIM_OPERATOR_LEFT": "Boşluqlari yalnız sol tərəfdən pozun", - "TEXT_TRIM_OPERATOR_RIGHT": "Boşluqları yalnız sağ tərəfdən pozun", - "TEXT_PRINT_TITLE": "%1 - i çap elə", - "TEXT_PRINT_TOOLTIP": "Təyin olunmuş mətn, ədəd və ya hər hansı bir başqa elementi çap elə.", - "TEXT_PROMPT_TYPE_TEXT": "İstifadəçiyə mətn daxil etməsi üçün sorğunu/tələbi ismarıc ilə göndərin", - "TEXT_PROMPT_TYPE_NUMBER": "İstifadəçiyə ədəd daxil etməsi üçün sorğunu/tələbi ismarıc kimi göndərin", - "TEXT_PROMPT_TOOLTIP_NUMBER": "İstifadəçiyə ədəd daxil etməsi üçün sorğu/tələb göndərin.", - "TEXT_PROMPT_TOOLTIP_TEXT": "İstifadəçiyə mətn daxil etməsi üçün sorğu/tələb göndərin.", - "LISTS_CREATE_EMPTY_TITLE": "boş siyahı düzəlt", - "LISTS_CREATE_EMPTY_TOOLTIP": "Heç bir verilən qeyd olunmamış, uzunluğu 0 olan bir siyahı verir", - "LISTS_CREATE_WITH_TOOLTIP": "İstənilən ölçülü siyahı yaradın.", - "LISTS_CREATE_WITH_INPUT_WITH": "bunlardan siyahı düzəlt", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "siyahı", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Bu siyahı blokunu yenidən konfigurasiya etmək üçün bölmələri əlavə edin, silin və ya yerlərini dəyişin.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Siyahıya element əlavə edin.", - "LISTS_REPEAT_TOOLTIP": "Təyin olunmuş elementin/qiymətin təyin olunmuş sayda təkrarlandığı siyahını yaradır.", - "LISTS_REPEAT_TITLE": "%1 elementinin %2 dəfə təkrarlandığı siyahı düzəlt", - "LISTS_LENGTH_TITLE": "%1 siyahısının uzunluğu", - "LISTS_LENGTH_TOOLTIP": "Siyahının uzunluğunu verir.", - "LISTS_ISEMPTY_TITLE": "%1 boşdur", - "LISTS_ISEMPTY_TOOLTIP": "Siyahı boşdursa \"doğru\" cavabını qaytarır.", - "LISTS_INLIST": "siyahıda", - "LISTS_INDEX_OF_FIRST": "Element ilə ilk rastlaşma indeksini müəyyən edin", - "LISTS_INDEX_OF_LAST": "Element ilə son rastlaşma indeksini müəyyən edin", - "LISTS_INDEX_OF_TOOLTIP": "Siyahıda element ilə ilk/son rastlaşma indeksini qaytarır. Əgər tekst siyahıda tapılmazsa, 0 qaytarılır.", - "LISTS_GET_INDEX_GET": "götür", - "LISTS_GET_INDEX_GET_REMOVE": "götür və sil", - "LISTS_GET_INDEX_REMOVE": "yığışdır", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "axırdan # nömrəli", - "LISTS_GET_INDEX_FIRST": "birinci", - "LISTS_GET_INDEX_LAST": "axırıncı", - "LISTS_GET_INDEX_RANDOM": "təsadüfi", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Siyahıdan təyin olunmuş indeksli elementi qaytarır. #1 ilk elementdir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Siyahıdan təyin olunmuş indeksli elementi qaytarır. #1 son elementdir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Siyahının ilk elementini qaytarır.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Siyahının son elementini qaytarır.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Siyahıdan hər hansı təsadüfi elementi qaytarır.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır. #1 ilk elementdir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır. #1 son elementdir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Siyahıdan ilk elementi silir və qaytarır.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Siyahıdan son elementi silir və qaytarır.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Siyahıdan təsadufi elementi silir və qaytarır.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Siyahıdan təyin olunmuş indeksli elementi silir. #1 ilk elementdir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Siyahıdan təyin olunmuş indeksli elementi silir. #1 son elementdir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Siyahıdan ilk elementi silir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Siyahıdan son elementi silir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Siyahıdan təsadüfi bir elementi silir.", - "LISTS_SET_INDEX_SET": "təyin et", - "LISTS_SET_INDEX_INSERT": "daxil et", - "LISTS_SET_INDEX_INPUT_TO": "Kimi", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Siyahının göstərilən yerdəki elementini təyin edir. #1 birinci elementdir.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Siyahının göstərilən yerdəki elementini təyin edir. #1 axırıncı elementdir.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Siyahıda birinci elementi təyin edir.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Siyahının sonuncu elementini təyin edir.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Siyahının təsadüfi seçilmiş bir elementini təyin edir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Elementi siyahıda göstərilən yerə daxil edir. #1 birinci elementdir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Elementi siyahıda göstərilən yerə daxil edir. #1 axırıncı elementdir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Elementi siyahının əvvəlinə daxil edir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Elementi siyahının sonuna artırır.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Elementi siyahıda təsadüfi seçilmiş bir yerə atır.", - "LISTS_GET_SUBLIST_START_FROM_START": "# - dən alt-siyahını alın", - "LISTS_GET_SUBLIST_START_FROM_END": "# sonuncudan alt-siyahını alın", - "LISTS_GET_SUBLIST_START_FIRST": "Birincidən alt-siyahını alın", - "LISTS_GET_SUBLIST_END_FROM_START": "# nömrəliyə", - "LISTS_GET_SUBLIST_END_FROM_END": "sondan # nömrəliyə", - "LISTS_GET_SUBLIST_END_LAST": "Sonuncuya", - "LISTS_GET_SUBLIST_TOOLTIP": "Siyahının təyin olunmuş hissəsinin surətini yaradın.", - "VARIABLES_GET_TOOLTIP": "Bu dəyişənin qiymətini qaytarır.", - "VARIABLES_GET_CREATE_SET": "'%1 - i təyin et' - i yarat", - "VARIABLES_SET": "%1 - i bu qiymət ilə təyin et: %2", - "VARIABLES_SET_TOOLTIP": "Bu dəyişəni daxil edilmiş qiymətə bərabər edir.", - "VARIABLES_SET_CREATE_GET": "'%1 - i götür' - ü yarat", - "PROCEDURES_DEFNORETURN_TITLE": "icra et:", - "PROCEDURES_DEFNORETURN_PROCEDURE": "hansısa əməliyyat", - "PROCEDURES_BEFORE_PARAMS": "ilə:", - "PROCEDURES_CALL_BEFORE_PARAMS": "ilə:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Nəticəsi olmayan funksiya yaradır.", - "PROCEDURES_DEFRETURN_RETURN": "qaytar", - "PROCEDURES_DEFRETURN_TOOLTIP": "Nəticəsi olan funksiya yaradır.", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Xəbərdarlıq: Bu funksiyanın təkrar olunmuş parametrləri var.", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Yaradılmış '%1' funksiyasını çalışdır.", - "PROCEDURES_CALLRETURN_TOOLTIP": "Yaradılmış '%1' funksiyasını çalışdır və nəticəni istifadə et.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "girişlər", - "PROCEDURES_MUTATORARG_TITLE": "Giriş adı:", - "PROCEDURES_HIGHLIGHT_DEF": "Funksiyanın təyinatını vurğula", - "PROCEDURES_CREATE_DO": "'%1' yarat", - "PROCEDURES_IFRETURN_TOOLTIP": "Əgər bir dəyər \"doğru\"-dursa onda ikinci dəyəri qaytar.", - "PROCEDURES_IFRETURN_WARNING": "Xəbərdarlıq: Bu blok ancaq bir funksiyanın təyinatı daxilində işlədilə bilər." -} diff --git a/msg/json/bcc.json b/msg/json/bcc.json deleted file mode 100644 index 2d59f41bcd..0000000000 --- a/msg/json/bcc.json +++ /dev/null @@ -1,295 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Baloch Afghanistan" - ] - }, - "VARIABLES_DEFAULT_NAME": "مورد", - "DUPLICATE_BLOCK": "تکراری", - "ADD_COMMENT": "افزودن نظر", - "REMOVE_COMMENT": "حذف نظر", - "EXTERNAL_INPUTS": "ورودی‌های خارجی", - "INLINE_INPUTS": "ورودی‌های درون خطی", - "DELETE_BLOCK": "حذف بلوک", - "DELETE_X_BLOCKS": "حذف بلوک‌های %1", - "COLLAPSE_BLOCK": "فروپاشی بلوک", - "COLLAPSE_ALL": "فروپاشی بلوک‌ها", - "EXPAND_BLOCK": "گسترش بلوک", - "EXPAND_ALL": "گسترش بلوک‌ها", - "DISABLE_BLOCK": "غیرفعال‌سازی بلوک", - "ENABLE_BLOCK": "فعال‌سازی بلوک", - "HELP": "کومک", - "CHAT": "با همکارتان با نوشتن در این کادر چت کنید!", - "AUTH": "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراک‌گذاری توسط شما داده شود.", - "ME": "من", - "CHANGE_VALUE_TITLE": "تغییر مقدار:", - "NEW_VARIABLE": "متغیر تازه...", - "NEW_VARIABLE_TITLE": "نام متغیر تازه:", - "RENAME_VARIABLE": "تغییر نام متغیر...", - "RENAME_VARIABLE_TITLE": "تغییر نام همهٔ متغیرهای «%1» به:", - "COLOUR_PICKER_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%86%DA%AF", - "COLOUR_PICKER_TOOLTIP": "انتخاب یک رنگ از تخته‌رنگ.", - "COLOUR_RANDOM_TITLE": "رنگ تصادفی", - "COLOUR_RANDOM_TOOLTIP": "انتخاب یک رنگ به شکل تصادفی.", - "COLOUR_RGB_TITLE": "رنگ با", - "COLOUR_RGB_RED": "قرمز", - "COLOUR_RGB_GREEN": "سبز", - "COLOUR_RGB_BLUE": "آبی", - "COLOUR_RGB_TOOLTIP": "ساخت یک رنگ با مقدار مشخص‌شده‌ای از قرمز، سبز و آبی. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند.", - "COLOUR_BLEND_TITLE": "مخلوط", - "COLOUR_BLEND_COLOUR1": "رنگ ۱", - "COLOUR_BLEND_COLOUR2": "رنگ ۲", - "COLOUR_BLEND_RATIO": "نسبت", - "COLOUR_BLEND_TOOLTIP": "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)", - "CONTROLS_REPEAT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AD%D9%84%D9%82%D9%87_%D9%81%D9%88%D8%B1", - "CONTROLS_REPEAT_TITLE": "%1 بار تکرار", - "CONTROLS_REPEAT_INPUT_DO": "انجام", - "CONTROLS_REPEAT_TOOLTIP": "انجام چند عبارت چندین بار.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "تکرار در حالی که", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "تکرار تا", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "تا زمانی که یک مقدار صحیح است، چند عبارت را انجام بده.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "تا زمانی که یک مقدار ناصحیح است، چند عبارت را انجام بده.", - "CONTROLS_FOR_TOOLTIP": "متغیر %1 را در مقادیر شروع‌شده از عدد انتهای به عدد انتهایی را دارد، با فواصل مشخص‌شده می‌شمارد و این بلوک مشخص‌شده را انجام می‌دهد.", - "CONTROLS_FOR_TITLE": "با تعداد %1 از %2 به %3 با گام‌های %4", - "CONTROLS_FOREACH_TITLE": "برای هر مورد %1 در فهرست %2", - "CONTROLS_FOREACH_TOOLTIP": "برای هر مورد در این فهرست، تنظیم متغیر «%1» به مورد و انجام تعدادی عبارت.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "شکستن حلقه", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ادامه با تکرار بعدی حلقه", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "شکستن حلقهٔ شامل.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "پریدن از بقیهٔ حلقه و ادامه با تکرار بعدی.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "اخطار: این بلوک ممکن است فقط داخل یک حلقه استفاده شود.", - "CONTROLS_IF_TOOLTIP_1": "اگر یک مقدار صحیح است، سپس چند عبارت را انجام بده.", - "CONTROLS_IF_TOOLTIP_2": "اگر یک مقدار صحیح است، اول بلوک اول عبارات را انجام بده. در غیر این صورت بلوک دوم عبارات انجام بده.", - "CONTROLS_IF_TOOLTIP_3": "اگر مقدار اول صحیح بود، از آن بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم صحیح است، بلوک دوم عبارات را انجام بده.", - "CONTROLS_IF_TOOLTIP_4": "اگر مقدار اول درست است، بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم درست باشد بلوک دوم عبارات را انجام بده. اگر هیچ از مقادیر درست نبود، آخرین بلوک عبارات را انجام بده.", - "CONTROLS_IF_MSG_IF": "اگر", - "CONTROLS_IF_MSG_ELSEIF": "اگر آنگاه", - "CONTROLS_IF_MSG_ELSE": "آنگاه", - "CONTROLS_IF_IF_TOOLTIP": "اضافه، حذف یا ترتیب‌سازی قسمت‌ها برای تنظیم مجدد این بلوک اگر مسدود است.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "افزودن یک شرط به بلوک اگر.", - "CONTROLS_IF_ELSE_TOOLTIP": "اضافه‌کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر.", - "LOGIC_COMPARE_HELPURL": "https://fa.wikipedia.org/wiki/%D9%86%D8%A7%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1%DB%8C", - "LOGIC_COMPARE_TOOLTIP_EQ": "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "برگرداندن صحیح اگر هر دو ورودی با یکدیگر برابر نباشند.", - "LOGIC_COMPARE_TOOLTIP_LT": "بازگرداندن صحیح اگر ورودی اول کوچکتر از ورودی دوم باشد.", - "LOGIC_COMPARE_TOOLTIP_LTE": "بازگرداندن صحیح اگر ورودی اول کوچکتر یا مساوی با ورودی دوم باشد.", - "LOGIC_COMPARE_TOOLTIP_GT": "بازگرداندن صحیح اگر ورودی اول بزرگتر از ورودی دوم باشد.", - "LOGIC_COMPARE_TOOLTIP_GTE": "بازگرداندن صحیح اگر ورودی اول بزرگتر یا مساوی یا ورودی دوم باشد.", - "LOGIC_OPERATION_TOOLTIP_AND": "بازگرداندن صحیح اگر هر دو ورودی صحیح باشد.", - "LOGIC_OPERATION_AND": "و", - "LOGIC_OPERATION_TOOLTIP_OR": "بازگرداندن صحیح اگر یکی از دو ورودی صحیح باشد.", - "LOGIC_OPERATION_OR": "یا", - "LOGIC_NEGATE_TITLE": "نه %1", - "LOGIC_NEGATE_TOOLTIP": "صجیج باز می‌گرداند اگر ورودی نا صحیح باشند. ناصحیح بازمی‌گرداند اگر ورودی صحیح باشد.", - "LOGIC_BOOLEAN_TRUE": "صحیح", - "LOGIC_BOOLEAN_FALSE": "ناصحیح", - "LOGIC_BOOLEAN_TOOLTIP": "بازگرداندن یکی از صحیح یا ناصحیح.", - "LOGIC_NULL": "تهی", - "LOGIC_NULL_TOOLTIP": "تهی بازمی‌گرداند.", - "LOGIC_TERNARY_CONDITION": "آزمایش", - "LOGIC_TERNARY_IF_TRUE": "اگر صحیح", - "LOGIC_TERNARY_IF_FALSE": "اگر ناصحیح", - "LOGIC_TERNARY_TOOLTIP": "بررسی وضعیت در «آزمایش». اگر وضعیت صحیح باشد، مقدار «اگر صحیح» را بر می‌گرداند در غیر اینصورت مقدار «اگر ناصحیح» را.", - "MATH_NUMBER_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF", - "MATH_NUMBER_TOOLTIP": "یک عدد.", - "MATH_ARITHMETIC_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AD%D8%B3%D8%A7%D8%A8", - "MATH_ARITHMETIC_TOOLTIP_ADD": "بازگرداندن مقدار جمع دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "بازگرداندن تفاوت دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "بازگرداندن حاصلضرب دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "بازگرداندن باقی‌ماندهٔ دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد.", - "MATH_SINGLE_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%DB%8C%D8%B4%D9%87_%D8%AF%D9%88%D9%85", - "MATH_SINGLE_OP_ROOT": "ریشهٔ دوم", - "MATH_SINGLE_TOOLTIP_ROOT": "ریشهٔ دوم یک عدد را باز می‌گرداند.", - "MATH_SINGLE_OP_ABSOLUTE": "مطلق", - "MATH_SINGLE_TOOLTIP_ABS": "قدر مطلق یک عدد را بازمی‌گرداند.", - "MATH_SINGLE_TOOLTIP_NEG": "منفی‌شدهٔ یک عدد را باز می‌گرداند.", - "MATH_SINGLE_TOOLTIP_LN": "لوگاریتم طبیعی یک عدد را باز می‌گرداند.", - "MATH_SINGLE_TOOLTIP_LOG10": "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد.", - "MATH_SINGLE_TOOLTIP_EXP": "بازگرداندن توان e یک عدد.", - "MATH_SINGLE_TOOLTIP_POW10": "بازگرداندن توان ۱۰ یک عدد.", - "MATH_TRIG_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AA%D8%A7%D8%A8%D8%B9%E2%80%8C%D9%87%D8%A7%DB%8C_%D9%85%D8%AB%D9%84%D8%AB%D8%A7%D8%AA%DB%8C", - "MATH_TRIG_TOOLTIP_SIN": "بازگرداندن سینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_COS": "بازگرداندن کسینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_TAN": "بازگرداندن تانژانت یک درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_ASIN": "بازگرداندن آرک‌سینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_ACOS": "بازگرداندن آرک‌کسینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_ATAN": "بازگرداندن آرک‌تانژانت درجه (نه رادیان).", - "MATH_CONSTANT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AB%D8%A7%D8%A8%D8%AA_%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C", - "MATH_CONSTANT_TOOLTIP": "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت).", - "MATH_IS_EVEN": "زوج است", - "MATH_IS_ODD": "فرد است", - "MATH_IS_PRIME": "عدد اول است", - "MATH_IS_WHOLE": "کامل است", - "MATH_IS_POSITIVE": "مثبت است", - "MATH_IS_NEGATIVE": "منفی است", - "MATH_IS_DIVISIBLE_BY": "تقسیم شده بر", - "MATH_IS_TOOLTIP": "بررسی می‌کند که آیا یک عدد زوج، فرد، اول، کامل، مثبت، منفی یا بخش‌پذیر عدد خاصی باشد را بررسی می‌کند. درست یا نادرست باز می‌گرداند.", - "MATH_CHANGE_HELPURL": "https://fa.wikipedia.org/wiki/%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C#.D8.A7.D9.81.D8.B2.D8.A7.DB.8C.D8.B4_.D8.B4.D9.85.D8.A7.D8.B1.D9.86.D8.AF.D9.87", - "MATH_CHANGE_TITLE": "تغییر %1 با %2", - "MATH_CHANGE_TOOLTIP": "افزودن یک عدد به متغیر '%1'.", - "MATH_ROUND_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", - "MATH_ROUND_TOOLTIP": "گردکردن یک عدد به بالا یا پایین.", - "MATH_ROUND_OPERATOR_ROUND": "گردکردن", - "MATH_ROUND_OPERATOR_ROUNDUP": "گرد به بالا", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "گرد به پایین", - "MATH_ONLIST_OPERATOR_SUM": "جمع فهرست", - "MATH_ONLIST_TOOLTIP_SUM": "جمع همهٔ عددهای فهرست را باز می‌گرداند.", - "MATH_ONLIST_OPERATOR_MIN": "کوچکترین فهرست", - "MATH_ONLIST_TOOLTIP_MIN": "کوچک‌ترین عدد در فهرست را باز می‌گرداند.", - "MATH_ONLIST_OPERATOR_MAX": "بزرگ‌ترین فهرست", - "MATH_ONLIST_TOOLTIP_MAX": "بزرگ‌ترین عدد در فهرست را باز می‌گرداند.", - "MATH_ONLIST_OPERATOR_AVERAGE": "میانگین فهرست", - "MATH_ONLIST_TOOLTIP_AVERAGE": "میانگین (میانگین ریاضی) مقادیر عددی فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_MEDIAN": "میانهٔ فهرست", - "MATH_ONLIST_TOOLTIP_MEDIAN": "میانهٔ عدد در فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_MODE": "مد فهرست", - "MATH_ONLIST_TOOLTIP_MODE": "شایع‌ترین قلم(های) در فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_STD_DEV": "انحراف معیار فهرست", - "MATH_ONLIST_TOOLTIP_STD_DEV": "انحراف معیار فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_RANDOM": "مورد تصادفی از فهرست", - "MATH_ONLIST_TOOLTIP_RANDOM": "موردی تصادفی از فهرست را بر می‌گرداند.", - "MATH_MODULO_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA_%D9%BE%DB%8C%D9%85%D8%A7%D9%86%D9%87", - "MATH_MODULO_TITLE": "باقی‌ماندهٔ %1 + %2", - "MATH_MODULO_TOOLTIP": "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند.", - "MATH_CONSTRAIN_TITLE": "محدودکردن %1 پایین %2 بالا %3", - "MATH_CONSTRAIN_TOOLTIP": "محدودکردن یک عدد بین محدودیت‌های مشخص‌شده (بسته).", - "MATH_RANDOM_INT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF_%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C", - "MATH_RANDOM_INT_TITLE": "عدد صحیح تصادفی بین %1 تا %2", - "MATH_RANDOM_INT_TOOLTIP": "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند.", - "MATH_RANDOM_FLOAT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF_%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "کسر تصادفی", - "MATH_RANDOM_FLOAT_TOOLTIP": "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز).", - "TEXT_TEXT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D8%B4%D8%AA%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", - "TEXT_TEXT_TOOLTIP": "یک حرف، کلمه یا خطی از متن.", - "TEXT_JOIN_TITLE_CREATEWITH": "ایجاد متن با", - "TEXT_JOIN_TOOLTIP": "یک تکه‌ای از متن را با چسپاندن همهٔ تعداد از موارد ایجاد می‌کند.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "عضویت", - "TEXT_CREATE_JOIN_TOOLTIP": "اضافه، حذف یا ترتیب‌سازی قسمت‌ها برای تنظیم مجدد این بلوک اگر مسدود است.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "افزودن یک مورد به متن.", - "TEXT_APPEND_TO": "به", - "TEXT_APPEND_APPENDTEXT": "الحاق متن", - "TEXT_APPEND_TOOLTIP": "الحاق متنی به متغیر «%1».", - "TEXT_LENGTH_TITLE": "طول %1", - "TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده.", - "TEXT_ISEMPTY_TITLE": "%1 خالی است", - "TEXT_ISEMPTY_TOOLTIP": "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است.", - "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد ۰ باز می‌گرداند.", - "TEXT_INDEXOF_INPUT_INTEXT": "در متن", - "TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب", - "TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب", - "TEXT_CHARAT_INPUT_INTEXT": "در متن", - "TEXT_CHARAT_FROM_START": "گرفتن حرف #", - "TEXT_CHARAT_FROM_END": "گرفتن حرف # از آخر", - "TEXT_CHARAT_FIRST": "گرفتن اولین حرف", - "TEXT_CHARAT_LAST": "گرفتن آخرین حرف", - "TEXT_CHARAT_RANDOM": "گرفتن حرف تصادفی", - "TEXT_CHARAT_TOOLTIP": "حرفی در موقعیت مشخص‌شده بر می‌گرداند.", - "TEXT_GET_SUBSTRING_TOOLTIP": "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "در متن", - "TEXT_GET_SUBSTRING_START_FROM_START": "گرفتن زیرمتن از حرف #", - "TEXT_GET_SUBSTRING_START_FROM_END": "گرفتن زیرمتن از حرف # به انتها", - "TEXT_GET_SUBSTRING_START_FIRST": "گرفتن زیرمتن از اولین حرف", - "TEXT_GET_SUBSTRING_END_FROM_START": "به حرف #", - "TEXT_GET_SUBSTRING_END_FROM_END": "به حرف # از انتها", - "TEXT_GET_SUBSTRING_END_LAST": "گرفتن آخرین حرف", - "TEXT_CHANGECASE_TOOLTIP": "بازگرداندن کپی متن در حالتی متفاوت.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "به حروف بزرگ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "به حروف کوچک", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "به حروف بزرگ عنوان", - "TEXT_TRIM_TOOLTIP": "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند.", - "TEXT_TRIM_OPERATOR_BOTH": "تراشیدن فاصله‌ها از هر دو طرف", - "TEXT_TRIM_OPERATOR_LEFT": "تراشیدن فاصله‌ها از طرف چپ", - "TEXT_TRIM_OPERATOR_RIGHT": "تراشیدن فاصله‌ها از طرف چپ", - "TEXT_PRINT_TITLE": "چاپ %1", - "TEXT_PRINT_TOOLTIP": "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده.", - "TEXT_PROMPT_TYPE_TEXT": "اعلان برای متن با پیام", - "TEXT_PROMPT_TYPE_NUMBER": "اعلان برای عدد با پیام", - "TEXT_PROMPT_TOOLTIP_NUMBER": "اعلان برای کاربر با یک عدد.", - "TEXT_PROMPT_TOOLTIP_TEXT": "اعلان برای کاربر برای یک متن.", - "LISTS_CREATE_EMPTY_TITLE": "ایجاد فهرست خالی", - "LISTS_CREATE_EMPTY_TOOLTIP": "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند.", - "LISTS_CREATE_WITH_TOOLTIP": "فهرستی از هر عددی از موارد می‌سازد.", - "LISTS_CREATE_WITH_INPUT_WITH": "ایجاد فهرست با", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "فهرست", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "اضافه‌کردن، حذف‌کردن یا ترتیب‌سازی مجدد بخش‌ها این بلوک فهرستی.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "اضافه‌کردن یک مورد به فهرست.", - "LISTS_REPEAT_TOOLTIP": "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد.", - "LISTS_REPEAT_TITLE": "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد", - "LISTS_LENGTH_TITLE": "طول %1", - "LISTS_LENGTH_TOOLTIP": "طول یک فهرست را برمی‌گرداند.", - "LISTS_ISEMPTY_TITLE": "%1 خالی است", - "LISTS_ISEMPTY_TOOLTIP": "اگر فهرست خالی است مقدار صجیج بر می‌گرداند.", - "LISTS_INLIST": "در فهرست", - "LISTS_INDEX_OF_FIRST": "آخرین رخداد متن را بیاب", - "LISTS_INDEX_OF_LAST": "یافتن آخرین رخ‌داد مورد", - "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. ۰ بر می‌گرداند اگر متن موجود نبود.", - "LISTS_GET_INDEX_GET": "گرفتن", - "LISTS_GET_INDEX_GET_REMOVE": "گرفتن و حذف‌کردن", - "LISTS_GET_INDEX_REMOVE": "حذف‌کردن", - "LISTS_GET_INDEX_FROM_END": "# از انتها", - "LISTS_GET_INDEX_FIRST": "اولین", - "LISTS_GET_INDEX_LAST": "اهرین", - "LISTS_GET_INDEX_RANDOM": "تصادفی", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "موردی در محل مشخص‌شده بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "موردی در محل مشخص در فهرست بر می‌گرداند. #1 آخرین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "اولین مورد یک فهرست را بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "آخرین مورد در یک فهرست را بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "یک مورد تصادفی در یک فهرست بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "اولین مورد را در یک فهرست حذف می‌کند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "آخرین مورد را در یک فهرست حذف می‌کند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "یک مورد تصادفی را یک فهرست حذف می‌کند.", - "LISTS_SET_INDEX_SET": "مجموعه", - "LISTS_SET_INDEX_INSERT": "درج در", - "LISTS_SET_INDEX_INPUT_TO": "به‌عنوان", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 آخرین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "اولین مورد در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "آخرین مورد در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "یک مورد تصادفی در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 آخرین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "موردی به ته فهرست اضافه می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "موردی به ته فهرست الحاق می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "مورد را به صورت تصادفی در یک فهرست می‌افزاید.", - "LISTS_GET_SUBLIST_START_FROM_START": "گرفتن زیرمجموعه‌ای از #", - "LISTS_GET_SUBLIST_START_FROM_END": "گرفتن زیرمجموعه‌ای از # از انتها", - "LISTS_GET_SUBLIST_START_FIRST": "گرفتن زیرمجموعه‌ای از ابتدا", - "LISTS_GET_SUBLIST_END_FROM_START": "به #", - "LISTS_GET_SUBLIST_END_FROM_END": "به # از انتها", - "LISTS_GET_SUBLIST_END_LAST": "به آخرین", - "LISTS_GET_SUBLIST_TOOLTIP": "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند.", - "VARIABLES_GET_TOOLTIP": "مقدار این متغیر را بر می‌گرداند.", - "VARIABLES_GET_CREATE_SET": "درست‌کردن «تنظیم %1»", - "VARIABLES_SET": "مجموعه %1 به %2", - "VARIABLES_SET_TOOLTIP": "متغیر برابر با خروجی را مشخص می‌کند.", - "VARIABLES_SET_CREATE_GET": "درست‌کردن «تنظیم %1»", - "PROCEDURES_DEFNORETURN_TITLE": "به", - "PROCEDURES_DEFNORETURN_PROCEDURE": "انجام چیزی", - "PROCEDURES_BEFORE_PARAMS": "با:", - "PROCEDURES_CALL_BEFORE_PARAMS": "با:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "تابعی می‌سازد بدون هیچ خروجی.", - "PROCEDURES_DEFRETURN_RETURN": "بازگشت", - "PROCEDURES_DEFRETURN_TOOLTIP": "تابعی با یک خروجی می‌سازد.", - "PROCEDURES_ALLOW_STATEMENTS": "اجازه اظهارات", - "PROCEDURES_DEF_DUPLICATE_WARNING": "اخطار: این تابعی پارامتر تکراری دارد.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1».", - "PROCEDURES_CALLRETURN_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "ورودی‌ها", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع.", - "PROCEDURES_MUTATORARG_TITLE": "نام ورودی:", - "PROCEDURES_MUTATORARG_TOOLTIP": "اضافه کردن ورودی به تابع.", - "PROCEDURES_HIGHLIGHT_DEF": "برجسته‌سازی تعریف تابع", - "PROCEDURES_CREATE_DO": "ساختن «%1»", - "PROCEDURES_IFRETURN_TOOLTIP": "اگر یک مقدار صحیح است، مقدار دوم را برگردان.", - "PROCEDURES_IFRETURN_WARNING": "اخطار: این بلوک احتمالاً فقط داخل یک تابع استفاده می‌شود." -} diff --git a/msg/json/be-tarask.json b/msg/json/be-tarask.json deleted file mode 100644 index dd94e0c0d3..0000000000 --- a/msg/json/be-tarask.json +++ /dev/null @@ -1,305 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Renessaince", - "Jim-by", - "Red Winged Duck" - ] - }, - "VARIABLES_DEFAULT_NAME": "аб’ект", - "TODAY": "Сёньня", - "DUPLICATE_BLOCK": "Капіяваць", - "ADD_COMMENT": "Дадаць камэнтар", - "REMOVE_COMMENT": "Выдаліць камэнтар", - "EXTERNAL_INPUTS": "Зьнешнія ўваходы", - "INLINE_INPUTS": "Унутраныя ўваходы", - "DELETE_BLOCK": "Выдаліць блёк", - "DELETE_X_BLOCKS": "Выдаліць %1 блёкі", - "DELETE_ALL_BLOCKS": "Выдаліць усе блёкі %1?", - "CLEAN_UP": "Ачысьціць блёкі", - "COLLAPSE_BLOCK": "Згарнуць блёк", - "COLLAPSE_ALL": "Згарнуць блёкі", - "EXPAND_BLOCK": "Разгарнуць блёк", - "EXPAND_ALL": "Разгарнуць блёкі", - "DISABLE_BLOCK": "Адключыць блёк", - "ENABLE_BLOCK": "Уключыць блёк", - "HELP": "Дапамога", - "CHAT": "Стасуйцеся са сваім калегам, набіраючы тэкст у гэтым полі!", - "AUTH": "Калі ласка, аўтарызуйце гэтае прыкладаньне, каб можна было захоўваць Вашую працу і мець магчымасьць дзяліцца ёю.", - "ME": "Я", - "CHANGE_VALUE_TITLE": "Зьмяніць значэньне:", - "NEW_VARIABLE": "Новая зьменная…", - "NEW_VARIABLE_TITLE": "Імя новай зьменнай:", - "RENAME_VARIABLE": "Перайменаваць зьменную…", - "RENAME_VARIABLE_TITLE": "Перайменаваць усе назвы зьменных '%1' на:", - "COLOUR_PICKER_HELPURL": "https://be-x-old.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D0%B5%D1%80", - "COLOUR_PICKER_TOOLTIP": "Абярыце колер з палітры.", - "COLOUR_RANDOM_TITLE": "выпадковы колер", - "COLOUR_RANDOM_TOOLTIP": "Абраць выпадковы колер.", - "COLOUR_RGB_TITLE": "колер з", - "COLOUR_RGB_RED": "чырвонага", - "COLOUR_RGB_GREEN": "зялёнага", - "COLOUR_RGB_BLUE": "сіняга", - "COLOUR_RGB_TOOLTIP": "Стварыць колер з абранымі прапорцыямі чырвонага, зялёнага і сіняга. Усе значэньні павінны быць ад 0 да 100.", - "COLOUR_BLEND_TITLE": "зьмяшаць", - "COLOUR_BLEND_COLOUR1": "колер 1", - "COLOUR_BLEND_COLOUR2": "колер 2", - "COLOUR_BLEND_RATIO": "дзеля", - "COLOUR_BLEND_TOOLTIP": "Зьмешвае два колеры ў дадзенай прапорцыі (0.0 — 1.0)", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "паўтарыць %1 раз(ы)", - "CONTROLS_REPEAT_INPUT_DO": "выканаць", - "CONTROLS_REPEAT_TOOLTIP": "Выконвае апэрацыі некалькі разоў.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "паўтараць, пакуль", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "паўтараць, пакуль не", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Пакуль значэньне ісьціна, выконваць пэўныя апэрацыі.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Пакуль значэньне хлусьня, выконваць пэўныя апэрацыі.", - "CONTROLS_FOR_TOOLTIP": "Прысвойвае зьменнай \"%1\" значэньні ад пачатковага да канчатковага значэньня, улічваючы зададзены крок, і выконвае абраныя блёкі.", - "CONTROLS_FOR_TITLE": "лічыць з %1 ад %2 да %3 па %4", - "CONTROLS_FOREACH_TITLE": "для кожнага элемэнта %1 у сьпісе %2", - "CONTROLS_FOREACH_TOOLTIP": "Для кожнага элемэнту сьпісу прысвойвае зьменнай '%1' ягонае значэньне і выконвае пэўныя апэрацыі.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "перарваць цыкль", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "працягнуць з наступнага кроку цыклю", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Спыніць гэты цыкль.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Прапусьціць рэшту цыклю і перайсьці да наступнага кроку.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Увага: гэты блёк можа быць выкарыстаны толькі ў цыклі.", - "CONTROLS_IF_TOOLTIP_1": "Калі значэньне ісьціна, выканаць пэўныя апэрацыі.", - "CONTROLS_IF_TOOLTIP_2": "Калі значэньне ісьціна, выканаць першы блёк апэрацыяў, інакш выканаць другі блёк.", - "CONTROLS_IF_TOOLTIP_3": "Калі першае значэньне ісьціна, выканаць першы блёк апэрацыяў. Інакш, калі другое значэньне ісьціна, выканаць другі блёк апэрацыяў.", - "CONTROLS_IF_TOOLTIP_4": "Калі першае значэньне ісьціна, выканаць першы блёк апэрацыяў. Інакш, калі другое значэньне ісьціна, выканаць другі блёк апэрацыяў. Калі ніводнае з значэньняў не сапраўднае, выканаць апошні блёк апэрацыяў.", - "CONTROLS_IF_MSG_IF": "калі", - "CONTROLS_IF_MSG_ELSEIF": "інакш, калі", - "CONTROLS_IF_MSG_ELSE": "інакш", - "CONTROLS_IF_IF_TOOLTIP": "Дадаць, выдаліць ці пераставіць сэкцыі для пераканфігураваньня гэтага блёку «калі».", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Дадаць умову да блёку «калі».", - "CONTROLS_IF_ELSE_TOOLTIP": "Дадаць заключную ўмову для ўсіх астатніх варыянтаў блёку «калі».", - "LOGIC_COMPARE_HELPURL": "https://be-x-old.wikipedia.org/wiki/%D0%9D%D1%8F%D1%80%D0%BE%D1%9E%D0%BD%D0%B0%D1%81%D1%8C%D1%86%D1%8C", - "LOGIC_COMPARE_TOOLTIP_EQ": "Вяртае «ісьціна», калі абодва ўводы роўныя.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Вяртае «ісьціна», калі абодва ўводы ня роўныя.", - "LOGIC_COMPARE_TOOLTIP_LT": "Вяртае «ісьціна», калі першы ўвод меншы за другі.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Вяртае «ісьціна», калі першы ўвод меншы ці роўны другому.", - "LOGIC_COMPARE_TOOLTIP_GT": "Вяртае «ісьціна», калі першы ўвод большы за другі.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Вяртае «ісьціна», калі першы ўвод большы ці роўны другому.", - "LOGIC_OPERATION_TOOLTIP_AND": "Вяртае «ісьціна», калі абодва ўводы праўдзівыя.", - "LOGIC_OPERATION_AND": "і", - "LOGIC_OPERATION_TOOLTIP_OR": "Вяртае «ісьціна», калі прынамсі адзін з уводаў праўдзівы.", - "LOGIC_OPERATION_OR": "ці", - "LOGIC_NEGATE_TITLE": "не %1", - "LOGIC_NEGATE_TOOLTIP": "Вяртае «ісьціна», калі ўвод непраўдзівы. Вяртае «хлусьня», калі ўвод праўдзівы.", - "LOGIC_BOOLEAN_TRUE": "ісьціна", - "LOGIC_BOOLEAN_FALSE": "хлусьня", - "LOGIC_BOOLEAN_TOOLTIP": "Вяртае «ісьціна» ці «хлусьня».", - "LOGIC_NULL": "нічога", - "LOGIC_NULL_TOOLTIP": "Вяртае нічога.", - "LOGIC_TERNARY_CONDITION": "тэст", - "LOGIC_TERNARY_IF_TRUE": "калі ісьціна", - "LOGIC_TERNARY_IF_FALSE": "калі хлусьня", - "LOGIC_TERNARY_TOOLTIP": "Праверыць умову ў 'тэст'. Калі ўмова праўдзівая, будзе вернутае значэньне «калі ісьціна»; інакш будзе вернутае «калі хлусьня».", - "MATH_NUMBER_HELPURL": "https://be-x-old.wikipedia.org/wiki/%D0%9B%D1%96%D0%BA", - "MATH_NUMBER_TOOLTIP": "Лік.", - "MATH_ARITHMETIC_HELPURL": "https://be-x-old.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%82%D0%BC%D1%8D%D1%82%D1%8B%D0%BA%D0%B0", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Вяртае суму двух лікаў.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Вяртае рознасьць двух лікаў.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Вяртае здабытак двух лікаў.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Вяртае дзель двух лікаў.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Вяртае першы лік у ступені другога ліку.", - "MATH_SINGLE_HELPURL": "https://be-x-old.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D1%8B_%D0%BA%D0%BE%D1%80%D0%B0%D0%BD%D1%8C", - "MATH_SINGLE_OP_ROOT": "квадратны корань", - "MATH_SINGLE_TOOLTIP_ROOT": "Вяртае квадратны корань ліку.", - "MATH_SINGLE_OP_ABSOLUTE": "модуль", - "MATH_SINGLE_TOOLTIP_ABS": "Вяртае модуль ліку.", - "MATH_SINGLE_TOOLTIP_NEG": "Вяртае супрацьлеглы лік.", - "MATH_SINGLE_TOOLTIP_LN": "Вяртае натуральны лягарытм ліку.", - "MATH_SINGLE_TOOLTIP_LOG10": "Вяртае дзесятковы лягарытм ліку.", - "MATH_SINGLE_TOOLTIP_EXP": "Вяртае e ў ступені ліку.", - "MATH_SINGLE_TOOLTIP_POW10": "Вяртае 10 у ступені ліку.", - "MATH_TRIG_HELPURL": "https://be-x-old.wikipedia.org/wiki/%D0%A2%D1%80%D1%8B%D0%B3%D0%B0%D0%BD%D0%B0%D0%BC%D1%8D%D1%82%D1%80%D1%8B%D1%8F#.D0.A2.D1.80.D1.8B.D0.B3.D0.B0.D0.BD.D0.B0.D0.BC.D1.8D.D1.82.D1.80.D1.8B.D1.87.D0.BD.D1.8B.D1.8F_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.8B.D1.96", - "MATH_TRIG_TOOLTIP_SIN": "Вяртае сынус кута ў градусах.", - "MATH_TRIG_TOOLTIP_COS": "Вяртае косынус кута ў градусах.", - "MATH_TRIG_TOOLTIP_TAN": "Вяртае тангэнс кута ў градусах.", - "MATH_TRIG_TOOLTIP_ASIN": "Вяртае арксынус ліку.", - "MATH_TRIG_TOOLTIP_ACOS": "Вяртае арккосынус ліку.", - "MATH_TRIG_TOOLTIP_ATAN": "Вяртае арктангэнс ліку.", - "MATH_CONSTANT_HELPURL": "https://be-x-old.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%8D%D0%BC%D0%B0%D1%82%D1%8B%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D0%B0%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D0%B0", - "MATH_CONSTANT_TOOLTIP": "Вяртае адну з агульных канстантаў: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0,707...) або ∞ (бясконцасьць).", - "MATH_IS_EVEN": "парная", - "MATH_IS_ODD": "няпарная", - "MATH_IS_PRIME": "простая", - "MATH_IS_WHOLE": "цэлая", - "MATH_IS_POSITIVE": "станоўчая", - "MATH_IS_NEGATIVE": "адмоўная", - "MATH_IS_DIVISIBLE_BY": "дзяліць на", - "MATH_IS_TOOLTIP": "Правярае, ці зьяўляецца лік парным, няпарным, простым, станоўчым, адмоўным, ці ён дзеліцца на пэўны лік без астатку. Вяртае значэньне ісьціна або няпраўда.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "зьмяніць %1 на %2", - "MATH_CHANGE_TOOLTIP": "Дадае лічбу да зьменнай '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Акругленьне ліку да большага ці меншага.", - "MATH_ROUND_OPERATOR_ROUND": "акругліць", - "MATH_ROUND_OPERATOR_ROUNDUP": "акругліць да большага", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "акругліць да меншага", - "MATH_ONLIST_OPERATOR_SUM": "Сума сьпісу", - "MATH_ONLIST_TOOLTIP_SUM": "Вяртае суму ўсіх лікаў у сьпісе.", - "MATH_ONLIST_OPERATOR_MIN": "мінімальная ў сьпісе", - "MATH_ONLIST_TOOLTIP_MIN": "Вяртае найменшы лік у сьпісе.", - "MATH_ONLIST_OPERATOR_MAX": "мінімальная ў сьпісе", - "MATH_ONLIST_TOOLTIP_MAX": "Вяртае найменшы лік у сьпісе.", - "MATH_ONLIST_OPERATOR_AVERAGE": "сярэдняя ў сьпісе", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Вяртае сярэднеарытмэтычнае значэньне лікавых значэньняў у сьпісе.", - "MATH_ONLIST_OPERATOR_MEDIAN": "мэдыяна сьпісу", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Вяртае мэдыяну сьпісу.", - "MATH_ONLIST_OPERATOR_MODE": "рэжымы сьпісу", - "MATH_ONLIST_TOOLTIP_MODE": "Вяртае сьпіс самых распаўсюджаных элемэнтаў у сьпісе.", - "MATH_ONLIST_OPERATOR_STD_DEV": "стандартнае адхіленьне сьпісу", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Вяртае стандартнае адхіленьне сьпісу.", - "MATH_ONLIST_OPERATOR_RANDOM": "выпадковы элемэнт сьпісу", - "MATH_ONLIST_TOOLTIP_RANDOM": "Вяртае выпадковы элемэнт сьпісу.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "рэшта дзяленьня %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Вяртае рэшту дзяленьня двух лікаў.", - "MATH_CONSTRAIN_TITLE": "абмежаваць %1 зьнізу %2 зьверху %3", - "MATH_CONSTRAIN_TOOLTIP": "Абмяжоўвае колькасьць ніжняй і верхняй межамі (уключна).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "выпадковая цэлая з %1 для %2", - "MATH_RANDOM_INT_TOOLTIP": "Вяртае выпадковы цэлы лік паміж двума зададзенымі абмежаваньнямі ўключна.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "выпадковая дроб", - "MATH_RANDOM_FLOAT_TOOLTIP": "Вяртае выпадковую дроб у дыяпазоне ад 0,0 (уключна) да 1,0.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Літара, слова ці радок тэксту.", - "TEXT_JOIN_TITLE_CREATEWITH": "стварыць тэкст з", - "TEXT_JOIN_TOOLTIP": "Стварае фрагмэнт тэксту аб’яднаньнем любой колькасьці элемэнтаў.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "далучыць", - "TEXT_CREATE_JOIN_TOOLTIP": "Дадайце, выдаліце ці зьмяніце парадак разьдзелаў для перадачы тэкставага блёку.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Дадаць элемэнт да тэксту.", - "TEXT_APPEND_TO": "да", - "TEXT_APPEND_APPENDTEXT": "дадаць тэкст", - "TEXT_APPEND_TOOLTIP": "Дадаць які-небудзь тэкст да зьменнай '%1'.", - "TEXT_LENGTH_TITLE": "даўжыня %1", - "TEXT_LENGTH_TOOLTIP": "Вяртае колькасьць літараў (у тым ліку прабелы) у пададзеным тэксьце.", - "TEXT_ISEMPTY_TITLE": "%1 пусты", - "TEXT_ISEMPTY_TOOLTIP": "Вяртае значэньне ісьціна, калі тэкст пусты.", - "TEXT_INDEXOF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае 0, калі тэкст ня знойдзены.", - "TEXT_INDEXOF_INPUT_INTEXT": "у тэксьце", - "TEXT_INDEXOF_OPERATOR_FIRST": "знайсьці першае ўваходжаньне тэксту", - "TEXT_INDEXOF_OPERATOR_LAST": "знайсьці апошняе ўваходжаньне тэксту", - "TEXT_CHARAT_INPUT_INTEXT": "у тэксьце", - "TEXT_CHARAT_FROM_START": "узяць літару №", - "TEXT_CHARAT_FROM_END": "узяць літару № з канца", - "TEXT_CHARAT_FIRST": "узяць першую літару", - "TEXT_CHARAT_LAST": "узяць апошнюю літару", - "TEXT_CHARAT_RANDOM": "узяць выпадковую літару", - "TEXT_CHARAT_TOOLTIP": "Вяртае літару ў пазначанай пазыцыі.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Вяртае пазначаную частку тэксту.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "у тэксьце", - "TEXT_GET_SUBSTRING_START_FROM_START": "узяць падрадок зь літары №", - "TEXT_GET_SUBSTRING_START_FROM_END": "узяць падрадок зь літары № з канца", - "TEXT_GET_SUBSTRING_START_FIRST": "атрымаць падрадок зь першай літары", - "TEXT_GET_SUBSTRING_END_FROM_START": "да літары №", - "TEXT_GET_SUBSTRING_END_FROM_END": "да літары № з канца", - "TEXT_GET_SUBSTRING_END_LAST": "да апошняй літары", - "TEXT_CHANGECASE_TOOLTIP": "Вярнуць копію тэксту зь іншай велічынёй літар.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "да ВЕРХНЯГА РЭГІСТРУ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "да ніжняга рэгістру", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Вялікія Першыя Літары", - "TEXT_TRIM_TOOLTIP": "Вяртае копію тэксту з прабеламі, выдаленымі ад аднаго ці абодвух бакоў.", - "TEXT_TRIM_OPERATOR_BOTH": "абрэзаць прабелы з абодвух бакоў", - "TEXT_TRIM_OPERATOR_LEFT": "абрэзаць прабелы зь левага боку", - "TEXT_TRIM_OPERATOR_RIGHT": "абрэзаць прабелы з правага боку", - "TEXT_PRINT_TITLE": "друкаваць %1", - "TEXT_PRINT_TOOLTIP": "Надрукаваць пазначаны тэкст, лічбу ці іншыя сымбалі.", - "TEXT_PROMPT_TYPE_TEXT": "запытаць тэкст з падказкай", - "TEXT_PROMPT_TYPE_NUMBER": "запытаць лічбу з падказкай", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Запытаць у карыстальніка лічбу.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Запытаць у карыстальніка тэкст.", - "LISTS_CREATE_EMPTY_TITLE": "стварыць пусты сьпіс", - "LISTS_CREATE_EMPTY_TOOLTIP": "Вяртае сьпіс даўжынёй 0, які ня ўтрымлівае запісаў зьвестак", - "LISTS_CREATE_WITH_TOOLTIP": "Ставарае сьпіс зь любой колькасьцю элемэнтаў.", - "LISTS_CREATE_WITH_INPUT_WITH": "стварыць сьпіс з", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "сьпіс", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Дадаць, выдаліць ці пераставіць сэкцыі для пераканфігураваньня гэтага блёку.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Дадаць элемэнт да сьпісу.", - "LISTS_REPEAT_TOOLTIP": "Стварае сьпіс, які ўтрымлівае пададзеную колькасьць копіяў элемэнту.", - "LISTS_REPEAT_TITLE": "стварыць сьпіс з элемэнту %1, які паўтараецца %2 разоў", - "LISTS_LENGTH_TITLE": "даўжыня %1", - "LISTS_LENGTH_TOOLTIP": "Вяртае даўжыню сьпісу.", - "LISTS_ISEMPTY_TITLE": "%1 пусты", - "LISTS_ISEMPTY_TOOLTIP": "Вяртае значэньне ісьціна, калі сьпіс пусты.", - "LISTS_INLIST": "у сьпісе", - "LISTS_INDEX_OF_FIRST": "знайсьці першае ўваходжаньне элемэнту", - "LISTS_INDEX_OF_LAST": "знайсьці апошняе ўваходжаньне элемэнту", - "LISTS_INDEX_OF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпіс. Вяртае 0, калі элемэнт ня знойдзены.", - "LISTS_GET_INDEX_GET": "атрымаць", - "LISTS_GET_INDEX_GET_REMOVE": "атрымаць і выдаліць", - "LISTS_GET_INDEX_REMOVE": "выдаліць", - "LISTS_GET_INDEX_FROM_END": "№ з канца", - "LISTS_GET_INDEX_FIRST": "першы", - "LISTS_GET_INDEX_LAST": "апошні", - "LISTS_GET_INDEX_RANDOM": "выпадковы", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Вяртае першы элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Вяртае апошні элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Вяртае выпадковы элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Выдаляе і вяртае першы элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Выдаляе і вяртае апошні элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Выдаляе і вяртае выпадковы элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Выдаляе першы элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Выдаляе апошні элемэнт у сьпісе.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Выдаляе выпадковы элемэнт у сьпісе.", - "LISTS_SET_INDEX_SET": "усталяваць", - "LISTS_SET_INDEX_INSERT": "уставіць у", - "LISTS_SET_INDEX_INPUT_TO": "як", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Задае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Задае элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Задае першы элемэнт у сьпісе.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Задае апошні элемэнт у сьпісе.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Задае выпадковы элемэнт у сьпісе.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — першы элемэнт.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе. №1 — апошні элемэнт.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Устаўляе элемэнт у пачатак сьпісу.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Дадае элемэнт у канец сьпісу.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Выпадковым чынам устаўляе элемэнт у сьпіс.", - "LISTS_GET_SUBLIST_START_FROM_START": "атрымаць падсьпіс з №", - "LISTS_GET_SUBLIST_START_FROM_END": "атрымаць падсьпіс з № з канца", - "LISTS_GET_SUBLIST_START_FIRST": "атрымаць падсьпіс зь першага", - "LISTS_GET_SUBLIST_END_FROM_START": "да #", - "LISTS_GET_SUBLIST_END_FROM_END": "па № з канца", - "LISTS_GET_SUBLIST_END_LAST": "да апошняга", - "LISTS_GET_SUBLIST_TOOLTIP": "Стварае копію пазначанай часткі сьпісу.", - "LISTS_SPLIT_LIST_FROM_TEXT": "стварыць сьпіс з тэксту", - "LISTS_SPLIT_TEXT_FROM_LIST": "стварыць тэкст са сьпісу", - "LISTS_SPLIT_WITH_DELIMITER": "з падзяляльнікам", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Падзяліць тэкст у сьпіс тэкстаў, па падзяляльніках.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Аб’ядноўвае сьпіс тэкстаў у адзін тэкст па падзяляльніках.", - "VARIABLES_GET_TOOLTIP": "Вяртае значэньне гэтай зьменнай.", - "VARIABLES_GET_CREATE_SET": "Стварыць блёк «усталяваць %1»", - "VARIABLES_SET": "усталяваць %1 да %2", - "VARIABLES_SET_TOOLTIP": "Надаць гэтай зьменнай значэньне ўстаўкі.", - "VARIABLES_SET_CREATE_GET": "Стварыць блёк «атрымаць %1»", - "PROCEDURES_DEFNORETURN_TITLE": "да", - "PROCEDURES_DEFNORETURN_PROCEDURE": "зрабіць што-небудзь", - "PROCEDURES_BEFORE_PARAMS": "з:", - "PROCEDURES_CALL_BEFORE_PARAMS": "з:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Стварае функцыю бяз выніку.", - "PROCEDURES_DEFRETURN_RETURN": "вярнуць", - "PROCEDURES_DEFRETURN_TOOLTIP": "Стварае функцыю з вынікам.", - "PROCEDURES_ALLOW_STATEMENTS": "дазволіць зацьвярджэньне", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Увага: гэтая функцыя мае парамэтры-дублікаты.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Запусьціць функцыю вызначаную карыстальнікам '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Запусьціць функцыю вызначаную карыстальнікам '%1' і выкарыстаць яе вынік.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "парамэтры", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Дадаць, выдаліць ці запісаць чаргу ўваходных парамэтраў для гэтай функцыі.", - "PROCEDURES_MUTATORARG_TITLE": "назва парамэтру:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Дадаць уваходныя парамэтры ў функцыю.", - "PROCEDURES_HIGHLIGHT_DEF": "Падсьвяціць вызначэньне функцыі", - "PROCEDURES_CREATE_DO": "Стварыць '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Калі значэньне ісьціна, вярнуць другое значэньне.", - "PROCEDURES_IFRETURN_WARNING": "Папярэджаньне: гэты блёк можа выкарыстоўвацца толькі ў вызначанай функцыі." -} diff --git a/msg/json/bg.json b/msg/json/bg.json deleted file mode 100644 index 17f59a9728..0000000000 --- a/msg/json/bg.json +++ /dev/null @@ -1,306 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Gkostov", - "Vodnokon4e", - "Alpinistbg", - "Miroslav35232" - ] - }, - "VARIABLES_DEFAULT_NAME": "елемент", - "TODAY": "Днес", - "DUPLICATE_BLOCK": "Копирай", - "ADD_COMMENT": "Добави коментар", - "REMOVE_COMMENT": "Премахни коментар", - "EXTERNAL_INPUTS": "Външни входове", - "INLINE_INPUTS": "Вътрешни входове", - "DELETE_BLOCK": "Изтрий блок", - "DELETE_X_BLOCKS": "Изтрий %1 блока", - "DELETE_ALL_BLOCKS": "Изтриване на всички 1% блокове?", - "CLEAN_UP": "Премахни блокове", - "COLLAPSE_BLOCK": "Скрий блок", - "COLLAPSE_ALL": "Скрий блокове", - "EXPAND_BLOCK": "Покажи блок", - "EXPAND_ALL": "Покажи блокове", - "DISABLE_BLOCK": "Деактивирай блок", - "ENABLE_BLOCK": "Активирай блок", - "HELP": "Помощ", - "CHAT": "Говори с колега, като пишеш в това поле!", - "AUTH": "Позволи на приложението да записва и споделя работата ти.", - "ME": "Аз", - "CHANGE_VALUE_TITLE": "Промени стойността:", - "NEW_VARIABLE": "Нова променлива...", - "NEW_VARIABLE_TITLE": "Ново име на променливата:", - "RENAME_VARIABLE": "Преименувай променливата...", - "RENAME_VARIABLE_TITLE": "Преименувай всички '%1' променливи на:", - "COLOUR_PICKER_HELPURL": "https://bg.wikipedia.org/wiki/Цвят_(оптика)", - "COLOUR_PICKER_TOOLTIP": "Избери цвят от палитрата.", - "COLOUR_RANDOM_TITLE": "случаен цвят", - "COLOUR_RANDOM_TOOLTIP": "Избери цвят на случаен принцип.", - "COLOUR_RGB_TITLE": "оцвети с", - "COLOUR_RGB_RED": "червен", - "COLOUR_RGB_GREEN": "зелен", - "COLOUR_RGB_BLUE": "син", - "COLOUR_RGB_TOOLTIP": "Създай цвят с избраните пропорции, червено, зелено и синьо. Всички стойности трябва да бъдат от 0 до 100.", - "COLOUR_BLEND_TITLE": "смеси", - "COLOUR_BLEND_COLOUR1": "цвят 1", - "COLOUR_BLEND_COLOUR2": "цвят 2", - "COLOUR_BLEND_RATIO": "съотношение", - "COLOUR_BLEND_TOOLTIP": "Смесва два цвят в дадено съотношение (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://bg.wikipedia.org/wiki/Цикъл_(програмиране)#For_.D1.86.D0.B8.D0.BA.D1.8A.D0.BB.D1.8A.D1.82", - "CONTROLS_REPEAT_TITLE": "Повтори %1 пъти", - "CONTROLS_REPEAT_INPUT_DO": "изпълни", - "CONTROLS_REPEAT_TOOLTIP": "Изпълнява команди няколко пъти.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "повтаряй докато е вярно, че", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "повтаряй докато", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Докато стойността е истина, изпълнявай командите.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Докато стойността е лъжа, изпълнявай командите.", - "CONTROLS_FOR_TOOLTIP": "Нека променлива \"%1\" премине през стойностите от началното до крайното число през зададената стъпка и изпълни избраните блокове.", - "CONTROLS_FOR_TITLE": "преброй чрез %1 от %2 до %3 през %4", - "CONTROLS_FOREACH_TITLE": "за всеки елемент %1 в списъка %2", - "CONTROLS_FOREACH_TOOLTIP": "За всеки елемент в списък присвои елемента на променливата '%1' и след това изпълни командите.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "прекъсни цикъла", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "премини към следващата стъпка от цикъла", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Прекъсни цикъла, в койте се съдержа тази команда.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Премини към следващата стъпка от цикъла", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Предупреждение: Този блок може да се използва само в цикъл.", - "CONTROLS_IF_TOOLTIP_1": "Ако стойността е вярна, изпълни операциите.", - "CONTROLS_IF_TOOLTIP_2": "Ако стойността е вярна, изпълни първия блок. Иначе, изпълни втория блок.", - "CONTROLS_IF_TOOLTIP_3": "Ако първата стойност е вярна, изпълни първия блок. Иначе, ако втората стойност е вярна, изпълни втория блок.", - "CONTROLS_IF_TOOLTIP_4": "Ако първата стойност е вярна, изпълни първия блок. В противен случай, ако втората стойност е вярна, изпълни втория блок. Ако нито една от стойностите не е вярна, изпълни последния блок.", - "CONTROLS_IF_MSG_IF": "ако", - "CONTROLS_IF_MSG_ELSEIF": "иначе ако", - "CONTROLS_IF_MSG_ELSE": "иначе", - "CONTROLS_IF_IF_TOOLTIP": "Добави, премахни или пренареди частите, за да промениш този \"ако\" блок.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Добави условие към \"ако\" блока.", - "CONTROLS_IF_ELSE_TOOLTIP": "Добави окончателено, прихващащо всичко останали случаи условие към \"ако\" блока.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Върни вярно, ако двата параметъра са еднакви.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Върни вярно, ако двата параметъра са различни.", - "LOGIC_COMPARE_TOOLTIP_LT": "Върни вярно, ако първия параметър е по-малък от втория.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Върни истина, ако първия параметър е по-малък или равен на втория.", - "LOGIC_COMPARE_TOOLTIP_GT": "Върни истина, ако първия параметър е по-голям от втория.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Върни истина, ако първия параметър е по-голям или равен на втория.", - "LOGIC_OPERATION_TOOLTIP_AND": "Върни вярно, ако и двата параметъра са верни.", - "LOGIC_OPERATION_AND": "и", - "LOGIC_OPERATION_TOOLTIP_OR": "Върни \"вярно\", ако поне един от входовете е верен.", - "LOGIC_OPERATION_OR": "или", - "LOGIC_NEGATE_TITLE": "не %1", - "LOGIC_NEGATE_TOOLTIP": "Върни вярно, ако параметърът е неверен. Върни невярно, ако параметърът е верен.", - "LOGIC_BOOLEAN_TRUE": "вярно", - "LOGIC_BOOLEAN_FALSE": "невярно", - "LOGIC_BOOLEAN_TOOLTIP": "Връща вярно или невярно.", - "LOGIC_NULL": "нула", - "LOGIC_NULL_TOOLTIP": "Връща нула.", - "LOGIC_TERNARY_CONDITION": "тест", - "LOGIC_TERNARY_IF_TRUE": "Ако е вярно", - "LOGIC_TERNARY_IF_FALSE": "Ако е невярно", - "LOGIC_TERNARY_TOOLTIP": "Провери исловието в \"тест\". Ако условието е истина, върни \"ако е истина\" стойността, иначе върни \"ако е лъжа\" стойността.", - "MATH_NUMBER_HELPURL": "https://bg.wikipedia.org/wiki/Число", - "MATH_NUMBER_TOOLTIP": "Число.", - "MATH_ARITHMETIC_HELPURL": "https://bg.wikipedia.org/wiki/Аритметика", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Върни сумата на двете числа.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Върни разликата на двете числа.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Върни произведението на двете числа.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Върни частното на двете числа.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Върни първото число, повдигнато на степен на второто число.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "корен квадратен", - "MATH_SINGLE_TOOLTIP_ROOT": "Връща корен квадратен от число.", - "MATH_SINGLE_OP_ABSOLUTE": "абсолютна", - "MATH_SINGLE_TOOLTIP_ABS": "Връща абсолютната стойност на число.", - "MATH_SINGLE_TOOLTIP_NEG": "Върни числото с обърнат знак.", - "MATH_SINGLE_TOOLTIP_LN": "Върни натуралния логаритъм от число.", - "MATH_SINGLE_TOOLTIP_LOG10": "Върни десетичния логаритъм на число.", - "MATH_SINGLE_TOOLTIP_EXP": "Върни е (неперовото число) на степен зададеното число.", - "MATH_SINGLE_TOOLTIP_POW10": "Върни 10 на степен зададеното число.", - "MATH_TRIG_HELPURL": "https://bg.wikipedia.org/wiki/Тригонометрична_функция", - "MATH_TRIG_TOOLTIP_SIN": "Върни синус от ъгъл в градуси (не в радиани)", - "MATH_TRIG_TOOLTIP_COS": "Върни косинус от ъгъл в градуси (не в радиани)", - "MATH_TRIG_TOOLTIP_TAN": "Върни тангенс от ъгъл в градуси (не в радиани)", - "MATH_TRIG_TOOLTIP_ASIN": "Върни аркуссинус от число.", - "MATH_TRIG_TOOLTIP_ACOS": "Върни аркускосинус от число.", - "MATH_TRIG_TOOLTIP_ATAN": "Върни аркустангенс от число.", - "MATH_CONSTANT_HELPURL": "http://bg.wikipedia.org/wiki/Константа", - "MATH_CONSTANT_TOOLTIP": "Връща една от често срещаните константи: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) или ∞ (безкрайност).", - "MATH_IS_EVEN": "е четно", - "MATH_IS_ODD": "е нечетно", - "MATH_IS_PRIME": "е просто", - "MATH_IS_WHOLE": "е цяло", - "MATH_IS_POSITIVE": "е положително", - "MATH_IS_NEGATIVE": "е отрицателно", - "MATH_IS_DIVISIBLE_BY": "се дели на", - "MATH_IS_TOOLTIP": "Проверете дали дадено число е четно, нечетно, просто, цяло, положително, отрицателно или дали се дели на друго число. Връща истина или лъжа.", - "MATH_CHANGE_HELPURL": "https://bg.wikipedia.org/wiki/Събиране", - "MATH_CHANGE_TITLE": "промени %1 на %2", - "MATH_CHANGE_TOOLTIP": "Добави число към променлива '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Закръгли число нагоре или надолу.", - "MATH_ROUND_OPERATOR_ROUND": "закръгли", - "MATH_ROUND_OPERATOR_ROUNDUP": "закръгли нагоре", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "закръгли надолу", - "MATH_ONLIST_OPERATOR_SUM": "сумираай списъка", - "MATH_ONLIST_TOOLTIP_SUM": "Върни сумата на всички числа в списъка.", - "MATH_ONLIST_OPERATOR_MIN": "най-малката стойност в списъка", - "MATH_ONLIST_TOOLTIP_MIN": "Върни най-малкото число в списъка.", - "MATH_ONLIST_OPERATOR_MAX": "най-голямата стойност в списъка", - "MATH_ONLIST_TOOLTIP_MAX": "Върни най-голямото число в списъка.", - "MATH_ONLIST_OPERATOR_AVERAGE": "средната стойност на числата в списъка", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Върни средната стойност (аритметичното средно) на числата в списъка.", - "MATH_ONLIST_OPERATOR_MEDIAN": "медианата на списък", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Върни медианата в списъка.", - "MATH_ONLIST_OPERATOR_MODE": "мода на списъка", - "MATH_ONLIST_TOOLTIP_MODE": "Върни списък на най-често срещаните елементи в списъка.", - "MATH_ONLIST_OPERATOR_STD_DEV": "стандартно отклонение на списък", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Връща стандартното отклонение на списъка.", - "MATH_ONLIST_OPERATOR_RANDOM": "случаен елемент от списъка", - "MATH_ONLIST_TOOLTIP_RANDOM": "Върни случаен елемент от списъка.", - "MATH_MODULO_HELPURL": "http://bg.wikipedia.org/wiki/Остатък", - "MATH_MODULO_TITLE": "остатъка от делението на %1 на %2", - "MATH_MODULO_TOOLTIP": "Върни остатъка от деление на две числа.", - "MATH_CONSTRAIN_TITLE": "ограничи %1 между %2 и %3", - "MATH_CONSTRAIN_TOOLTIP": "Ограничи число да бъде в определените граници (включително).", - "MATH_RANDOM_INT_HELPURL": "https://bg.wikipedia.org/wiki/Генератор_на_случайни_числа", - "MATH_RANDOM_INT_TITLE": "случайно цяло число между %1 и %2", - "MATH_RANDOM_INT_TOOLTIP": "Върни случайно число в определените граници (включително).", - "MATH_RANDOM_FLOAT_HELPURL": "https://bg.wikipedia.org/wiki/Генератор_на_случайни_числа", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "случайно дробно число", - "MATH_RANDOM_FLOAT_TOOLTIP": "Върни случайно дробно число между 0.0 (включително) и 1.0 (без да го включва)", - "TEXT_TEXT_HELPURL": "https://bg.wikipedia.org/wiki/Низ", - "TEXT_TEXT_TOOLTIP": "Буква, дума или ред", - "TEXT_JOIN_TITLE_CREATEWITH": "създай текст с", - "TEXT_JOIN_TOOLTIP": "Създай текст като съчетаеш няколко елемента.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "свържи", - "TEXT_CREATE_JOIN_TOOLTIP": "Добави, премахни или пренареди частите, за да промениш този текстов блок.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Добави елемент към текста.", - "TEXT_APPEND_TO": "към", - "TEXT_APPEND_APPENDTEXT": "добави текста", - "TEXT_APPEND_TOOLTIP": "Добави текста към променливата \"%1\".", - "TEXT_LENGTH_TITLE": "дължината на %1", - "TEXT_LENGTH_TOOLTIP": "Връща броя на символите (включително и интервалите) в текста.", - "TEXT_ISEMPTY_TITLE": "%1 е празен", - "TEXT_ISEMPTY_TOOLTIP": "Връща истина, ако текста е празен.", - "TEXT_INDEXOF_TOOLTIP": "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща 0, ако текстът не е намерен.", - "TEXT_INDEXOF_INPUT_INTEXT": "в текста", - "TEXT_INDEXOF_OPERATOR_FIRST": "намери първата поява на текста", - "TEXT_INDEXOF_OPERATOR_LAST": "намери последната поява на текста", - "TEXT_CHARAT_INPUT_INTEXT": "От текста", - "TEXT_CHARAT_FROM_START": "вземи поредна буква", - "TEXT_CHARAT_FROM_END": "вземи поредна буква от края", - "TEXT_CHARAT_FIRST": "вземи първата буква", - "TEXT_CHARAT_LAST": "вземи последната буква", - "TEXT_CHARAT_RANDOM": "вземи произволна буква", - "TEXT_CHARAT_TOOLTIP": "Връща буквата в определена позиция.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Връща определена част от текста.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "В текста", - "TEXT_GET_SUBSTRING_START_FROM_START": "вземи текста от буква №", - "TEXT_GET_SUBSTRING_START_FROM_END": "вземи текста от буква № (броено отзад-напред)", - "TEXT_GET_SUBSTRING_START_FIRST": "вземи текста от първата буква", - "TEXT_GET_SUBSTRING_END_FROM_START": "до буква №", - "TEXT_GET_SUBSTRING_END_FROM_END": "со буква № (броено отзад-напред)", - "TEXT_GET_SUBSTRING_END_LAST": "со последната буква.", - "TEXT_CHANGECASE_TOOLTIP": "Връща копие на текста със сменени малки и главни букви.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "с ГЛАВНИ БУКВИ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "с малки букви", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "с Главна Буква На Всяка Дума", - "TEXT_TRIM_TOOLTIP": "Върни копие на текста с пемахнати интервали от диния или двата края.", - "TEXT_TRIM_OPERATOR_BOTH": "премахни интервалите от двете страни", - "TEXT_TRIM_OPERATOR_LEFT": "премахни интервалите отляво", - "TEXT_TRIM_OPERATOR_RIGHT": "премахни интервалите отдясно", - "TEXT_PRINT_TITLE": "отпечатай %1", - "TEXT_PRINT_TOOLTIP": "Отпечатай текста, числото или друга стойност.", - "TEXT_PROMPT_TYPE_TEXT": "питай за текст със съобщение", - "TEXT_PROMPT_TYPE_NUMBER": "питай за число със съобщение", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Питай потребителя за число.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Питай потребителя за текст.", - "LISTS_CREATE_EMPTY_TITLE": "създай празен списък", - "LISTS_CREATE_EMPTY_TOOLTIP": "Връща списък с дължина 0, не съдържащ данни", - "LISTS_CREATE_WITH_TOOLTIP": "Създай списък с произволен брой елементи.", - "LISTS_CREATE_WITH_INPUT_WITH": "създай списък с", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "списък", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Добави, премахни или пренареди частите, за да промениш този списъчен блок.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Добави елемент към текста.", - "LISTS_REPEAT_TOOLTIP": "Създава списък, състоящ се от определен брой копия на елемента.", - "LISTS_REPEAT_TITLE": "създай списък от %1 повторен %2 пъти", - "LISTS_LENGTH_TITLE": "дължината на %1", - "LISTS_LENGTH_TOOLTIP": "Връща дължината на списък.", - "LISTS_ISEMPTY_TITLE": "%1 е празен", - "LISTS_ISEMPTY_TOOLTIP": "Връща истина, ако списъкът е празен.", - "LISTS_INLIST": "в списъка", - "LISTS_INDEX_OF_FIRST": "намери първата поява на елемента", - "LISTS_INDEX_OF_LAST": "намери последната поява на елемента", - "LISTS_INDEX_OF_TOOLTIP": "Връща индекса на първото/последното появяване на елемента в списъка. Връща 0 ако елементът не е намерен.", - "LISTS_GET_INDEX_GET": "вземи", - "LISTS_GET_INDEX_GET_REMOVE": "вземи и премахни", - "LISTS_GET_INDEX_REMOVE": "премахни", - "LISTS_GET_INDEX_FROM_END": "№ от края", - "LISTS_GET_INDEX_FIRST": "първия", - "LISTS_GET_INDEX_LAST": "последния", - "LISTS_GET_INDEX_RANDOM": "произволен", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Връща елемента на определената позиция в списък. #1 е първият елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Връща елемента на определената позиция в списък. #1 е последният елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Връща първия елемент в списък.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Връща последния елемент в списък.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Връща случаен елемент от списъка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Премахва и връща елемента на определена позиция в списък. #1 е последният елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Премахва и връща елемента на определена позиция в списък. #1 е последният елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Премахва и връща първия елемент в списък.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Премахва и връща последния елемент в списък.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Премахва и връща случаен елемент в списък.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Премахва елемент на определена позиция в списък. #1 е първият елемент.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Премахва елемент на определена позиция в списък. #1 е последният елемент.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Премахва първия елемент в списък.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Премахва последния елемент в списък.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Премахва случаен елемент от списък.", - "LISTS_SET_INDEX_SET": "промени", - "LISTS_SET_INDEX_INSERT": "вмъкни на позиция", - "LISTS_SET_INDEX_INPUT_TO": "следното", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Променя елемента на определена позиция в списък. #1 е първият елемент.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Променя елемента на определена позиция в списък. #1 е последният елемент.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Променя първия елемент в списък.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Променя последния елемент в списък.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Променя случаен елемент от списък.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Вмъква елемент на определена позиция в списък. №1 е първият елемент.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Вмъква елемент на определена позиция в списък. №1 е последният елемент.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Вмъква елемент в началото на списъка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Добави елемент в края на списък.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Вмъква елемент на произволно място в списък.", - "LISTS_GET_SUBLIST_START_FROM_START": "вземи подсписък от №", - "LISTS_GET_SUBLIST_START_FROM_END": "вземи подсписък от № от края", - "LISTS_GET_SUBLIST_START_FIRST": "вземи подсписък от първия", - "LISTS_GET_SUBLIST_END_FROM_START": "до #", - "LISTS_GET_SUBLIST_END_FROM_END": "до № открая", - "LISTS_GET_SUBLIST_END_LAST": "до края", - "LISTS_GET_SUBLIST_TOOLTIP": "Копира част от списък.", - "LISTS_SPLIT_LIST_FROM_TEXT": "Направи списък от текст", - "LISTS_SPLIT_TEXT_FROM_LIST": "направи текст от списък", - "LISTS_SPLIT_WITH_DELIMITER": "с разделител", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Разделя текст в списък на текстове, по всеки разделител.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Събира списък от текстове в един текст, раделени с разделител.", - "VARIABLES_GET_TOOLTIP": "Връща стойността на тази променлива.", - "VARIABLES_GET_CREATE_SET": "Създай \"промени стойността на %1\"", - "VARIABLES_SET": "нека %1 бъде %2", - "VARIABLES_SET_TOOLTIP": "Задава тази променлива да бъде равен на входа.", - "VARIABLES_SET_CREATE_GET": "Създай \"вземи стойността на %1\"", - "PROCEDURES_DEFNORETURN_TITLE": "за да", - "PROCEDURES_DEFNORETURN_PROCEDURE": "направиш", - "PROCEDURES_BEFORE_PARAMS": "със:", - "PROCEDURES_CALL_BEFORE_PARAMS": "със:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Създава функция, която не връща резултат.", - "PROCEDURES_DEFRETURN_RETURN": "върни", - "PROCEDURES_DEFRETURN_TOOLTIP": "Създава функция, която връща резултат.", - "PROCEDURES_ALLOW_STATEMENTS": "позволи операциите", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Предупреждение: Тази функция има дублиращи се параметри.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://bg.wikipedia.org/wiki/Подпрограма", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Изпълни дефинирана от потребителя функция \"%1\".", - "PROCEDURES_CALLRETURN_HELPURL": "https://bg.wikipedia.org/wiki/Подпрограма", - "PROCEDURES_CALLRETURN_TOOLTIP": "Изпълни дефинирана от потребителя функция \"%1\" и използвай резултата.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "вход", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Добави, премахни или пренареди входните параметри за тази функция.", - "PROCEDURES_MUTATORARG_TITLE": "име на параметър", - "PROCEDURES_MUTATORARG_TOOLTIP": "Добавяне на параметър към функцията.", - "PROCEDURES_HIGHLIGHT_DEF": "Покажи дефиницията на функцията", - "PROCEDURES_CREATE_DO": "Създай '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Ако стойността е истина, върни втората стойност.", - "PROCEDURES_IFRETURN_WARNING": "Предупреждение: Този блок може да се използва само във функция." -} diff --git a/msg/json/bn.json b/msg/json/bn.json deleted file mode 100644 index 4cb033eedb..0000000000 --- a/msg/json/bn.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Aftabuzzaman", - "Rakibul", - "Tauhid16" - ] - }, - "VARIABLES_DEFAULT_NAME": "পদ", - "TODAY": "আজ", - "DUPLICATE_BLOCK": "প্রতিলিপি", - "ADD_COMMENT": "মন্তব্য যোগ করুন", - "REMOVE_COMMENT": "মন্তব্য সরাও", - "EXTERNAL_INPUTS": "বহি:স্থ ইনপুট", - "INLINE_INPUTS": "সারি ইনপুট", - "DELETE_BLOCK": "ব্লকটি মুছে ফেল", - "DELETE_X_BLOCKS": "%1 ব্লক অপসারণ কর", - "EXPAND_BLOCK": "ব্লকটি সম্প্রসারিত কর", - "EXPAND_ALL": "ব্লকগুলো সম্প্রসারিত কর", - "DISABLE_BLOCK": "ব্লকটি বিকল কর", - "ENABLE_BLOCK": "ব্লকটি সচল কর", - "HELP": "সাহায্য", - "CHAT": "এই বাক্সে লিখার মাধ্যমে আপনার সহযোগীর সাথে আলাপ করুন!", - "ME": "আমাকে", - "CHANGE_VALUE_TITLE": "মান পরিবর্তন করুন:", - "NEW_VARIABLE": "নতুন চলক...", - "NEW_VARIABLE_TITLE": "নতুন চলকের নাম:", - "RENAME_VARIABLE": "চলকের নাম পরিবর্তন...", - "COLOUR_PICKER_TOOLTIP": "প্যালেট থেকে একটি রং পছন্দ করুন", - "COLOUR_RANDOM_TITLE": "এলোমেলো রং", - "COLOUR_RANDOM_TOOLTIP": "এলোমেলোভাবে একটি রং পছন্দ করুন।", - "COLOUR_RGB_TITLE": "রং সহ", - "COLOUR_RGB_RED": "লাল", - "COLOUR_RGB_GREEN": "সবুজ", - "COLOUR_RGB_BLUE": "নীল", - "COLOUR_RGB_TOOLTIP": "একটি রং তৈরি করুন নির্দিষ্ট পরিমাণে লাল, সবুজ এবং নীল রং মিশ্রিত করে। প্রত্যেকটির মান অবশ্যই ০ থেকে ১০০ এর মধ্যে হতে হবে।", - "COLOUR_BLEND_TITLE": "মিশ্রণ", - "COLOUR_BLEND_COLOUR1": "রং ১", - "COLOUR_BLEND_COLOUR2": "রং ২", - "COLOUR_BLEND_RATIO": "অনুপাত", - "COLOUR_BLEND_TOOLTIP": "প্রদত্ত অনুপাত(০.০ - ১.০) অনুসারে দুটি রং একসাথে মিশ্রিত করুন।", - "CONTROLS_REPEAT_TITLE": "%1 বার পুনরাবৃত্তি করো", - "CONTROLS_REPEAT_INPUT_DO": "করুন", - "CONTROLS_FOR_TITLE": "গণনা কর %1 %4 দিয়ে %2 থেকে %3", - "CONTROLS_FOREACH_TITLE": "প্রত্যেকটি পদের জন্য %1 তালিকার মধ্যে %2", - "CONTROLS_FLOW_STATEMENTS_WARNING": "সর্তকীবার্তা: এই ব্লকটি শুধুমাত্র লুপের মধ্যে ব্যবহার করা যাবে।", - "CONTROLS_IF_MSG_IF": "যদি", - "CONTROLS_IF_MSG_ELSEIF": "নতুবা যদি", - "CONTROLS_IF_MSG_ELSE": "নতুবা", - "CONTROLS_IF_ELSEIF_TOOLTIP": "যদি নামক ব্লক এ একটি শর্ত যোগ করুন।", - "LOGIC_COMPARE_TOOLTIP_EQ": "পাঠাবে সত্য যদি উভয় ইনপুটই সমান হয়।", - "LOGIC_COMPARE_TOOLTIP_NEQ": "পাঠাবে সত্য যদি উভয় ইনপুটই সমান না হয়।", - "LOGIC_COMPARE_TOOLTIP_LT": "পাঠাবে সত্য যদি প্রথম ইনপুট দ্বিতীয় ইনপুট থেকে ছোট হয়।", - "LOGIC_COMPARE_TOOLTIP_LTE": "পাঠাবে সত্য যদি প্রথম ইনপুট দ্বিতীয় ইনপুট থেকে ছোট অথবা সমান হয়।", - "LOGIC_COMPARE_TOOLTIP_GT": "পাঠাবে সত্য যদি প্রথম ইনপুট দ্বিতীয় ইনপুট থেকে বড় হয়।", - "LOGIC_COMPARE_TOOLTIP_GTE": "পাঠাবে সত্য যদি প্রথম ইনপুট দ্বিতীয় ইনপুট থেকে বড় অথবা সমান হয়।", - "LOGIC_OPERATION_TOOLTIP_AND": "পাঠাবে সত্য যদি উভয় ইনপুটই সত্য হয়।", - "LOGIC_OPERATION_AND": "এবং", - "LOGIC_OPERATION_TOOLTIP_OR": "পাঠাবে সত্য যদি অন্ততপক্ষে যেকোন একটি ইনপুট সত্য হয়।", - "LOGIC_OPERATION_OR": "অথবা", - "LOGIC_NEGATE_TITLE": "%1 নয়", - "LOGIC_NEGATE_TOOLTIP": "পাঠাবে সত্য যদি ইনপুট মিথ্যা হয়। পাঠাবে মিথ্যা যদি ইনপুট সত্য হয়।", - "LOGIC_BOOLEAN_TRUE": "সত্য", - "LOGIC_BOOLEAN_FALSE": "মিথ্যা", - "LOGIC_BOOLEAN_TOOLTIP": "পাঠাবে হয় সত্য অথবা মিথ্যা।", - "LOGIC_NULL": "নুল", - "LOGIC_NULL_TOOLTIP": "পাঠাবে নাল।", - "LOGIC_TERNARY_CONDITION": "পরীক্ষা", - "LOGIC_TERNARY_IF_TRUE": "যদি সত্য হয়", - "LOGIC_TERNARY_IF_FALSE": "যদি মিথ্যা হয়", - "MATH_NUMBER_HELPURL": "https://bn.wikipedia.org/wiki/সংখ্যা", - "MATH_NUMBER_TOOLTIP": "একটি সংখ্যা।", - "MATH_ARITHMETIC_TOOLTIP_ADD": "পাঠাবে দুটি সংখ্যার যোগফল।", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "পাঠাবে দুটি সংখ্যার বিয়োগফল।", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "পাঠাবে দুটি সংখ্যার গুণফল।", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "পাঠাবে দুটি সংখ্যার ভাগফল।", - "MATH_SINGLE_OP_ROOT": "বর্গমূল", - "MATH_SINGLE_TOOLTIP_ROOT": "পাঠাবে একটি সংখ্যার বর্গমূল।", - "MATH_SINGLE_OP_ABSOLUTE": "পরম", - "MATH_SINGLE_TOOLTIP_ABS": "পাঠাবে সংখ্যার পরমমান।", - "MATH_IS_EVEN": "জোড় সংখ্যা", - "MATH_IS_ODD": "বিজোড় সংখ্যা", - "MATH_IS_PRIME": "মৌলিক সংখ্যা", - "MATH_IS_POSITIVE": "ইতিবাচক", - "MATH_IS_NEGATIVE": "নেতিবাচক", - "MATH_IS_DIVISIBLE_BY": "দ্বারা বিভাজ্য", - "MATH_CHANGE_TITLE": "পরিবর্তন %1 দ্বারা %2", - "MATH_ONLIST_OPERATOR_SUM": "তালিকার যোগফল", - "MATH_ONLIST_TOOLTIP_SUM": "পাঠাবে তালিকার সব সংখ্যার যোগফল।", - "MATH_ONLIST_OPERATOR_MIN": "তালিকার মধ্যে সর্বনিম্ন", - "MATH_ONLIST_TOOLTIP_MIN": "তালিকার মধ্যে সর্বনিম্ন সংখ্যাটি পাঠাও", - "MATH_ONLIST_OPERATOR_MAX": "তালিকার মধ্যে সর্বোচ্চ", - "MATH_ONLIST_TOOLTIP_MAX": "তালিকার মধ্যে সর্বোচ্চ সংখ্যাটি পাঠাও", - "MATH_ONLIST_OPERATOR_AVERAGE": "তালিকার গড়", - "MATH_ONLIST_TOOLTIP_AVERAGE": "পাঠাবে তালিকার সব সংখ্যার গড়।", - "MATH_ONLIST_OPERATOR_MEDIAN": "তালিকার মধ্যমা", - "MATH_ONLIST_TOOLTIP_MEDIAN": "তালিকার মধ্যমা সংখ্যাটি পাঠাবে।", - "MATH_ONLIST_OPERATOR_RANDOM": "তালিকার এলোমেলো পদ", - "MATH_ONLIST_TOOLTIP_RANDOM": "তালিকা থেকে এলোমেলোভাবে একটি পদ পাঠাবে।", - "MATH_MODULO_TITLE": "%1 ÷ %2 এর ভাগশেষ", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "এলোমেলো ভগ্নাংশ", - "TEXT_TEXT_TOOLTIP": "একটি অক্ষর, শব্দ অথবা বাক্য।", - "TEXT_CREATE_JOIN_TITLE_JOIN": "সংযোগ কর", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "লেখাটিতে একটি পদ যোগ করুন।", - "TEXT_APPEND_TO": "এতে", - "TEXT_ISEMPTY_TITLE": "%1 খালি", - "TEXT_ISEMPTY_TOOLTIP": "পাঠাবে সত্য যদি সরবরাহকৃত লেখাটি খালি হয়।", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "বড়হাতের অক্ষরে", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "ছোটহাতের অক্ষরে", - "TEXT_TRIM_OPERATOR_BOTH": "উভয় পাশ থেকে খালি অংশ ছাটাই", - "TEXT_TRIM_OPERATOR_LEFT": "বামপাশ থেকে খালি অংশ ছাটাই", - "TEXT_TRIM_OPERATOR_RIGHT": "ডানপাশ থেকে খালি অংশ ছাটাই", - "TEXT_PRINT_TITLE": "প্রিন্ট %1", - "LISTS_CREATE_EMPTY_TITLE": "খালি তালিকা তৈরি করুন", - "LISTS_CREATE_EMPTY_TOOLTIP": "পাঠাবে একটি তালিকা, দের্ঘ্য হবে ০, কোন উপাত্ত থাকবে না", - "LISTS_CREATE_WITH_TOOLTIP": "যেকোন সংখ্যক পদ নিয়ে একটি তালিকা তৈরি করুন।", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "তালিকা", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "তালিকায় একটি পদ যোগ কর", - "LISTS_LENGTH_TOOLTIP": "একটি তালিকার দৈর্ঘ্য পাঠাবে।", - "LISTS_ISEMPTY_TITLE": "%1 খালি", - "LISTS_ISEMPTY_TOOLTIP": "পাঠাবে সত্য যদি তালিকাটি খালি হয়।", - "LISTS_INLIST": "তালিকার মধ্যে", - "LISTS_GET_INDEX_REMOVE": "অপসারণ", - "LISTS_GET_INDEX_FIRST": "প্রথম", - "LISTS_GET_INDEX_LAST": "শেষ", - "LISTS_GET_INDEX_RANDOM": "এলোমেলো", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "তালিকার প্রথম পদটি পাঠাবে।", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "তালিকার শেষ পদটি পাঠাবে।", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "এলোমেলোভাবে তালিকার যেকোন একটি পদ পাঠাবে।", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "অপসারণ করুন এবং তালিকার প্রথম পদটি পাঠান।", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "অপসারণ করুন এবং তালিকার শেষ পদটি পাঠান।", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "অপসারণ করুন এবং তালিকার এলোমেলো একটি পদ পাঠান।", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "তালিকার প্রথম পদটি অপসারণ করা হয়েছে।", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "তালিকার শেষ পদটি অপসারণ করা হয়েছে।", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "তালিকা থেকে এলোমেলো একটি পদ অপসারণ করা হয়েছে।", - "LISTS_SPLIT_LIST_FROM_TEXT": "লিখা থেকে তালিকা তৈরি করুন", - "LISTS_SPLIT_TEXT_FROM_LIST": "তালিকা থেকে লিখা তৈরি করুন", - "PROCEDURES_DEFNORETURN_TITLE": "এতে", - "PROCEDURES_DEFNORETURN_TOOLTIP": "আউটপুট ছাড়া একটি ক্রিয়া তৈরি করুন।", - "PROCEDURES_DEFRETURN_RETURN": "পাঠাবে", - "PROCEDURES_DEFRETURN_TOOLTIP": "আউটপুট সহ একটি ক্রিয়া তৈরি করুন।", - "PROCEDURES_MUTATORARG_TITLE": "ইনপুটের নাম:", - "PROCEDURES_MUTATORARG_TOOLTIP": "ক্রিয়াতে একটি ইনপুট যোগ করুন।", - "PROCEDURES_HIGHLIGHT_DEF": "ক্রিয়ার সংজ্ঞা উজ্জল করুন", - "PROCEDURES_IFRETURN_TOOLTIP": "যদি মান সত্য হয় তাহলে দ্বিতীয় মান পাঠাবে।" -} diff --git a/msg/json/br.json b/msg/json/br.json deleted file mode 100644 index cc31693268..0000000000 --- a/msg/json/br.json +++ /dev/null @@ -1,306 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Fohanno", - "Y-M D", - "Gwenn-Ael" - ] - }, - "VARIABLES_DEFAULT_NAME": "elfenn", - "TODAY": "Hiziv", - "DUPLICATE_BLOCK": "Eiladuriñ", - "ADD_COMMENT": "Ouzhpennañ un evezhiadenn", - "REMOVE_COMMENT": "Lemel an evezhiadenn kuit", - "EXTERNAL_INPUTS": "Monedoù diavaez", - "INLINE_INPUTS": "Monedoù enlinenn", - "DELETE_BLOCK": "Dilemel ar bloc'h", - "DELETE_X_BLOCKS": "Dilemel %1 bloc'h", - "DELETE_ALL_BLOCKS": "Diverkañ an holl vloc'hoù %1 ?", - "COLLAPSE_BLOCK": "Bihanaat ar bloc'h", - "COLLAPSE_ALL": "Bihanaat ar bloc'hoù", - "EXPAND_BLOCK": "Astenn ar bloc'h", - "EXPAND_ALL": "Astenn ar bloc'hoù", - "DISABLE_BLOCK": "Diweredekaat ar bloc'h", - "ENABLE_BLOCK": "Gweredekaat ar bloc'h", - "HELP": "Skoazell", - "CHAT": "Flapañ gant ho kenlabourer en ur skrivañ er voest-se !", - "AUTH": "Roit aotre, mar plij, d'an arload-mañ evit gallout saveteiñ ho labour ha reiñ aotre dezhañ da rannañ ho labour ganimp.", - "ME": "Me", - "CHANGE_VALUE_TITLE": "Kemmañ an dalvoudenn :", - "NEW_VARIABLE": "Argemmenn nevez...", - "NEW_VARIABLE_TITLE": "Anv an argemmenn nevez :", - "RENAME_VARIABLE": "Adenvel an argemmenn...", - "RENAME_VARIABLE_TITLE": "Adenvel an holl argemmennoù '%1' e :", - "COLOUR_PICKER_HELPURL": "http://br.wikipedia.org/wiki/Liv", - "COLOUR_PICKER_TOOLTIP": "Dibab ul liv diwar al livaoueg.", - "COLOUR_RANDOM_TITLE": "liv dargouezhek", - "COLOUR_RANDOM_TOOLTIP": "Tennañ ul liv d'ar sord", - "COLOUR_RGB_TITLE": "liv gant", - "COLOUR_RGB_RED": "ruz", - "COLOUR_RGB_GREEN": "gwer", - "COLOUR_RGB_BLUE": "glas", - "COLOUR_RGB_TOOLTIP": "Krouiñ ul liv gant ar c'hementad spisaet a ruz, a wer hag a c'hlas. Etre 0 ha 100 e tle bezañ an holl dalvoudoù.", - "COLOUR_BLEND_TITLE": "meskañ", - "COLOUR_BLEND_COLOUR1": "liv 1", - "COLOUR_BLEND_COLOUR2": "liv 2", - "COLOUR_BLEND_RATIO": "feur", - "COLOUR_BLEND_TOOLTIP": "a gemmesk daou liv gant ur feur roet(0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "adober %1 gwech", - "CONTROLS_REPEAT_INPUT_DO": "ober", - "CONTROLS_REPEAT_TOOLTIP": "Seveniñ urzhioù zo meur a wech", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "adober keit ha ma", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "adober betek", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Keit ha ma vez gwir un dalvoudenn, seveniñ urzhioù zo neuze.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Keit ha ma vez faos un dalvoudenn,seveniñ urzhioù zo neuze.", - "CONTROLS_FOR_TOOLTIP": "Ober e doare ma kemero an argemmenn \"%1\" an talvoudennoù adalek niverenn an deroù betek niverenn an dibenn, en ur inkremantiñ an esaouenn, ha seveniñ an urzhioù spisaet.", - "CONTROLS_FOR_TITLE": "kontañ gant %1 eus %2 da %3 dre %4", - "CONTROLS_FOREACH_TITLE": "evit pep elfenn %1 er roll %2", - "CONTROLS_FOREACH_TOOLTIP": "Evit pep elfenn en ur roll, reiñ talvoud an elfenn d'an argemmenn '%1', ha seveniñ urzhioù zo da c'houde.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Mont e-maez an adlañsañ", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "Kenderc'hel gant iteradur nevez ar rodell", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Mont e-maez ar boukl engronnus.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Lammat ar rest eus ar rodell, ha kenderc'hel gant an iteradur war-lerc'h.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Diwallit : ne c'hall ar bloc'h-mañ bezañ implijet nemet e-barzh ur boukl.", - "CONTROLS_IF_TOOLTIP_1": "Ma vez gwir un dalvoudenn, seveniñ urzhioù zo neuze.", - "CONTROLS_IF_TOOLTIP_2": "Ma vez gwir un dalvoudenn, seveniñ ar c'henañ bloc'had urzhioù neuze. Anez seveniñ an eil bloc'had urzhioù.", - "CONTROLS_IF_TOOLTIP_3": "Ma vez gwir an dalvoudenn gentañ, seveniñ ar c'hentañ bloc'had urzhioù neuze. Anez ma vez gwir an eil talvoudenn, seveniñ an eil bloc'had urzhioù.", - "CONTROLS_IF_TOOLTIP_4": "Ma vez gwir an dalvoudenn gentañ, seveniñ ar c'hentañ bloc'had. Anez, ma vez gwir an eil talvoudenn, seveniñ an eil bloc'had urzhioù. Ma ne vez gwir talvoudenn ebet, seveniñ ar bloc'had diwezhañ a urzhioù.", - "CONTROLS_IF_MSG_IF": "ma", - "CONTROLS_IF_MSG_ELSEIF": "mod all ma", - "CONTROLS_IF_MSG_ELSE": "a-hend-all", - "CONTROLS_IF_IF_TOOLTIP": "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h ma.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Ouzhpennañ un amplegad d'ar bloc'h ma.", - "CONTROLS_IF_ELSE_TOOLTIP": "Ouzhpennañ un amplegad dibenn lak-pep-tra d'ar bloc'h ma.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Distreiñ gwir m'eo par an daou voned.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Distreiñ gwir ma n'eo ket par an daou voned.", - "LOGIC_COMPARE_TOOLTIP_LT": "Distreiñ gwir m'eo bihanoc'h ar moned kentañ eget an eil.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Distreiñ gwir m'eo bihanoc'h ar moned kentañ eget an eil pe m'eo par dezhañ.", - "LOGIC_COMPARE_TOOLTIP_GT": "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil pe par dezhañ.", - "LOGIC_OPERATION_TOOLTIP_AND": "Distreiñ gwir m'eo gwir an da daou voned.", - "LOGIC_OPERATION_AND": "ha(g)", - "LOGIC_OPERATION_TOOLTIP_OR": "Distreiñ gwir m'eo gwir unan eus an daou voned da nebeutañ.", - "LOGIC_OPERATION_OR": "pe", - "LOGIC_NEGATE_TITLE": "nann %1", - "LOGIC_NEGATE_TOOLTIP": "Distreiñ gwir m'eo faos ar moned. Distreiñ faos m'eo gwir ar moned.", - "LOGIC_BOOLEAN_TRUE": "gwir", - "LOGIC_BOOLEAN_FALSE": "gaou", - "LOGIC_BOOLEAN_TOOLTIP": "Distreiñ pe gwir pe faos", - "LOGIC_NULL": "Null", - "LOGIC_NULL_TOOLTIP": "Distreiñ null.", - "LOGIC_TERNARY_CONDITION": "amprouad", - "LOGIC_TERNARY_IF_TRUE": "m'eo gwir", - "LOGIC_TERNARY_IF_FALSE": "m'eo gaou", - "LOGIC_TERNARY_TOOLTIP": "Gwiriañ an amplegad e 'prouad'. M'eo gwir an amplegad, distreiñ an dalvoudenn 'm'eo gwir'; anez distreiñ ar moned 'm'eo faos'.", - "MATH_NUMBER_HELPURL": "https://br.wikipedia.org/wiki/Niver", - "MATH_NUMBER_TOOLTIP": "Un niver.", - "MATH_ARITHMETIC_HELPURL": "https://br.wikipedia.org/wiki/Aritmetik", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Distreiñ sammad daou niver.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Distreiñ diforc'h daou niver", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Distreiñ liesad daou niver.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Distreiñ rannad daou niver.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Distreiñ an niver kentañ lakaet dindan gallouter an eil niver.", - "MATH_SINGLE_HELPURL": "https://br.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "gwrizienn garrez", - "MATH_SINGLE_TOOLTIP_ROOT": "Distreiñ gwrizienn garrez un niver", - "MATH_SINGLE_OP_ABSOLUTE": "dizave", - "MATH_SINGLE_TOOLTIP_ABS": "Distreiñ talvoud dizave un niver.", - "MATH_SINGLE_TOOLTIP_NEG": "Distreiñ enebad un niver", - "MATH_SINGLE_TOOLTIP_LN": "Distreiñ logaritm naturel un niver", - "MATH_SINGLE_TOOLTIP_LOG10": "Distreiñ logaritm diazez 10 un niver", - "MATH_SINGLE_TOOLTIP_EXP": "Distreiñ galloudad un niver.", - "MATH_SINGLE_TOOLTIP_POW10": "Distreiñ 10 da c'halloudad un niver.", - "MATH_TRIG_HELPURL": "https://br.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Distreiñ sinuz ur c'horn (ket e radianoù)", - "MATH_TRIG_TOOLTIP_COS": "Distreiñ kosinuz ur c'horn (ket e radianoù)", - "MATH_TRIG_TOOLTIP_TAN": "Distreiñ tangent ur c'horn (ket e radianoù).", - "MATH_TRIG_TOOLTIP_ASIN": "Distreiñ ark sinuz un niver", - "MATH_TRIG_TOOLTIP_ACOS": "Distreiñ ark kosinuz un niver", - "MATH_TRIG_TOOLTIP_ATAN": "Distreiñ ark tangent un niver", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Distreiñ unan eus digemmennoù red : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (anvevenn).", - "MATH_IS_EVEN": "zo par", - "MATH_IS_ODD": "zo ampar", - "MATH_IS_PRIME": "zo kentañ", - "MATH_IS_WHOLE": "zo anterin", - "MATH_IS_POSITIVE": "a zo pozitivel", - "MATH_IS_NEGATIVE": "a zo negativel", - "MATH_IS_DIVISIBLE_BY": "a zo rannadus dre", - "MATH_IS_TOOLTIP": "Gwiriañ m'eo par, anpar, kentañ, muiel, leiel un niverenn pe ma c'haller rannañ anezhi dre un niver roet zo. Distreiñ gwir pe faos.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "kemmañ %1 gant %2", - "MATH_CHANGE_TOOLTIP": "Ouzhpennañ un niver d'an argemm '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Rontaat un niver dindan pe a-us", - "MATH_ROUND_OPERATOR_ROUND": "Rontaat", - "MATH_ROUND_OPERATOR_ROUNDUP": "Rontaat a-us", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "Rontaat dindan", - "MATH_ONLIST_OPERATOR_SUM": "Sammad al listenn", - "MATH_ONLIST_TOOLTIP_SUM": "Distreiñ sammad an holl niveroù zo el listenn.", - "MATH_ONLIST_OPERATOR_MIN": "Izegenn al listenn", - "MATH_ONLIST_TOOLTIP_MIN": "Distreiñ an niver bihanañ el listenn", - "MATH_ONLIST_OPERATOR_MAX": "Uc'hegenn al listenn", - "MATH_ONLIST_TOOLTIP_MAX": "Distreiñ an niver brasañ el listenn.", - "MATH_ONLIST_OPERATOR_AVERAGE": "Keitat al listenn", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Distreiñ keitad (niveroniel) an talvoudennoù niverel el listenn.", - "MATH_ONLIST_OPERATOR_MEDIAN": "Kreizad al listenn", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Distreiñ an niver kreiz el listenn", - "MATH_ONLIST_OPERATOR_MODE": "modoù stankañ el listenn", - "MATH_ONLIST_TOOLTIP_MODE": "Distreiñ ul listennad elfennoù stankoc'h el listenn.", - "MATH_ONLIST_OPERATOR_STD_DEV": "forc'had standart eus al listenn", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Distreiñ forc'had standart al listenn.", - "MATH_ONLIST_OPERATOR_RANDOM": "Elfennn eus al listenn tennet d'ar sord", - "MATH_ONLIST_TOOLTIP_RANDOM": "Distreiñ un elfenn zargouezhek el listenn", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "rest eus %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Distreiñ dilerc'h rannadur an div niver", - "MATH_CONSTRAIN_TITLE": "destrizhañ %1 etre %2 ha %3", - "MATH_CONSTRAIN_TOOLTIP": "Destrizhañ un niver da vezañ etre ar bevennoù spisaet (enlakaet)", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "anterin dargouezhek etre %1 ha %2", - "MATH_RANDOM_INT_TOOLTIP": "Distreiñ un anterin dargouezhek etre an div vevenn spisaet, endalc'het.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Rann dargouezhek", - "MATH_RANDOM_FLOAT_TOOLTIP": "Distreiñ ur rann dargouezhek etre 0.0 (enkaelat) hag 1.0 (ezkaelat).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Ul lizherenn, ur ger pe ul linennad testenn.", - "TEXT_JOIN_TITLE_CREATEWITH": "krouiñ un destenn gant", - "TEXT_JOIN_TOOLTIP": "Krouit un tamm testenn en ur gevelstrollañ un niver bennak a elfennoù", - "TEXT_CREATE_JOIN_TITLE_JOIN": "stagañ", - "TEXT_CREATE_JOIN_TOOLTIP": "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h testenn-mañ.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Ouzhpennañ un elfenn d'an destenn.", - "TEXT_APPEND_TO": "da", - "TEXT_APPEND_APPENDTEXT": "ouzhpennañ an destenn", - "TEXT_APPEND_TOOLTIP": "Ouzhpennañ testenn d'an argemmenn'%1'.", - "TEXT_LENGTH_TITLE": "hirder %1", - "TEXT_LENGTH_TOOLTIP": "Distreiñ an niver a lizherennoù(en ur gontañ an esaouennoù e-barzh) en destenn roet.", - "TEXT_ISEMPTY_TITLE": "%1 zo goullo", - "TEXT_ISEMPTY_TOOLTIP": "Adkas gwir m'eo goullo an destenn roet.", - "TEXT_INDEXOF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ 0 ma n'eo ket kavet ar chadenn.", - "TEXT_INDEXOF_INPUT_INTEXT": "en destenn", - "TEXT_INDEXOF_OPERATOR_FIRST": "kavout reveziadenn gentañ an destenn", - "TEXT_INDEXOF_OPERATOR_LAST": "kavout reveziadenn diwezhañ an destenn", - "TEXT_CHARAT_INPUT_INTEXT": "en destenn", - "TEXT_CHARAT_FROM_START": "Kaout al lizherenn #", - "TEXT_CHARAT_FROM_END": "Kaout al lizherenn # adalek an dibenn.", - "TEXT_CHARAT_FIRST": "tapout al lizherenn gentañ", - "TEXT_CHARAT_LAST": "tapout al lizherenn ziwezhañ", - "TEXT_CHARAT_RANDOM": "Kaout ul lizherenn dre zegouezh", - "TEXT_CHARAT_TOOLTIP": "Distreiñ al lizherenn d'al lec'h spisaet.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Distreiñ un tamm spisaet eus an destenn.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "en destenn", - "TEXT_GET_SUBSTRING_START_FROM_START": "Kaout an ischadenn adalek al lizherenn #", - "TEXT_GET_SUBSTRING_START_FROM_END": "Kaout an ischadenn adalek al lizherenn # betek an dibenn", - "TEXT_GET_SUBSTRING_START_FIRST": "Kaout an ischadenn adalek al lizherenn gentañ", - "TEXT_GET_SUBSTRING_END_FROM_START": "betek al lizherenn #", - "TEXT_GET_SUBSTRING_END_FROM_END": "Betek al lizherenn # adalek an dibenn.", - "TEXT_GET_SUBSTRING_END_LAST": "d'al lizherenn diwezhañ", - "TEXT_CHANGECASE_TOOLTIP": "Distreiñ un eilenn eus an eilenn en un direnneg all", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "e PENNLIZHERENNOÙ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "e lizherennoù bihan", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Gant Ur Bennlizherenn E Deroù Pep Ger", - "TEXT_TRIM_TOOLTIP": "Distreiñ un eilenn eus an destenn gant an esaouennoù lamet eus un tu pe eus an daou du", - "TEXT_TRIM_OPERATOR_BOTH": "Lemel an esaouennoù en daou du", - "TEXT_TRIM_OPERATOR_LEFT": "Lemel an esaouennoù eus an tu kleiz", - "TEXT_TRIM_OPERATOR_RIGHT": "Lemel an esaouennoù eus an tu dehou", - "TEXT_PRINT_TITLE": "moullañ %1", - "TEXT_PRINT_TOOLTIP": "Moullañ an destenn, an niverenn pe un dalvoudenn spisaet all", - "TEXT_PROMPT_TYPE_TEXT": "pedadenn evit un destenn gant ur c'hemennad", - "TEXT_PROMPT_TYPE_NUMBER": "pedadenn evit un niver gant ur c'hemennad", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Goulenn un niver gant an implijer.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Goulenn un destenn gant an implijer.", - "LISTS_CREATE_EMPTY_TITLE": "krouiñ ur roll goullo", - "LISTS_CREATE_EMPTY_TOOLTIP": "Distreiñ ul listenn, 0 a hirder, n'eus enrolladenn ebet enni", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Krouiñ ur roll gant un niver bennak a elfennoù.", - "LISTS_CREATE_WITH_INPUT_WITH": "krouiñ ur roll gant", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "roll", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h listenn-mañ.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ouzhpennañ un elfenn d'ar roll", - "LISTS_REPEAT_TOOLTIP": "Krouiñ ul listenn a c'hoarvez eus an dalvoudenn roet arreet an niver a wech meneget", - "LISTS_REPEAT_TITLE": "Krouiñ ul listenn gant an elfenn %1 arreet div wech", - "LISTS_LENGTH_TITLE": "hirder %1", - "LISTS_LENGTH_TOOLTIP": "Distreiñ hirder ul listenn.", - "LISTS_ISEMPTY_TITLE": "%1 zo goullo", - "LISTS_ISEMPTY_TOOLTIP": "Distreiñ gwir m'eo goullo al listenn.", - "LISTS_INLIST": "el listenn", - "LISTS_INDEX_OF_FIRST": "kavout reveziadenn gentañ un elfenn", - "LISTS_INDEX_OF_LAST": "kavout reveziadenn diwezhañ un elfenn", - "LISTS_INDEX_OF_TOOLTIP": "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ 0 ma n'eo ket kavet an destenn.", - "LISTS_GET_INDEX_GET": "tapout", - "LISTS_GET_INDEX_GET_REMOVE": "tapout ha lemel", - "LISTS_GET_INDEX_REMOVE": "lemel", - "LISTS_GET_INDEX_FROM_END": "# adalek ar fin", - "LISTS_GET_INDEX_FIRST": "kentañ", - "LISTS_GET_INDEX_LAST": "diwezhañ", - "LISTS_GET_INDEX_RANDOM": "dre zegouezh", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Distreiñ an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Distreiñ an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Distreiñ an elfenn gentañ en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Distreiñ un elfenn diwezhañ en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Distreiñ un elfenn dre zegouezh en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Lemel ha distreiñ a ra an elfenn gentañ en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Lemel ha distreiñ a ra an elfenn diwezhañ en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Lemel ha distreiñ a ra an elfenn dre zegouezh en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Lemel a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Lemel a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Lemel a ra an elfenn gentañ en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Distreiñ a ra an elfenn diwezhañ en ul listenn.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Lemel a ra un elfenn dre zegouezh en ul listenn.", - "LISTS_SET_INDEX_SET": "termenañ", - "LISTS_SET_INDEX_INSERT": "ensoc'hañ evel", - "LISTS_SET_INDEX_INPUT_TO": "evel", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Termenañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn ziwezhañ.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Termenañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn diwezhañ.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Termenañ a ra an elfenn gentañ en ul listenn.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Termenañ a ra an elfenn diwezhañ en ul listenn.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Termenañ a ra un elfenn dre zegouezh en ul listenn.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn. #1 eo an elfenn gentañ.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Ensoc'hañ a ra an elfenn e deroù ul listenn.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Ouzhpennañ a ra an elfenn e fin al listenn.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Ensoc'hañ a ra an elfenn dre zegouezh en ul listenn.", - "LISTS_GET_SUBLIST_START_FROM_START": "Kaout an islistenn adalek #", - "LISTS_GET_SUBLIST_START_FROM_END": "Kaout an islistenn adalek # adalek an dibenn", - "LISTS_GET_SUBLIST_START_FIRST": "Kaout an islistenn adalek an deroù", - "LISTS_GET_SUBLIST_END_FROM_START": "da #", - "LISTS_GET_SUBLIST_END_FROM_END": "betek # adalek an dibenn", - "LISTS_GET_SUBLIST_END_LAST": "betek ar fin", - "LISTS_GET_SUBLIST_TOOLTIP": "Krouiñ un eilad eus lodenn spisaet ul listenn.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "Krouiñ ul listenn diwar an destenn", - "LISTS_SPLIT_TEXT_FROM_LIST": "Krouiñ un destenn diwar al listenn", - "LISTS_SPLIT_WITH_DELIMITER": "gant an dispartier", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Troc'hañ un destenn en ul listennad testennoù, o troc'hañ e pep dispartier.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Bodañ ul listennad testennoù en ul listenn hepken, o tispartiañ anezho gant un dispartier.", - "VARIABLES_GET_TOOLTIP": "Distreiñ talvoud an argemm-mañ.", - "VARIABLES_GET_CREATE_SET": "Krouiñ 'termenañ %1'", - "VARIABLES_SET": "termenañ %1 da %2", - "VARIABLES_SET_TOOLTIP": "Termenañ a ra argemm-mañ evit ma vo par da dalvoudenn ar moned.", - "VARIABLES_SET_CREATE_GET": "Krouiñ 'kaout %1'", - "PROCEDURES_DEFNORETURN_TITLE": "da", - "PROCEDURES_DEFNORETURN_PROCEDURE": "ober un dra bennak", - "PROCEDURES_BEFORE_PARAMS": "gant :", - "PROCEDURES_CALL_BEFORE_PARAMS": "gant :", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Krouiñ un arc'hwel hep mont er-maez.", - "PROCEDURES_DEFRETURN_RETURN": "distreiñ", - "PROCEDURES_DEFRETURN_TOOLTIP": "Kouiñ un arc'hwel gant ur mont er-maez", - "PROCEDURES_ALLOW_STATEMENTS": "aotren an disklêriadurioù", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Diwallit : an arc'hwel-mañ en deus arventennoù eiladet.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Seveniñ an arc'hwel '%1' termenet gant an implijer.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Seveniñ an arc'hwel '%1' termenet gant an implijer hag implijout e zisoc'h.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "Monedoù", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Ouzhpennañ, lemel, pe adkempenn monedoù an arc'hwel-mañ.", - "PROCEDURES_MUTATORARG_TITLE": "Anv ar moned", - "PROCEDURES_MUTATORARG_TOOLTIP": "Ouzhpennañ ur moned d'an arc'hwel.", - "PROCEDURES_HIGHLIGHT_DEF": "Dreislinennañ termenadur an arc'hwel", - "PROCEDURES_CREATE_DO": "Krouiñ '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Ma'z eo gwir un dalvoudenn, distreiñ un eil talvoudenn neuze.", - "PROCEDURES_IFRETURN_WARNING": "Diwallit : Gallout a rafe ar bloc'h bezañ implijet e termenadur un arc'hwel hepken." -} diff --git a/msg/json/ca.json b/msg/json/ca.json deleted file mode 100644 index 3fbab9acb8..0000000000 --- a/msg/json/ca.json +++ /dev/null @@ -1,299 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Alvaro Vidal-Abarca", - "Espertus", - "Hiperpobla", - "Jaumeortola" - ] - }, - "VARIABLES_DEFAULT_NAME": "element", - "DUPLICATE_BLOCK": "Duplica", - "ADD_COMMENT": "Afegeix un comentari", - "REMOVE_COMMENT": "Elimina el comentari", - "EXTERNAL_INPUTS": "Entrades externes", - "INLINE_INPUTS": "Entrades en línia", - "DELETE_BLOCK": "Esborra bloc", - "DELETE_X_BLOCKS": "Esborra %1 blocs", - "DELETE_ALL_BLOCKS": "Esborrar els %1 blocs?", - "COLLAPSE_BLOCK": "Contraure bloc", - "COLLAPSE_ALL": "Contraure blocs", - "EXPAND_BLOCK": "Expandir bloc", - "EXPAND_ALL": "Expandir blocs", - "DISABLE_BLOCK": "Desactiva bloc", - "ENABLE_BLOCK": "Activa bloc", - "HELP": "Ajuda", - "CHAT": "Xateja amb el teu col·laborador escrivint en aquest quadre!", - "AUTH": "Si us plau, autoritzeu que aquesta aplicació pugui desar la vostra feina i que la pugueu compartir.", - "ME": "Jo", - "CHANGE_VALUE_TITLE": "Canvia valor:", - "NEW_VARIABLE": "Nova variable...", - "NEW_VARIABLE_TITLE": "Nou nom de variable:", - "RENAME_VARIABLE": "Reanomena variable...", - "RENAME_VARIABLE_TITLE": "Reanomena totes les variables '%1' a:", - "COLOUR_PICKER_HELPURL": "https://ca.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Escolliu un color de la paleta.", - "COLOUR_RANDOM_TITLE": "color aleatori", - "COLOUR_RANDOM_TOOLTIP": "Escolliu un color a l'atzar.", - "COLOUR_RGB_TITLE": "color amb", - "COLOUR_RGB_RED": "vermell", - "COLOUR_RGB_GREEN": "verd", - "COLOUR_RGB_BLUE": "blau", - "COLOUR_RGB_TOOLTIP": "Crear un color amb les quantitats especificades de vermell, verd i blau. Tots els valors han de ser entre 0 i 100.", - "COLOUR_BLEND_TITLE": "barreja", - "COLOUR_BLEND_COLOUR1": "color 1", - "COLOUR_BLEND_COLOUR2": "color 2", - "COLOUR_BLEND_RATIO": "proporció", - "COLOUR_BLEND_TOOLTIP": "Barreja dos colors amb una proporció donada (0,0 - 1,0).", - "CONTROLS_REPEAT_HELPURL": "https://ca.wikipedia.org/wiki/Bucle_For", - "CONTROLS_REPEAT_TITLE": "repetir %1 vegades", - "CONTROLS_REPEAT_INPUT_DO": "fer", - "CONTROLS_REPEAT_TOOLTIP": "Executar unes sentències diverses vegades.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repetir mentre", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repetir fins que", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Mentre un valor sigui cert, llavors executar unes sentències.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Mentre un valor sigui fals, llavors executar unes sentències.", - "CONTROLS_FOR_TOOLTIP": "Fer que la variable \"%1\" prengui els valors des del nombre inicial fins al nombre final, incrementant a cada pas l'interval indicat, i executar els blocs especificats.", - "CONTROLS_FOR_TITLE": "comptar amb %1 des de %2 fins a %3 en increments de %4", - "CONTROLS_FOREACH_TITLE": "per a cada element %1 en la llista %2", - "CONTROLS_FOREACH_TOOLTIP": "Per a cada element en la llista, desar l'element dins la variable '%1', i llavors executar unes sentències.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "sortir del bucle", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continuar amb la següent iteració del bucle", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Sortir del bucle interior.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Ometre la resta d'aquest bucle, i continuar amb la següent iteració.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Advertència: Aquest bloc només es pot utilitzar dins d'un bucle.", - "CONTROLS_IF_TOOLTIP_1": "Si un valor és cert, llavors executar unes sentències.", - "CONTROLS_IF_TOOLTIP_2": "Si un valor és cert, llavors executar el primer bloc de sentències. En cas contrari, executar el segon bloc de sentències.", - "CONTROLS_IF_TOOLTIP_3": "Si el primer valor és cert, llavors executar el primer bloc de sentències. En cas contrari, si el segon valor és cert, executar el segon bloc de sentències.", - "CONTROLS_IF_TOOLTIP_4": "Si el primer valor és cert, llavors executar el primer bloc de sentències. En cas contrari, si el segon valor és cert, executar el segon bloc de sentències. Si cap dels valors és cert, executar l'últim bloc de sentències.", - "CONTROLS_IF_MSG_IF": "si", - "CONTROLS_IF_MSG_ELSEIF": "si no, si", - "CONTROLS_IF_MSG_ELSE": "si no", - "CONTROLS_IF_IF_TOOLTIP": "Afegeix, esborra o reordena seccions per reconfigurar aquest bloc 'si'.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Afegeix una condició al bloc 'si'.", - "CONTROLS_IF_ELSE_TOOLTIP": "Afegeix una condició final, que recull qualsevol altra possibilitat, al bloc 'si'.", - "LOGIC_COMPARE_HELPURL": "https://ca.wikipedia.org/wiki/Inequaci%C3%B3", - "LOGIC_COMPARE_TOOLTIP_EQ": "Retorna cert si totes dues entrades són iguals.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Retorna cert si totes dues entrades són diferents.", - "LOGIC_COMPARE_TOOLTIP_LT": "Retorna cert si la primera entrada és més petita que la segona entrada.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Retorna cert si la primera entra és més petita o igual a la segona entrada.", - "LOGIC_COMPARE_TOOLTIP_GT": "Retorna cert si la primera entrada és més gran que la segona entrada.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Retorna cert si la primera entrada és més gran o igual a la segona entrada.", - "LOGIC_OPERATION_TOOLTIP_AND": "Retorna cer si totes dues entrades són certes.", - "LOGIC_OPERATION_AND": "i", - "LOGIC_OPERATION_TOOLTIP_OR": "Retorna cert si almenys una de les entrades és certa.", - "LOGIC_OPERATION_OR": "o", - "LOGIC_NEGATE_TITLE": "no %1", - "LOGIC_NEGATE_TOOLTIP": "Retorna cert si l'entrada és falsa. Retorna fals si l'entrada és certa.", - "LOGIC_BOOLEAN_TRUE": "cert", - "LOGIC_BOOLEAN_FALSE": "fals", - "LOGIC_BOOLEAN_TOOLTIP": "Retorna o bé cert o bé fals.", - "LOGIC_NULL": "nul", - "LOGIC_NULL_TOOLTIP": "Retorna nul.", - "LOGIC_TERNARY_CONDITION": "condició", - "LOGIC_TERNARY_IF_TRUE": "si és cert", - "LOGIC_TERNARY_IF_FALSE": "si és fals", - "LOGIC_TERNARY_TOOLTIP": "Comprova la condició de 'condició'. Si la condició és certa, retorna el valor 'si és cert'; en cas contrari, retorna el valor 'si és fals'.", - "MATH_NUMBER_HELPURL": "https://ca.wikipedia.org/wiki/Nombre", - "MATH_NUMBER_TOOLTIP": "Un nombre.", - "MATH_ARITHMETIC_HELPURL": "https://ca.wikipedia.org/wiki/Aritm%C3%A8tica", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Retorna la suma dels dos nombres.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Retorna la diferència entre els dos nombres.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Retorna el producte del dos nombres.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Retorna el quocient dels dos nombres.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Retorna el primer nombre elevat a la potència indicada pel segon nombre.", - "MATH_SINGLE_HELPURL": "https://ca.wikipedia.org/wiki/Arrel_quadrada", - "MATH_SINGLE_OP_ROOT": "arrel quadrada", - "MATH_SINGLE_TOOLTIP_ROOT": "Retorna l'arrel quadrada d'un nombre.", - "MATH_SINGLE_OP_ABSOLUTE": "absolut", - "MATH_SINGLE_TOOLTIP_ABS": "Retorna el valor absolut d'un nombre.", - "MATH_SINGLE_TOOLTIP_NEG": "Retorna l'oposat d'un nombre.", - "MATH_SINGLE_TOOLTIP_LN": "Retorna el logaritme natural d'un nombre.", - "MATH_SINGLE_TOOLTIP_LOG10": "Retorna el logaritme en base 10 d'un nombre.", - "MATH_SINGLE_TOOLTIP_EXP": "Retorna ''e'' elevat a la potència del nombre indicat.", - "MATH_SINGLE_TOOLTIP_POW10": "Retorna 10 elevat a la potència del nombre indicat.", - "MATH_TRIG_HELPURL": "https://ca.wikipedia.org/wiki/Funci%C3%B3_trigonom%C3%A8trica", - "MATH_TRIG_TOOLTIP_SIN": "Retorna el sinus d'un grau (no radiant).", - "MATH_TRIG_TOOLTIP_COS": "Retorna el cosinus d'un grau (no radiant).", - "MATH_TRIG_TOOLTIP_TAN": "Retorna la tangent d'un grau (no radiant).", - "MATH_TRIG_TOOLTIP_ASIN": "Retorna l'arcsinus d'un nombre.", - "MATH_TRIG_TOOLTIP_ACOS": "Retorna l'arccosinus d'un nombre.", - "MATH_TRIG_TOOLTIP_ATAN": "Retorna l'arctangent d'un nombre.", - "MATH_CONSTANT_HELPURL": "https://ca.wikipedia.org/wiki/Constant_matem%C3%A0tica", - "MATH_CONSTANT_TOOLTIP": "Retorna una de les constants més habituals: π (3,141…), e (2,718…), φ (1,618…), sqrt(2) (1,414…), sqrt(½) (0,707…), o ∞ (infinit).", - "MATH_IS_EVEN": "és parell", - "MATH_IS_ODD": "és senar", - "MATH_IS_PRIME": "és primer", - "MATH_IS_WHOLE": "és enter", - "MATH_IS_POSITIVE": "és positiu", - "MATH_IS_NEGATIVE": "és negatiu", - "MATH_IS_DIVISIBLE_BY": "és divisible per", - "MATH_IS_TOOLTIP": "Comprova si un nombre és parell, senar, enter, positium negatiu, o si és divisible per un cert nombre. Retorna cert o fals.", - "MATH_CHANGE_HELPURL": "https://ca.wikipedia.org/wiki/Suma", - "MATH_CHANGE_TITLE": "canvia %1 per %2", - "MATH_CHANGE_TOOLTIP": "Afegeix un nombre a la variable '%1'.", - "MATH_ROUND_HELPURL": "https://ca.wikipedia.org/wiki/Arrodoniment", - "MATH_ROUND_TOOLTIP": "Arrodonir un nombre cap amunt o cap avall.", - "MATH_ROUND_OPERATOR_ROUND": "arrodonir", - "MATH_ROUND_OPERATOR_ROUNDUP": "arrodonir cap amunt", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "arrodonir cap avall", - "MATH_ONLIST_OPERATOR_SUM": "suma de llista", - "MATH_ONLIST_TOOLTIP_SUM": "Retorna la suma de tots els nombres de la llista.", - "MATH_ONLIST_OPERATOR_MIN": "mínim de llista", - "MATH_ONLIST_TOOLTIP_MIN": "Retorna el nombre més petit de la llista.", - "MATH_ONLIST_OPERATOR_MAX": "màxim de llista", - "MATH_ONLIST_TOOLTIP_MAX": "Retorna el nombre més gran de la llista.", - "MATH_ONLIST_OPERATOR_AVERAGE": "mitjana de llista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Retorna la mitjana (mitjana aritmètica) dels valors numèrics de la llista.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana de llista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Retorna la mediana de la llista.", - "MATH_ONLIST_OPERATOR_MODE": "moda de llista", - "MATH_ONLIST_TOOLTIP_MODE": "Retorna una llista dels elements que apareixen més vegades a la llista.", - "MATH_ONLIST_OPERATOR_STD_DEV": "desviació estàndard de llista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Retorna la desviació estàndard de la llista.", - "MATH_ONLIST_OPERATOR_RANDOM": "element aleatori de llista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Retorna un element aleatori de la lllista.", - "MATH_MODULO_HELPURL": "https://ca.wikipedia.org/wiki/Residu_%28aritm%C3%A8tica%29", - "MATH_MODULO_TITLE": "residu de %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Retorna el residu de dividir els dos nombres.", - "MATH_CONSTRAIN_TITLE": "limitar %1 entre %2 i %3", - "MATH_CONSTRAIN_TOOLTIP": "Limita un nombre perquè estigui entre els límits especificats (inclosos).", - "MATH_RANDOM_INT_HELPURL": "https://ca.wikipedia.org/wiki/Generaci%C3%B3_de_nombres_aleatoris", - "MATH_RANDOM_INT_TITLE": "nombre aleatori entre %1 i %2", - "MATH_RANDOM_INT_TOOLTIP": "Retorna un nombre aleatori entre els dos límits especificats, inclosos.", - "MATH_RANDOM_FLOAT_HELPURL": "https://ca.wikipedia.org/wiki/Generaci%C3%B3_de_nombres_aleatoris", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fracció aleatòria", - "MATH_RANDOM_FLOAT_TOOLTIP": "Retorna una fracció aleatòria entre 0,0 (inclòs) i 1,0 (exclòs).", - "TEXT_TEXT_HELPURL": "https://ca.wikipedia.org/wiki/Cadena_%28inform%C3%A0tica%29", - "TEXT_TEXT_TOOLTIP": "Una lletra, paraula o línia de text.", - "TEXT_JOIN_TITLE_CREATEWITH": "crear text amb", - "TEXT_JOIN_TOOLTIP": "Crea un tros de text per unió de qualsevol nombre d'elements.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "unir", - "TEXT_CREATE_JOIN_TOOLTIP": "Afegeix, esborrar o reordenar seccions per reconfigurar aquest bloc de text.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Afegeix un element al text.", - "TEXT_APPEND_TO": "a", - "TEXT_APPEND_APPENDTEXT": "afegir text", - "TEXT_APPEND_TOOLTIP": "Afegir un text a la variable '%1'.", - "TEXT_LENGTH_TITLE": "llargària de %1", - "TEXT_LENGTH_TOOLTIP": "Retorna el nombre de lletres (espais inclosos) en el text proporcionat.", - "TEXT_ISEMPTY_TITLE": "%1 està buit", - "TEXT_ISEMPTY_TOOLTIP": "Retorna cert si el text proporcionat està buit.", - "TEXT_INDEXOF_TOOLTIP": "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna 0 si no es troba el text.", - "TEXT_INDEXOF_INPUT_INTEXT": "en el text", - "TEXT_INDEXOF_OPERATOR_FIRST": "trobar la primera aparició del text", - "TEXT_INDEXOF_OPERATOR_LAST": "trobar l'última aparició del text", - "TEXT_CHARAT_INPUT_INTEXT": "en el text", - "TEXT_CHARAT_FROM_START": "recupera la lletra núm.#", - "TEXT_CHARAT_FROM_END": "recupera la lletra núm.# des del final", - "TEXT_CHARAT_FIRST": "recupera la primera lletra", - "TEXT_CHARAT_LAST": "recupera l'última lletra", - "TEXT_CHARAT_RANDOM": "recupera una lletra a l'atzar", - "TEXT_CHARAT_TOOLTIP": "Recupera la lletra de la posició especificada.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Recupera una part especificada del text.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "en el text", - "TEXT_GET_SUBSTRING_START_FROM_START": "recupera subcadena des de la lletra núm.#", - "TEXT_GET_SUBSTRING_START_FROM_END": "recupera subcadena des de la lletra núm.# des del final", - "TEXT_GET_SUBSTRING_START_FIRST": "recupera subcadena des de la primera lletra", - "TEXT_GET_SUBSTRING_END_FROM_START": "fins a la lletra núm.#", - "TEXT_GET_SUBSTRING_END_FROM_END": "fins a la lletra núm.# des del final", - "TEXT_GET_SUBSTRING_END_LAST": "fins a l'última lletra", - "TEXT_CHANGECASE_TOOLTIP": "Retorna una còpia del text amb diferents majúscules/minúscules.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "a MAJÚSCULES", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "a minúscules", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "a Text De Títol", - "TEXT_TRIM_TOOLTIP": "Retorna una còpia del text on s'han esborrat els espais d'un o dels dos extrems.", - "TEXT_TRIM_OPERATOR_BOTH": "retalla espais de tots dos extrems de", - "TEXT_TRIM_OPERATOR_LEFT": "retalla espais de l'esquerra de", - "TEXT_TRIM_OPERATOR_RIGHT": "retalla espais de la dreta de", - "TEXT_PRINT_TITLE": "imprimir %1", - "TEXT_PRINT_TOOLTIP": "Imprimir el text, el nombre o altre valor especificat.", - "TEXT_PROMPT_TYPE_TEXT": "demanar text amb el missatge", - "TEXT_PROMPT_TYPE_NUMBER": "demanar un nombre amb el missatge", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Demana que l'usuari introdueixi un nombre.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Demana que l'usuari introdueixi un text.", - "LISTS_CREATE_EMPTY_TITLE": "crear llista buida", - "LISTS_CREATE_EMPTY_TOOLTIP": "Retorna una llista, de longitud 0, que no conté cap dada.", - "LISTS_CREATE_WITH_TOOLTIP": "Crea una llista amb qualsevol nombre d'elements.", - "LISTS_CREATE_WITH_INPUT_WITH": "crear llista amb", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "llista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Afegeix, esborra o reordena seccions per reconfigurar aquest bloc de llista.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Afegeix un element a la llista.", - "LISTS_REPEAT_TOOLTIP": "Crea una llista formada pel valor donat, repetit tantes vegades com s'indiqui.", - "LISTS_REPEAT_TITLE": "crea llista amb element %1 repetit %2 vegades", - "LISTS_LENGTH_TITLE": "longitud de %1", - "LISTS_LENGTH_TOOLTIP": "Retorna la longitud d'una llista.", - "LISTS_ISEMPTY_TITLE": "%1 és buida", - "LISTS_ISEMPTY_TOOLTIP": "Retorna cert si la llista és buida.", - "LISTS_INLIST": "en la llista", - "LISTS_INDEX_OF_FIRST": "buscar primera aparició d'un element", - "LISTS_INDEX_OF_LAST": "buscar última aparició d'un element", - "LISTS_INDEX_OF_TOOLTIP": "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna 0 si no s'hi troba el text.", - "LISTS_GET_INDEX_GET": "recupera", - "LISTS_GET_INDEX_GET_REMOVE": "recupera i esborra", - "LISTS_GET_INDEX_REMOVE": "esborra", - "LISTS_GET_INDEX_FROM_END": "núm.# des del final", - "LISTS_GET_INDEX_FIRST": "primer", - "LISTS_GET_INDEX_LAST": "últim", - "LISTS_GET_INDEX_RANDOM": "a l'atzar", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Retorna l'element de la posició especificada a la llista. #1 és el primer element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Retorna l'element de la posició especificada a la llista. #1 és l'últim element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Retorna el primer element d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Retorna l'últim element d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Retorna un element a l'atzar d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Esborra i retorna l'element de la posició especificada de la llista. #1 és el primer element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Esborra i retorna l'element de la posició especificada de la llista. #1 és l'últim element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Esborra i retorna el primer element d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Esborra i retorna l'últim element d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Esborra i retorna un element a l'atzar d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Esborra l'element de la posició especificada de la llista. #1 és el primer element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Esborra l'element de la posició especificada de la llista. #1 és l'últim element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Esborra el primer element d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Esborra l'últim element d'una llista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Esborra un element a l'atzar d'una llista.", - "LISTS_SET_INDEX_SET": "modifica", - "LISTS_SET_INDEX_INSERT": "insereix a", - "LISTS_SET_INDEX_INPUT_TO": "com", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Modifica l'element de la posició especificada d'una llista. #1 és el primer element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Modifica l'element de la posició especificada d'una llista. #1 és l'últim element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Modifica el primer element d'una llista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Modifica l'últim element d'una llista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Modifica un element a l'atzar d'una llista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insereix l'element a la posició especificada d'una llista. #1 és el primer element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insereix l'element a la posició especificada d'una llista. #1 és l'últim element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insereix l'element al principi d'una llista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Afegeix l'element al final d'una llista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insereix l'element en una posició a l'atzar d'una llista.", - "LISTS_GET_SUBLIST_START_FROM_START": "recupera sub-llista des de #", - "LISTS_GET_SUBLIST_START_FROM_END": "recupera sub-llista des de # des del final", - "LISTS_GET_SUBLIST_START_FIRST": "recupera sub-llista des del principi", - "LISTS_GET_SUBLIST_END_FROM_START": "fins #", - "LISTS_GET_SUBLIST_END_FROM_END": "fins # des del final", - "LISTS_GET_SUBLIST_END_LAST": "fins l'últim", - "LISTS_GET_SUBLIST_TOOLTIP": "Crea una còpia de la part especificada d'una llista.", - "VARIABLES_GET_TOOLTIP": "Retorna el valor d'aquesta variable.", - "VARIABLES_GET_CREATE_SET": "Crea 'modifica %1'", - "VARIABLES_SET": "modifica %1 a %2", - "VARIABLES_SET_TOOLTIP": "Modifica aquesta variable al valor introduït.", - "VARIABLES_SET_CREATE_GET": "Crear 'recupera %1'", - "PROCEDURES_DEFNORETURN_TITLE": "a", - "PROCEDURES_DEFNORETURN_PROCEDURE": "fes alguna cosa", - "PROCEDURES_BEFORE_PARAMS": "amb:", - "PROCEDURES_CALL_BEFORE_PARAMS": "amb:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Crea una funció sense sortida.", - "PROCEDURES_DEFRETURN_RETURN": "retorna", - "PROCEDURES_DEFRETURN_TOOLTIP": "Crea una funció amb una sortida.", - "PROCEDURES_ALLOW_STATEMENTS": "permetre declaracions", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Advertència: Aquesta funció té paràmetres duplicats.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://ca.wikipedia.org/wiki/Procediment_%28Programació%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Executa la funció definida per usuari '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://ca.wikipedia.org/wiki/Procediment_%28Programació%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Executa la funció definida per l'usuari '%1' i utilitza la seva sortida.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "entrades", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Afegir, eliminar o canviar l'ordre de les entrades per aquesta funció.", - "PROCEDURES_MUTATORARG_TITLE": "nom d'entrada:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Afegir una entrada per la funció.", - "PROCEDURES_HIGHLIGHT_DEF": "Iluminar la definició de la funció", - "PROCEDURES_CREATE_DO": "Crear '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Si el valor és cert, llavors retorna un segon valor.", - "PROCEDURES_IFRETURN_WARNING": "Advertència: Aquest bloc només es pot utilitzar dins de la definició d'una funció." -} diff --git a/msg/json/cs.json b/msg/json/cs.json deleted file mode 100644 index acfb323886..0000000000 --- a/msg/json/cs.json +++ /dev/null @@ -1,319 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Chmee2", - "Rosnicka.kacka", - "Matěj Grabovský", - "Espertus", - "Utar", - "Clon" - ] - }, - "VARIABLES_DEFAULT_NAME": "položka", - "TODAY": "Dnes", - "DUPLICATE_BLOCK": "zdvojit", - "ADD_COMMENT": "Přidat komentář", - "REMOVE_COMMENT": "Odstranit komentář", - "EXTERNAL_INPUTS": "vnější vstupy", - "INLINE_INPUTS": "Vložené vstupy", - "DELETE_BLOCK": "Odstranit blok", - "DELETE_X_BLOCKS": "Odstranit %1 bloky", - "DELETE_ALL_BLOCKS": "Odstranit všechny bloky %1?", - "CLEAN_UP": "Uspořádat bloky", - "COLLAPSE_BLOCK": "Skrýt blok", - "COLLAPSE_ALL": "Skrýt bloky", - "EXPAND_BLOCK": "Rozbalení bloku", - "EXPAND_ALL": "Rozbalit bloky", - "DISABLE_BLOCK": "Zakázat blok", - "ENABLE_BLOCK": "Povolit blok", - "HELP": "Nápověda", - "CHAT": "Psaním do tohoto políčka komunikujte se spolupracovníky!", - "AUTH": "Prosím udělte oprávnění této aplikaci aby jste mohli uložit svou práci a aby vaše práce mohla být sdílena vaším jménem.", - "ME": "Já", - "CHANGE_VALUE_TITLE": "Změna hodnoty:", - "NEW_VARIABLE": "Nová proměnná...", - "NEW_VARIABLE_TITLE": "Nový název proměnné:", - "RENAME_VARIABLE": "Přejmenovat proměnné...", - "RENAME_VARIABLE_TITLE": "Přejmenujte všechny proměnné '%1':", - "COLOUR_PICKER_HELPURL": "https://cs.wikipedia.org/wiki/Barva", - "COLOUR_PICKER_TOOLTIP": "Vyberte barvu z palety.", - "COLOUR_RANDOM_TITLE": "náhodná barva", - "COLOUR_RANDOM_TOOLTIP": "Zvolte barvu náhodně.", - "COLOUR_RGB_TITLE": "barva s", - "COLOUR_RGB_RED": "červená", - "COLOUR_RGB_GREEN": "zelená", - "COLOUR_RGB_BLUE": "modrá", - "COLOUR_RGB_TOOLTIP": "Vytvoř barvu se zadaným množstvím červené, zelené a modré. Všechny hodnoty musí být mezi 0 a 100.", - "COLOUR_BLEND_TITLE": "smíchat", - "COLOUR_BLEND_COLOUR1": "barva 1", - "COLOUR_BLEND_COLOUR2": "barva 2", - "COLOUR_BLEND_RATIO": "poměr", - "COLOUR_BLEND_TOOLTIP": "Smíchá dvě barvy v daném poměru (0.0–1.0).", - "CONTROLS_REPEAT_HELPURL": "https://cs.wikipedia.org/wiki/Cyklus_for", - "CONTROLS_REPEAT_TITLE": "opakovat %1 krát", - "CONTROLS_REPEAT_INPUT_DO": "udělej", - "CONTROLS_REPEAT_TOOLTIP": "Proveď určité příkazy několikrát.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "opakovat když", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "opakovat dokud", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Dokud je hodnota pravdivá, prováděj určité příkazy.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Dokud je hodnota nepravdivá, prováděj určité příkazy.", - "CONTROLS_FOR_TOOLTIP": "Nechá proměnnou '%1' nabývat hodnot od počátečního do koncového čísla po daném přírůstku a provádí ní příslušné bloky.", - "CONTROLS_FOR_TITLE": "počítat s %1 od %2 do %3 po %4", - "CONTROLS_FOREACH_TITLE": "pro každou položku %1 v seznamu %2", - "CONTROLS_FOREACH_TOOLTIP": "Pro každou položku v seznamu nastavte do proměnné '%1' danou položku a proveďte nějaké operace.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "vymanit se ze smyčky", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "pokračuj dalším opakováním smyčky", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Přeruš vnitřní smyčku.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Přeskoč zbytek této smyčky a pokračuj dalším opakováním.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Upozornění: Tento blok může být použit pouze uvnitř smyčky.", - "CONTROLS_IF_TOOLTIP_1": "Je-li hodnota pravda, proveď určité příkazy.", - "CONTROLS_IF_TOOLTIP_2": "Je-li hodnota pravda, proveď první blok příkazů. V opačném případě proveď druhý blok příkazů.", - "CONTROLS_IF_TOOLTIP_3": "Je-li první hodnota pravdivá, proveď první blok příkazů. V opačném případě, je-li pravdivá druhá hodnota, proveď druhý blok příkazů.", - "CONTROLS_IF_TOOLTIP_4": "Je-li první hodnota pravda, proveď první blok příkazů. Je-li druhá hodnota pravda, proveď druhý blok příkazů. Pokud žádná hodnota není pravda, proveď poslední blok příkazů.", - "CONTROLS_IF_MSG_IF": "pokud", - "CONTROLS_IF_MSG_ELSEIF": "nebo pokud", - "CONTROLS_IF_MSG_ELSE": "jinak", - "CONTROLS_IF_IF_TOOLTIP": "Přidej, odstraň či uspořádej sekce k přenastavení tohoto bloku pokud.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Přidat podmínku do \"pokud\" bloku.", - "CONTROLS_IF_ELSE_TOOLTIP": "Přidej konečnou podmínku zahrnující ostatní případy do bloku pokud.", - "LOGIC_COMPARE_HELPURL": "https://cs.wikipedia.org/wiki/Nerovnost_(matematika)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Vrátí hodnotu pravda, pokud se oba vstupy rovnají jeden druhému.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Vrátí hodnotu pravda, pokud se oba vstupy nerovnají sobě navzájem.", - "LOGIC_COMPARE_TOOLTIP_LT": "Navrátí hodnotu pravda, pokud je první vstup menší než druhý vstup.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Navrátí hodnotu pravda, pokud je první vstup menší a nebo rovný druhému vstupu.", - "LOGIC_COMPARE_TOOLTIP_GT": "Navrátí hodnotu pravda, pokud první vstup je větší než druhý vstup.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Navrátí hodnotu pravda, pokud je první vstup větší a nebo rovný druhému vstupu.", - "LOGIC_OPERATION_TOOLTIP_AND": "Vrátí hodnotu pravda, pokud oba dva vstupy jsou pravdivé.", - "LOGIC_OPERATION_AND": "a", - "LOGIC_OPERATION_TOOLTIP_OR": "Vrátí hodnotu pravda, pokud alespoň jeden ze vstupů má hodnotu pravda.", - "LOGIC_OPERATION_OR": "nebo", - "LOGIC_NEGATE_TITLE": "není %1", - "LOGIC_NEGATE_TOOLTIP": "Navrátí hodnotu pravda, pokud je vstup nepravda. Navrátí hodnotu nepravda, pokud je vstup pravda.", - "LOGIC_BOOLEAN_TRUE": "pravda", - "LOGIC_BOOLEAN_FALSE": "nepravda", - "LOGIC_BOOLEAN_TOOLTIP": "Vrací pravda nebo nepravda.", - "LOGIC_NULL": "nula", - "LOGIC_NULL_TOOLTIP": "Vrátí nulovou hodnotu", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "je-li to pravda", - "LOGIC_TERNARY_IF_FALSE": "je-li nepravda", - "LOGIC_TERNARY_TOOLTIP": "Zkontroluje podmínku v \"testu\". Když je podmínka pravda, vrátí hodnotu \"pokud pravda\"; v opačném případě vrátí hodnotu \"pokud nepravda\".", - "MATH_NUMBER_HELPURL": "https://cs.wikipedia.org/wiki/Číslo", - "MATH_NUMBER_TOOLTIP": "Číslo.", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "arcsin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "arctan", - "MATH_ARITHMETIC_HELPURL": "https://cs.wikipedia.org/wiki/Aritmetika", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Vrátí součet dvou čísel.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vrátí rozdíl dvou čísel.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Vrátí součin dvou čísel.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Vrátí podíl dvou čísel.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Vrátí první číslo umocněné na druhé číslo.", - "MATH_SINGLE_HELPURL": "https://cs.wikipedia.org/wiki/Druhá_odmocnina", - "MATH_SINGLE_OP_ROOT": "druhá odmocnina", - "MATH_SINGLE_TOOLTIP_ROOT": "Vrátí druhou odmocninu čísla.", - "MATH_SINGLE_OP_ABSOLUTE": "absolutní", - "MATH_SINGLE_TOOLTIP_ABS": "Vrátí absolutní hodnotu čísla.", - "MATH_SINGLE_TOOLTIP_NEG": "Vrátí zápornou hodnotu čísla.", - "MATH_SINGLE_TOOLTIP_LN": "Vrátí přirozený logaritmus čísla.", - "MATH_SINGLE_TOOLTIP_LOG10": "Vrátí desítkový logaritmus čísla.", - "MATH_SINGLE_TOOLTIP_EXP": "Vrátí mocninu čísla e.", - "MATH_SINGLE_TOOLTIP_POW10": "Vrátí mocninu čísla 10.", - "MATH_TRIG_HELPURL": "https://cs.wikipedia.org/wiki/Goniometrická_funkce", - "MATH_TRIG_TOOLTIP_SIN": "Vrátí sinus úhlu ve stupních.", - "MATH_TRIG_TOOLTIP_COS": "Vrátí kosinus úhlu ve stupních.", - "MATH_TRIG_TOOLTIP_TAN": "Vrátí tangens úhlu ve stupních.", - "MATH_TRIG_TOOLTIP_ASIN": "Vrátí arcsinus čísla.", - "MATH_TRIG_TOOLTIP_ACOS": "Vrátí arckosinus čísla.", - "MATH_TRIG_TOOLTIP_ATAN": "Vrátí arctangens čísla.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Vraťte jednu z následujících konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", - "MATH_IS_EVEN": "je sudé", - "MATH_IS_ODD": "je liché", - "MATH_IS_PRIME": "je prvočíslo", - "MATH_IS_WHOLE": "je celé", - "MATH_IS_POSITIVE": "je kladné", - "MATH_IS_NEGATIVE": "je záporné", - "MATH_IS_DIVISIBLE_BY": "je dělitelné", - "MATH_IS_TOOLTIP": "Kontrola, zda je číslo sudé, liché, prvočíslo, celé, kladné, záporné nebo zda je dělitelné daným číslem. Vrací pravdu nebo nepravdu.", - "MATH_CHANGE_HELPURL": "https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o", - "MATH_CHANGE_TITLE": "změnit %1 od %2", - "MATH_CHANGE_TOOLTIP": "Přičti číslo k proměnné '%1'.", - "MATH_ROUND_HELPURL": "https://cs.wikipedia.org/wiki/Zaokrouhlení", - "MATH_ROUND_TOOLTIP": "Zaokrouhlit číslo nahoru nebo dolů.", - "MATH_ROUND_OPERATOR_ROUND": "zaokrouhlit", - "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrouhlit nahoru", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokrouhlit dolu", - "MATH_ONLIST_OPERATOR_SUM": "suma seznamu", - "MATH_ONLIST_TOOLTIP_SUM": "Vrátí součet všech čísel v seznamu.", - "MATH_ONLIST_OPERATOR_MIN": "nejmenší v seznamu", - "MATH_ONLIST_TOOLTIP_MIN": "Vrátí nejmenší číslo v seznamu.", - "MATH_ONLIST_OPERATOR_MAX": "největší v seznamu", - "MATH_ONLIST_TOOLTIP_MAX": "Vrátí největší číslo v seznamu.", - "MATH_ONLIST_OPERATOR_AVERAGE": "průměr v seznamu", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Vrátí průměr (aritmetický průměr) číselných hodnot v seznamu.", - "MATH_ONLIST_OPERATOR_MEDIAN": "medián v seznamu", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Vrátí medián seznamu.", - "MATH_ONLIST_OPERATOR_MODE": "nejčastější ze seznamu", - "MATH_ONLIST_TOOLTIP_MODE": "Vrátí seznam nejčastějších položek seznamu.", - "MATH_ONLIST_OPERATOR_STD_DEV": "směrodatná odchylka ze seznamu", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Vrátí směrodatnou odchylku seznamu.", - "MATH_ONLIST_OPERATOR_RANDOM": "náhodná položka seznamu", - "MATH_ONLIST_TOOLTIP_RANDOM": "Vrátí náhodnou položku ze seznamu.", - "MATH_MODULO_HELPURL": "https://cs.wikipedia.org/wiki/Modul%C3%A1rn%C3%AD_aritmetika", - "MATH_MODULO_TITLE": "zbytek po dělení %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Vrátí zbytek po dělení dvou čísel.", - "MATH_CONSTRAIN_TITLE": "omez %1 na rozmezí od %2 do %3", - "MATH_CONSTRAIN_TOOLTIP": "Omezí číslo tak, aby bylo ve stanovených mezích (včetně).", - "MATH_RANDOM_INT_HELPURL": "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel", - "MATH_RANDOM_INT_TITLE": "náhodné celé číslo od %1 do %2", - "MATH_RANDOM_INT_TOOLTIP": "Vrací náhodné celé číslo mezi dvěma určenými mezemi, včetně mezních hodnot.", - "MATH_RANDOM_FLOAT_HELPURL": "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "náhodné číslo mezi 0 (včetně) do 1", - "MATH_RANDOM_FLOAT_TOOLTIP": "Vrátí náhodné číslo mezi 0,0 (včetně) až 1,0", - "TEXT_TEXT_HELPURL": "https://cs.wikipedia.org/wiki/Textov%C3%BD_%C5%99et%C4%9Bzec", - "TEXT_TEXT_TOOLTIP": "Písmeno, slovo nebo řádek textu.", - "TEXT_JOIN_TITLE_CREATEWITH": "vytvořit text s", - "TEXT_JOIN_TOOLTIP": "Vytvoří kousek textu spojením libovolného počtu položek.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "spojit", - "TEXT_CREATE_JOIN_TOOLTIP": "Přidat, odebrat nebo změnit pořadí oddílů tohoto textového bloku.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Přidat položku do textu.", - "TEXT_APPEND_TO": "do", - "TEXT_APPEND_APPENDTEXT": "přidat text", - "TEXT_APPEND_TOOLTIP": "Přidá určitý text k proměnné '%1'.", - "TEXT_LENGTH_TITLE": "délka %1", - "TEXT_LENGTH_TOOLTIP": "Vrátí počet písmen (včetně mezer) v zadaném textu.", - "TEXT_ISEMPTY_TITLE": "%1 je prázdný", - "TEXT_ISEMPTY_TOOLTIP": "Vrátí pravda pokud je zadaný text prázdný.", - "TEXT_INDEXOF_TOOLTIP": "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vrátí hodnotu 0.", - "TEXT_INDEXOF_INPUT_INTEXT": "v textu", - "TEXT_INDEXOF_OPERATOR_FIRST": "najít první výskyt textu", - "TEXT_INDEXOF_OPERATOR_LAST": "najít poslední výskyt textu", - "TEXT_CHARAT_INPUT_INTEXT": "v textu", - "TEXT_CHARAT_FROM_START": "získat písmeno #", - "TEXT_CHARAT_FROM_END": "získat # písmeno od konce", - "TEXT_CHARAT_FIRST": "získat první písmeno", - "TEXT_CHARAT_LAST": "získat poslední písmeno", - "TEXT_CHARAT_RANDOM": "získat náhodné písmeno", - "TEXT_CHARAT_TOOLTIP": "Získat písmeno na konkrétní pozici.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Získat zadanou část textu.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "v textu", - "TEXT_GET_SUBSTRING_START_FROM_START": "získat podřetězec od písmene #", - "TEXT_GET_SUBSTRING_START_FROM_END": "získat podřetězec od písmene # od konce", - "TEXT_GET_SUBSTRING_START_FIRST": "získat podřetězec od prvního písmene", - "TEXT_GET_SUBSTRING_END_FROM_START": "do písmene #", - "TEXT_GET_SUBSTRING_END_FROM_END": "do # písmene od konce", - "TEXT_GET_SUBSTRING_END_LAST": "do posledního písmene", - "TEXT_CHANGECASE_TOOLTIP": "Vrátí kopii textu s jinou velikostí písmen.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "na VELKÁ PÍSMENA", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "na malá písmena", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "na Počáteční Velká Písmena", - "TEXT_TRIM_TOOLTIP": "Vrátí kopii textu s odstraněnými mezerami z jednoho nebo obou konců.", - "TEXT_TRIM_OPERATOR_BOTH": "odstranit mezery z obou stran", - "TEXT_TRIM_OPERATOR_LEFT": "odstranit mezery z levé strany", - "TEXT_TRIM_OPERATOR_RIGHT": "odstranit mezery z pravé strany", - "TEXT_PRINT_TITLE": "tisk %1", - "TEXT_PRINT_TOOLTIP": "Tisk zadaného textu, čísla nebo jiné hodnoty.", - "TEXT_PROMPT_TYPE_TEXT": "výzva k zadání textu se zprávou", - "TEXT_PROMPT_TYPE_NUMBER": "výzva k zadání čísla se zprávou", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Výzva pro uživatele k zadání čísla.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Výzva pro uživatele k zadání nějakého textu.", - "LISTS_CREATE_EMPTY_TITLE": "vytvořit prázdný seznam", - "LISTS_CREATE_EMPTY_TOOLTIP": "Vrátí seznam nulové délky, který neobsahuje žádné datové záznamy", - "LISTS_CREATE_WITH_TOOLTIP": "Vytvoř seznam s libovolným počtem položek.", - "LISTS_CREATE_WITH_INPUT_WITH": "vytvořit seznam s", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "seznam", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Přidat, odebrat nebo změnit pořadí oddílů tohoto seznamu bloku.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Přidat položku do seznamu.", - "LISTS_REPEAT_TOOLTIP": "Vytváří seznam obsahující danou hodnotu n-krát.", - "LISTS_REPEAT_TITLE": "vytvoř seznam s položkou %1 opakovanou %1 krát", - "LISTS_LENGTH_TITLE": "délka %1", - "LISTS_LENGTH_TOOLTIP": "Vrací počet položek v seznamu.", - "LISTS_ISEMPTY_TITLE": "%1 je prázdné", - "LISTS_ISEMPTY_TOOLTIP": "Vrátí hodnotu pravda, pokud je seznam prázdný.", - "LISTS_INLIST": "v seznamu", - "LISTS_INDEX_OF_FIRST": "najít první výskyt položky", - "LISTS_INDEX_OF_LAST": "najít poslední výskyt položky", - "LISTS_INDEX_OF_TOOLTIP": "Vrací index prvního/posledního výskytu položky v seznamu. Vrací 0, pokud položka nebyla nalezena.", - "LISTS_GET_INDEX_GET": "získat", - "LISTS_GET_INDEX_GET_REMOVE": "získat a odstranit", - "LISTS_GET_INDEX_REMOVE": "odstranit", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# od konce", - "LISTS_GET_INDEX_FIRST": "první", - "LISTS_GET_INDEX_LAST": "poslední", - "LISTS_GET_INDEX_RANDOM": "náhodné", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Vrátí položku z určené pozice v seznamu. #1 je první položka.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Vrátí položku z určené pozice v seznamu. #1 je poslední položka.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vrátí první položku v seznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vrátí poslední položku v seznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vrátí náhodnou položku ze seznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Odstraní a vrátí položku z určené pozice v seznamu. #1 je první položka.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Odstraní a vrátí položku z určené pozice v seznamu. #1 je poslední položka.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Odstraní a vrátí první položku v seznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Odstraní a vrátí poslední položku v seznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Odstraní a vrátí náhodnou položku v seznamu.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Odebere položku na konkrétním místě v seznamu. #1 je první položka.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Odstraní položku na konkrétním místu v seznamu. #1 je poslední položka.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstraní první položku v seznamu.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstraní poslední položku v seznamu.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstraní náhodou položku v seznamu.", - "LISTS_SET_INDEX_SET": "nastavit", - "LISTS_SET_INDEX_INSERT": "vložit na", - "LISTS_SET_INDEX_INPUT_TO": "jako", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Nastaví položku na konkrétní místo v seznamu. #1 je první položka.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Nastaví položku na konkrétní místo v seznamu. #1 je poslední položka.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Nastaví první položku v seznamu.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Nastaví poslední položku v seznamu.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Nastaví náhodnou položku v seznamu.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Vloží položku na určenou pozici v seznamu. #1 je první položka.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Vloží položku na určenou pozici v seznamu. #1 je poslední položka.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vložit položku na začátek seznamu.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Připojí položku na konec seznamu.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Připojí položku náhodně do seznamu.", - "LISTS_GET_SUBLIST_START_FROM_START": "získat podseznam od #", - "LISTS_GET_SUBLIST_START_FROM_END": "získat podseznam od # od konce", - "LISTS_GET_SUBLIST_START_FIRST": "získat podseznam od první položky", - "LISTS_GET_SUBLIST_END_FROM_START": "do #", - "LISTS_GET_SUBLIST_END_FROM_END": "do # od konce", - "LISTS_GET_SUBLIST_END_LAST": "jako poslední", - "LISTS_GET_SUBLIST_TOOLTIP": "Vytvoří kopii určené části seznamu.", - "LISTS_SPLIT_LIST_FROM_TEXT": "udělat z textu seznam", - "LISTS_SPLIT_TEXT_FROM_LIST": "udělat ze seznamu text", - "LISTS_SPLIT_WITH_DELIMITER": "s oddělovačem", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Rozdělit text do seznamu textů, lámání na oddělovačích.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Spojit seznam textů do jednoho textu, rozdělaného oddělovači.", - "VARIABLES_GET_TOOLTIP": "Vrátí hodnotu této proměnné.", - "VARIABLES_GET_CREATE_SET": "Vytvořit \"nastavit %1\"", - "VARIABLES_SET": "nastavit %1 na %2", - "VARIABLES_SET_TOOLTIP": "Nastaví tuto proměnnou, aby se rovnala vstupu.", - "VARIABLES_SET_CREATE_GET": "Vytvořit \"získat %1\"", - "PROCEDURES_DEFNORETURN_TITLE": "k provedení", - "PROCEDURES_DEFNORETURN_PROCEDURE": "proveď něco", - "PROCEDURES_BEFORE_PARAMS": "s:", - "PROCEDURES_CALL_BEFORE_PARAMS": "s:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Vytvořit funkci bez výstupu.", - "PROCEDURES_DEFRETURN_RETURN": "navrátit", - "PROCEDURES_DEFRETURN_TOOLTIP": "Vytvořit funkci s výstupem.", - "PROCEDURES_ALLOW_STATEMENTS": "povolit příkazy", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Upozornění: Tato funkce má duplicitní parametry.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://cs.wikipedia.org/wiki/Funkce_(programov%C3%A1n%C3%AD)", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Spustí uživatelem definovanou funkci '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://cs.wikipedia.org/wiki/Funkce_(programov%C3%A1n%C3%AD)", - "PROCEDURES_CALLRETURN_TOOLTIP": "Spustí uživatelem definovanou funkci '%1' a použije její výstup.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "vstupy", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Přidat, odebrat nebo změnit pořadí vstupů této funkce.", - "PROCEDURES_MUTATORARG_TITLE": "vstupní jméno:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Přidat vstupy do funkce.", - "PROCEDURES_HIGHLIGHT_DEF": "Zvýraznit definici funkce", - "PROCEDURES_CREATE_DO": "Vytvořit '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Je-li hodnota pravda, pak vrátí druhou hodnotu.", - "PROCEDURES_IFRETURN_WARNING": "Varování: Tento blok může být použit pouze uvnitř definici funkce." -} diff --git a/msg/json/da.json b/msg/json/da.json deleted file mode 100644 index 1a814a2e07..0000000000 --- a/msg/json/da.json +++ /dev/null @@ -1,307 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Christian List", - "RickiRunge", - "MGA73", - "Mads Haupt" - ] - }, - "VARIABLES_DEFAULT_NAME": "element", - "TODAY": "I dag", - "DUPLICATE_BLOCK": "Duplikér", - "ADD_COMMENT": "Tilføj kommentar", - "REMOVE_COMMENT": "Fjern kommentar", - "EXTERNAL_INPUTS": "Udvendige inputs", - "INLINE_INPUTS": "Indlejrede inputs", - "DELETE_BLOCK": "Slet blok", - "DELETE_X_BLOCKS": "Slet %1 blokke", - "DELETE_ALL_BLOCKS": "Slet alle %1 blokke?", - "CLEAN_UP": "Ryd op i blokke", - "COLLAPSE_BLOCK": "Fold blokken sammen", - "COLLAPSE_ALL": "Fold blokkene sammen", - "EXPAND_BLOCK": "Fold blokken ud", - "EXPAND_ALL": "Fold blokkene ud", - "DISABLE_BLOCK": "Deaktivér blok", - "ENABLE_BLOCK": "Aktivér blok", - "HELP": "Hjælp", - "CHAT": "Chat med din samarbejdspartner ved at skrive i denne boks!", - "AUTH": "Tillad venligst at denne app muliggør at du kan gemme dit arbejde og at du kan dele det.", - "ME": "Mig", - "CHANGE_VALUE_TITLE": "Skift værdi:", - "NEW_VARIABLE": "Ny variabel...", - "NEW_VARIABLE_TITLE": "Navn til den nye variabel:", - "RENAME_VARIABLE": "Omdøb variabel...", - "RENAME_VARIABLE_TITLE": "Omdøb alle '%1' variabler til:", - "COLOUR_PICKER_HELPURL": "https://da.wikipedia.org/wiki/Farve", - "COLOUR_PICKER_TOOLTIP": "Vælg en farve fra paletten.", - "COLOUR_RANDOM_TITLE": "tilfældig farve", - "COLOUR_RANDOM_TOOLTIP": "Vælg en tilfældig farve.", - "COLOUR_RGB_TITLE": "farve med", - "COLOUR_RGB_RED": "rød", - "COLOUR_RGB_GREEN": "grøn", - "COLOUR_RGB_BLUE": "blå", - "COLOUR_RGB_TOOLTIP": "Lav en farve med den angivne mængde af rød, grøn og blå. Alle værdier skal være mellem 0 og 100.", - "COLOUR_BLEND_TITLE": "bland", - "COLOUR_BLEND_COLOUR1": "farve 1", - "COLOUR_BLEND_COLOUR2": "farve 2", - "COLOUR_BLEND_RATIO": "i forholdet", - "COLOUR_BLEND_TOOLTIP": "Blander to farver sammen i et bestemt forhold (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://da.wikipedia.org/wiki/For-l%C3%B8kke", - "CONTROLS_REPEAT_TITLE": "gentag %1 gange", - "CONTROLS_REPEAT_INPUT_DO": "udfør", - "CONTROLS_REPEAT_TOOLTIP": "Udfør nogle kommandoer flere gange.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "gentag sålænge", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "gentag indtil", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Udfør nogle kommandoer, sålænge en værdi er sand.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Udfør nogle kommandoer, sålænge en værdi er falsk.", - "CONTROLS_FOR_TOOLTIP": "Få variablen \"%1\" til at have værdierne fra startværdien til slutværdien, mens der tælles med det angivne interval, og udfør de angivne blokke.", - "CONTROLS_FOR_TITLE": "tæl med %1 fra %2 til %3 med %4", - "CONTROLS_FOREACH_TITLE": "for hvert element %1 i listen %2", - "CONTROLS_FOREACH_TOOLTIP": "For hvert element i en liste, sæt variablen '%1' til elementet, og udfør derefter nogle kommandoer.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "bryd ud af løkken", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "fortsæt med den næste gentagelse i løkken", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Bryd ud af den omgivende løkke.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Spring resten af denne løkke over, og fortsæt med den næste gentagelse.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Advarsel: Denne blok kan kun bruges i en løkke.", - "CONTROLS_IF_TOOLTIP_1": "Hvis en værdi er sand, så udfør nogle kommandoer.", - "CONTROLS_IF_TOOLTIP_2": "Hvis en værdi er sand, så udfør den første blok af kommandoer. Ellers udfør den anden blok af kommandoer.", - "CONTROLS_IF_TOOLTIP_3": "Hvis den første værdi er sand, så udfør den første blok af kommandoer. Ellers, hvis den anden værdi er sand, så udfør den anden blok af kommandoer.", - "CONTROLS_IF_TOOLTIP_4": "Hvis den første værdi er sand, så udfør den første blok af kommandoer. Ellers, hvis den anden værdi er sand, så udfør den anden blok af kommandoer. Hvis ingen af værdierne er sande, så udfør den sidste blok af kommandoer.", - "CONTROLS_IF_MSG_IF": "hvis", - "CONTROLS_IF_MSG_ELSEIF": "ellers hvis", - "CONTROLS_IF_MSG_ELSE": "ellers", - "CONTROLS_IF_IF_TOOLTIP": "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne \"hvis\" blok.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Tilføj en betingelse til denne \"hvis\" blok.", - "CONTROLS_IF_ELSE_TOOLTIP": "Tilføj en sidste fang-alt betingelse, til denne \"hvis\" blok.", - "LOGIC_COMPARE_HELPURL": "https://da.wikipedia.org/wiki/Ulighed_(matematik)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Returnere sand, hvis begge inputs er lig med hinanden.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Returnere sand, hvis begge inputs ikke er lig med hinanden.", - "LOGIC_COMPARE_TOOLTIP_LT": "Returnere sand, hvis det første input er mindre end det andet input.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Returnere sand, hvis det første input er mindre end eller lig med det andet input.", - "LOGIC_COMPARE_TOOLTIP_GT": "Returnere sand, hvis det første input er større end det andet input.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Returnere sand, hvis det første input er større end eller lig med det andet input.", - "LOGIC_OPERATION_TOOLTIP_AND": "Returnere sand, hvis begge inputs er sande.", - "LOGIC_OPERATION_AND": "og", - "LOGIC_OPERATION_TOOLTIP_OR": "Returnere sand, hvis mindst et af inputtene er sande.", - "LOGIC_OPERATION_OR": "eller", - "LOGIC_NEGATE_TITLE": "ikke %1", - "LOGIC_NEGATE_TOOLTIP": "Returnerer sand, hvis input er falsk. Returnerer falsk, hvis input er sandt.", - "LOGIC_BOOLEAN_TRUE": "sand", - "LOGIC_BOOLEAN_FALSE": "falsk", - "LOGIC_BOOLEAN_TOOLTIP": "Returnerer enten sand eller falsk.", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Returnerer null.", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "hvis sand", - "LOGIC_TERNARY_IF_FALSE": "hvis falsk", - "LOGIC_TERNARY_TOOLTIP": "Kontrollér betingelsen i 'test'. Hvis betingelsen er sand, returnér \"hvis sand\" værdien; ellers returnér \"hvis falsk\" værdien.", - "MATH_NUMBER_HELPURL": "https://da.wikipedia.org/wiki/Tal", - "MATH_NUMBER_TOOLTIP": "Et tal.", - "MATH_DIVISION_SYMBOL": ":", - "MATH_ARITHMETIC_HELPURL": "https://da.wikipedia.org/wiki/Aritmetik", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Returnere summen af de to tal.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Returnere forskellen mellem de to tal.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Returnere produktet af de to tal.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Returnere kvotienten af de to tal.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Returnere det første tal opløftet til potensen af det andet tal.", - "MATH_SINGLE_HELPURL": "https://da.wikipedia.org/wiki/Kvadratrod", - "MATH_SINGLE_OP_ROOT": "kvadratrod", - "MATH_SINGLE_TOOLTIP_ROOT": "Returnere kvadratroden af et tal.", - "MATH_SINGLE_OP_ABSOLUTE": "absolut", - "MATH_SINGLE_TOOLTIP_ABS": "Returnere den absolutte værdi af et tal.", - "MATH_SINGLE_TOOLTIP_NEG": "Returnere negationen af et tal.", - "MATH_SINGLE_TOOLTIP_LN": "Returnere den naturlige logaritme af et tal.", - "MATH_SINGLE_TOOLTIP_LOG10": "Returnere 10-talslogaritmen af et tal.", - "MATH_SINGLE_TOOLTIP_EXP": "Returnere e til potensen af et tal.", - "MATH_SINGLE_TOOLTIP_POW10": "Returnere 10 til potensen af et tal.", - "MATH_TRIG_HELPURL": "https://da.wikipedia.org/wiki/Trigonometrisk_funktion", - "MATH_TRIG_TOOLTIP_SIN": "Returnere sinus af en vinkel (i grader).", - "MATH_TRIG_TOOLTIP_COS": "Returnere cosinus af en vinkel (i grader).", - "MATH_TRIG_TOOLTIP_TAN": "Returnere tangens af en vinkel (i grader).", - "MATH_TRIG_TOOLTIP_ASIN": "Returnere arcus sinus af et tal.", - "MATH_TRIG_TOOLTIP_ACOS": "Returnere arcus cosinus af et tal.", - "MATH_TRIG_TOOLTIP_ATAN": "Returnere arcus tangens af et tal.", - "MATH_CONSTANT_HELPURL": "https://da.wikipedia.org/wiki/Matematisk_konstant", - "MATH_CONSTANT_TOOLTIP": "Returnere en af de ofte brugte konstanter: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(2) (1.414…), sqrt(½) (0.707…) eller ∞ (uendeligt).", - "MATH_IS_EVEN": "er lige", - "MATH_IS_ODD": "er ulige", - "MATH_IS_PRIME": "er et primtal", - "MATH_IS_WHOLE": "er helt", - "MATH_IS_POSITIVE": "er positivt", - "MATH_IS_NEGATIVE": "er negativt", - "MATH_IS_DIVISIBLE_BY": "er deleligt med", - "MATH_IS_TOOLTIP": "Kontrollere, om et tal er lige, ulige, primtal, helt, positivt, negativt, eller om det er deleligt med bestemt tal. Returnere sandt eller falskt.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "skift %1 med %2", - "MATH_CHANGE_TOOLTIP": "Læg et tal til variablen '%1'.", - "MATH_ROUND_HELPURL": "https://da.wikipedia.org/wiki/Afrunding", - "MATH_ROUND_TOOLTIP": "Runde et tal op eller ned.", - "MATH_ROUND_OPERATOR_ROUND": "afrund", - "MATH_ROUND_OPERATOR_ROUNDUP": "rund op", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "rund ned", - "MATH_ONLIST_OPERATOR_SUM": "summen af listen", - "MATH_ONLIST_TOOLTIP_SUM": "Returner summen af alle tal i listen.", - "MATH_ONLIST_OPERATOR_MIN": "mindste tal i listen", - "MATH_ONLIST_TOOLTIP_MIN": "Returner det mindste tal i listen.", - "MATH_ONLIST_OPERATOR_MAX": "største tal i listen", - "MATH_ONLIST_TOOLTIP_MAX": "Returner det største tal i listen.", - "MATH_ONLIST_OPERATOR_AVERAGE": "gennemsnit af listen", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Returner gennemsnittet (middelværdien) af de numeriske værdier i listen.", - "MATH_ONLIST_OPERATOR_MEDIAN": "listens median", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Returner listens median.", - "MATH_ONLIST_OPERATOR_MODE": "listens typetal", - "MATH_ONLIST_TOOLTIP_MODE": "Returner en liste over de mest almindelige elementer på listen.", - "MATH_ONLIST_OPERATOR_STD_DEV": "standardafvigelsen for listen", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Returner standardafvigelsen for listen.", - "MATH_ONLIST_OPERATOR_RANDOM": "tilfældigt element fra listen", - "MATH_ONLIST_TOOLTIP_RANDOM": "Returner et tilfældigt element fra listen.", - "MATH_MODULO_HELPURL": "https://da.wikipedia.org/wiki/Modulo", - "MATH_MODULO_TITLE": "resten af %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Returner resten fra at dividere de to tal.", - "MATH_CONSTRAIN_TITLE": "begræns %1 til mellem %2 og %3", - "MATH_CONSTRAIN_TOOLTIP": "Begræns et tal til at være mellem de angivne grænser (inklusiv).", - "MATH_RANDOM_INT_HELPURL": "https://da.wikipedia.org/wiki/Tilfældighedsgenerator", - "MATH_RANDOM_INT_TITLE": "tilfældigt heltal mellem %1 og %2", - "MATH_RANDOM_INT_TOOLTIP": "Returner et tilfældigt heltal mellem de to angivne grænser (inklusiv).", - "MATH_RANDOM_FLOAT_HELPURL": "https://da.wikipedia.org/wiki/Tilfældighedsgenerator", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "tilfældigt decimaltal (mellem 0 og 1)", - "MATH_RANDOM_FLOAT_TOOLTIP": "Returner et tilfældigt decimaltal mellem 0,0 (inklusiv) og 1,0 (eksklusiv).", - "TEXT_TEXT_HELPURL": "https://da.wikipedia.org/wiki/Tekststreng", - "TEXT_TEXT_TOOLTIP": "En bogstav, et ord eller en linje med tekst.", - "TEXT_JOIN_TITLE_CREATEWITH": "lav en tekst med", - "TEXT_JOIN_TOOLTIP": "Lav et stykke tekst ved at sætte et antal elementer sammen.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "sammenføj", - "TEXT_CREATE_JOIN_TOOLTIP": "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne tekstblok.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Føj et element til teksten.", - "TEXT_APPEND_TO": "til", - "TEXT_APPEND_APPENDTEXT": "tilføj tekst", - "TEXT_APPEND_TOOLTIP": "Tilføj noget tekst til variablen '%1'.", - "TEXT_LENGTH_TITLE": "længden af %1", - "TEXT_LENGTH_TOOLTIP": "Returnerer antallet af bogstaver (herunder mellemrum) i den angivne tekst.", - "TEXT_ISEMPTY_TITLE": "%1 er tom", - "TEXT_ISEMPTY_TOOLTIP": "Returnerer sand, hvis den angivne tekst er tom.", - "TEXT_INDEXOF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer 0, hvis teksten ikke kan findes.", - "TEXT_INDEXOF_INPUT_INTEXT": "i teksten", - "TEXT_INDEXOF_OPERATOR_FIRST": "find første forekomst af teksten", - "TEXT_INDEXOF_OPERATOR_LAST": "find sidste forekomst af teksten", - "TEXT_CHARAT_INPUT_INTEXT": "i teksten", - "TEXT_CHARAT_FROM_START": "hent bogstav #", - "TEXT_CHARAT_FROM_END": "hent bogstav # fra slutningen", - "TEXT_CHARAT_FIRST": "hent første bogstav", - "TEXT_CHARAT_LAST": "hent sidste bogstav", - "TEXT_CHARAT_RANDOM": "hent tilfældigt bogstav", - "TEXT_CHARAT_TOOLTIP": "Returnerer bogstavet på den angivne placering.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Returnerer den angivne del af teksten.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "i teksten", - "TEXT_GET_SUBSTRING_START_FROM_START": "hent delstreng fra bogstav #", - "TEXT_GET_SUBSTRING_START_FROM_END": "hent delstreng fra bogstav # fra slutningen", - "TEXT_GET_SUBSTRING_START_FIRST": "hent delstreng fra første bogstav", - "TEXT_GET_SUBSTRING_END_FROM_START": "til bogstav #", - "TEXT_GET_SUBSTRING_END_FROM_END": "til bogstav # fra slutningen", - "TEXT_GET_SUBSTRING_END_LAST": "til sidste bogstav", - "TEXT_CHANGECASE_TOOLTIP": "Returner en kopi af teksten hvor bogstaverne enten er udelukkende store eller små, eller hvor første bogstav i hvert ord er stort.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "til STORE BOGSTAVER", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "til små bogstaver", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "til Stort Begyndelsesbogstav", - "TEXT_TRIM_TOOLTIP": "Returner en kopi af teksten med mellemrum fjernet fra den ene eller begge sider.", - "TEXT_TRIM_OPERATOR_BOTH": "fjern mellemrum fra begge sider af", - "TEXT_TRIM_OPERATOR_LEFT": "fjern mellemrum fra venstre side af", - "TEXT_TRIM_OPERATOR_RIGHT": "fjern mellemrum fra højre side af", - "TEXT_PRINT_TITLE": "skriv %1", - "TEXT_PRINT_TOOLTIP": "Skriv den angivne tekst, tal eller anden værdi.", - "TEXT_PROMPT_TYPE_TEXT": "spørg efter tekst med meddelelsen", - "TEXT_PROMPT_TYPE_NUMBER": "spørg efter et tal med meddelelsen", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Spørg brugeren efter et tal", - "TEXT_PROMPT_TOOLTIP_TEXT": "Spørg brugeren efter en tekst", - "LISTS_CREATE_EMPTY_TITLE": "opret en tom liste", - "LISTS_CREATE_EMPTY_TOOLTIP": "Returnerer en liste af længde 0, som ikke indeholder nogen data", - "LISTS_CREATE_WITH_TOOLTIP": "Opret en liste med et vilkårligt antal elementer.", - "LISTS_CREATE_WITH_INPUT_WITH": "opret liste med", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "liste", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne blok.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Føj et element til listen.", - "LISTS_REPEAT_TOOLTIP": "Opretter en liste bestående af den givne værdi gentaget et bestemt antal gange.", - "LISTS_REPEAT_TITLE": "opret liste med elementet %1 gentaget %2 gange", - "LISTS_LENGTH_TITLE": "længden af %1", - "LISTS_LENGTH_TOOLTIP": "Returnerer længden af en liste.", - "LISTS_ISEMPTY_TITLE": "%1 er tom", - "LISTS_ISEMPTY_TOOLTIP": "Returnerer sand, hvis listen er tom.", - "LISTS_INLIST": "i listen", - "LISTS_INDEX_OF_FIRST": "find første forekomst af elementet", - "LISTS_INDEX_OF_LAST": "find sidste forekomst af elementet", - "LISTS_INDEX_OF_TOOLTIP": "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer 0, hvis elementet ikke kan findes.", - "LISTS_GET_INDEX_GET": "hent", - "LISTS_GET_INDEX_GET_REMOVE": "hent og fjern", - "LISTS_GET_INDEX_REMOVE": "fjern", - "LISTS_GET_INDEX_FROM_END": "# fra slutningen", - "LISTS_GET_INDEX_FIRST": "første", - "LISTS_GET_INDEX_LAST": "sidste", - "LISTS_GET_INDEX_RANDOM": "tilfældig", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Returnerer elementet på den angivne position på en liste. #1 er det første element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Returnerer elementet på den angivne position på en liste. #1 er det sidste element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returnerer det første element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returnerer den sidste element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returnerer et tilfældigt element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fjerner og returnerer elementet på den angivne position på en liste. #1 er det første element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fjerner og returnerer elementet på den angivne position på en liste. #1 er det sidste element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fjerner og returnerer det første element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fjerner og returnerer det sidste element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fjerner og returnerer et tilfældigt element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fjerner elementet på den angivne position på en liste. #1 er det første element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fjerner elementet på den angivne position på en liste. #1 er det sidste element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fjerner det første element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fjerner sidste element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Fjerner et tilfældigt element i en liste.", - "LISTS_SET_INDEX_SET": "sæt", - "LISTS_SET_INDEX_INSERT": "indsæt ved", - "LISTS_SET_INDEX_INPUT_TO": "som", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Sætter elementet på den angivne position i en liste. #1 er det første element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Sætter elementet på den angivne position i en liste. #1 er det sidste element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Sætter det første element i en liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Sætter det sidste element i en liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Sætter et tilfældigt element i en liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Indsætter elementet på den angivne position i en liste. #1 er det første element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Indsætter elementet på den angivne position i en liste. #1 er det sidste element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Indsætter elementet i starten af en liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Føj elementet til slutningen af en liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Indsætter elementet tilfældigt i en liste.", - "LISTS_GET_SUBLIST_START_FROM_START": "hent underliste fra #", - "LISTS_GET_SUBLIST_START_FROM_END": "hent underliste fra # fra slutningen", - "LISTS_GET_SUBLIST_START_FIRST": "hent underliste fra første", - "LISTS_GET_SUBLIST_END_FROM_START": "til #", - "LISTS_GET_SUBLIST_END_FROM_END": "til # fra slutningen", - "LISTS_GET_SUBLIST_END_LAST": "til sidste", - "LISTS_GET_SUBLIST_TOOLTIP": "Opretter en kopi af den angivne del af en liste.", - "LISTS_SPLIT_LIST_FROM_TEXT": "lav tekst til liste", - "LISTS_SPLIT_TEXT_FROM_LIST": "lav liste til tekst", - "LISTS_SPLIT_WITH_DELIMITER": "med skilletegn", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Bryd tekst op i en liste af tekster med brud ved hvert skilletegn.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Saml en liste af tekster til én tekst, der er adskilt af et skilletegn.", - "VARIABLES_GET_TOOLTIP": "Returnerer værdien af denne variabel.", - "VARIABLES_GET_CREATE_SET": "Opret 'sæt %1'", - "VARIABLES_SET": "sæt %1 til %2", - "VARIABLES_SET_TOOLTIP": "Sætter denne variabel til at være lig med input.", - "VARIABLES_SET_CREATE_GET": "Opret 'hent %1'", - "PROCEDURES_DEFNORETURN_TITLE": "for at", - "PROCEDURES_DEFNORETURN_PROCEDURE": "gøre noget", - "PROCEDURES_BEFORE_PARAMS": "med:", - "PROCEDURES_CALL_BEFORE_PARAMS": "med:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Opretter en funktion der ikke har nogen returværdi.", - "PROCEDURES_DEFRETURN_RETURN": "returnér", - "PROCEDURES_DEFRETURN_TOOLTIP": "Opretter en funktion der har en returværdi.", - "PROCEDURES_ALLOW_STATEMENTS": "tillad erklæringer", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Advarsel: Denne funktion har dublerede parametre.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://da.wikipedia.org/wiki/Funktion_%28programmering%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Kør den brugerdefinerede funktion '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://da.wikipedia.org/wiki/Funktion_%28programmering%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Kør den brugerdefinerede funktion '%1' og brug dens returværdi.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "parametre", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tilføje, fjerne eller ændre rækkefølgen af parametre til denne funktion.", - "PROCEDURES_MUTATORARG_TITLE": "parameternavn:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Tilføj en parameter til funktionen.", - "PROCEDURES_HIGHLIGHT_DEF": "Markér funktionsdefinitionen", - "PROCEDURES_CREATE_DO": "Opret '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Hvis en værdi er sand, så returnér en anden værdi.", - "PROCEDURES_IFRETURN_WARNING": "Advarsel: Denne blok kan kun anvendes inden for en funktionsdefinition." -} diff --git a/msg/json/de.json b/msg/json/de.json deleted file mode 100644 index a3b660062c..0000000000 --- a/msg/json/de.json +++ /dev/null @@ -1,340 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Metalhead64", - "M165437", - "Dan-yell", - "아라", - "Octycs", - "Cvanca" - ] - }, - "VARIABLES_DEFAULT_NAME": "Element", - "TODAY": "Heute", - "DUPLICATE_BLOCK": "Kopieren", - "ADD_COMMENT": "Kommentar hinzufügen", - "REMOVE_COMMENT": "Kommentar entfernen", - "EXTERNAL_INPUTS": "externe Eingänge", - "INLINE_INPUTS": "interne Eingänge", - "DELETE_BLOCK": "Block löschen", - "DELETE_X_BLOCKS": "Block %1 löschen", - "DELETE_ALL_BLOCKS": "Alle %1 Bausteine löschen?", - "CLEAN_UP": "Blöcke aufräumen", - "COLLAPSE_BLOCK": "Block zusammenfalten", - "COLLAPSE_ALL": "Alle Blöcke zusammenfalten", - "EXPAND_BLOCK": "Block entfalten", - "EXPAND_ALL": "Alle Blöcke entfalten", - "DISABLE_BLOCK": "Block deaktivieren", - "ENABLE_BLOCK": "Block aktivieren", - "HELP": "Hilfe", - "CHAT": "Chatte mit unserem Mitarbeiter durch Eingeben von Text in diesen Kasten!", - "AUTH": "Bitte autorisiere diese App zum Aktivieren der Speicherung deiner Arbeit und zum Teilen.", - "ME": "Ich", - "CHANGE_VALUE_TITLE": "Wert ändern:", - "NEW_VARIABLE": "Neue Variable...", - "NEW_VARIABLE_TITLE": "Name der neuen Variable:", - "RENAME_VARIABLE": "Variable umbenennen...", - "RENAME_VARIABLE_TITLE": "Alle \"%1\" Variablen umbenennen in:", - "COLOUR_PICKER_HELPURL": "https://de.wikipedia.org/wiki/Farbe", - "COLOUR_PICKER_TOOLTIP": "Wähle eine Farbe aus der Palette.", - "COLOUR_RANDOM_TITLE": "zufällige Farbe", - "COLOUR_RANDOM_TOOLTIP": "Wähle eine Farbe nach dem Zufallsprinzip.", - "COLOUR_RGB_HELPURL": "https://de.wikipedia.org/wiki/RGB-Farbraum", - "COLOUR_RGB_TITLE": "Farbe mit", - "COLOUR_RGB_RED": "rot", - "COLOUR_RGB_GREEN": "grün", - "COLOUR_RGB_BLUE": "blau", - "COLOUR_RGB_TOOLTIP": "Kreiere eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "mische", - "COLOUR_BLEND_COLOUR1": "Farbe 1", - "COLOUR_BLEND_COLOUR2": "mit Farbe 2", - "COLOUR_BLEND_RATIO": "im Verhältnis", - "COLOUR_BLEND_TOOLTIP": "Vermische 2 Farben mit konfigurierbaren Farbverhältnis (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", - "CONTROLS_REPEAT_TITLE": "wiederhole %1 mal", - "CONTROLS_REPEAT_INPUT_DO": "mache", - "CONTROLS_REPEAT_TOOLTIP": "Eine Anweisung mehrfach ausführen.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Wiederhole solange", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "Wiederhole bis", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Führe die Anweisung solange aus wie die Bedingung wahr (true) ist.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Führe die Anweisung solange aus wie die Bedingung falsch (false) ist.", - "CONTROLS_FOR_HELPURL": "https://de.wikipedia.org/wiki/For-Schleif", - "CONTROLS_FOR_TOOLTIP": "Zähle die Variable \"%1\" von einem Startwert bis zu einem Zielwert und führe für jeden Wert eine Anweisung aus.", - "CONTROLS_FOR_TITLE": "Zähle %1 von %2 bis %3 mit %4", - "CONTROLS_FOREACH_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", - "CONTROLS_FOREACH_TITLE": "Für Wert %1 aus der Liste %2", - "CONTROLS_FOREACH_TOOLTIP": "Führe eine Anweisung für jeden Wert in der Liste aus und setzte dabei die Variable \"%1\" auf den aktuellen Listenwert.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://de.wikipedia.org/wiki/Kontrollstruktur", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Die Schleife abbrechen", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "mit der nächsten Iteration der Schleife fortfahren", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Die umgebende Schleife beenden.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Diese Anweisung abbrechen und mit der nächsten Schleifendurchlauf fortfahren.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Warnung: Dieser Block sollte nur in einer Schleife verwendet werden.", - "CONTROLS_IF_TOOLTIP_1": "Wenn eine Bedingung wahr (true) ist, dann führe eine Anweisung aus.", - "CONTROLS_IF_TOOLTIP_2": "Wenn eine Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Ansonsten führe die zweite Anweisung aus.", - "CONTROLS_IF_TOOLTIP_3": "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus.", - "CONTROLS_IF_TOOLTIP_4": "Wenn die erste Bedingung wahr (true) ist, dann führe die erste Anweisung aus. Oder wenn die zweite Bedingung wahr (true) ist, dann führe die zweite Anweisung aus. Falls keine der beiden Bedingungen wahr (true) ist, dann führe die dritte Anweisung aus.", - "CONTROLS_IF_MSG_IF": "wenn", - "CONTROLS_IF_MSG_ELSEIF": "sonst wenn", - "CONTROLS_IF_MSG_ELSE": "sonst", - "CONTROLS_IF_IF_TOOLTIP": "Hinzufügen, entfernen oder sortieren von Sektionen", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Eine weitere Bedingung hinzufügen.", - "CONTROLS_IF_ELSE_TOOLTIP": "Eine sonst-Bedingung hinzufügen, führt eine Anweisung aus falls keine Bedingung zutrifft.", - "LOGIC_COMPARE_HELPURL": "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29", - "LOGIC_COMPARE_TOOLTIP_EQ": "Ist wahr (true) wenn beide Werte gleich sind.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Ist wahr (true) wenn beide Werte unterschiedlich sind.", - "LOGIC_COMPARE_TOOLTIP_LT": "Ist wahr (true) wenn der erste Wert kleiner als der zweite Wert ist.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Ist wahr (true) wenn der erste Wert kleiner als oder gleich groß wie zweite Wert ist.", - "LOGIC_COMPARE_TOOLTIP_GT": "Ist wahr (true) wenn der erste Wert größer als der zweite Wert ist.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Ist wahr (true) wenn der erste Wert größer als oder gleich groß wie zweite Wert ist.", - "LOGIC_OPERATION_TOOLTIP_AND": "Ist wahr (true) wenn beide Werte wahr (true) sind.", - "LOGIC_OPERATION_AND": "und", - "LOGIC_OPERATION_TOOLTIP_OR": "Ist wahr (true) wenn einer der beiden Werte wahr (true) ist.", - "LOGIC_OPERATION_OR": "oder", - "LOGIC_NEGATE_TITLE": "nicht %1", - "LOGIC_NEGATE_TOOLTIP": "Ist wahr (true) wenn der Eingabewert falsch (false) ist. Ist falsch (false) wenn der Eingabewert wahr (true) ist.", - "LOGIC_BOOLEAN_TRUE": "wahr", - "LOGIC_BOOLEAN_FALSE": "falsch", - "LOGIC_BOOLEAN_TOOLTIP": "Ist entweder wahr (true) oder falsch (false)", - "LOGIC_NULL_HELPURL": "https://de.wikipedia.org/wiki/Nullwert", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Ist NULL.", - "LOGIC_TERNARY_HELPURL": "https://de.wikipedia.org/wiki/%3F:#Auswahloperator", - "LOGIC_TERNARY_CONDITION": "teste", - "LOGIC_TERNARY_IF_TRUE": "wenn wahr", - "LOGIC_TERNARY_IF_FALSE": "wenn falsch", - "LOGIC_TERNARY_TOOLTIP": "Überprüft eine Bedingung \"teste\". Wenn die Bedingung wahr ist wird der \"wenn wahr\" Wert zurückgegeben, andernfalls der \"wenn falsch\" Wert", - "MATH_NUMBER_HELPURL": "https://de.wikipedia.org/wiki/Zahl", - "MATH_NUMBER_TOOLTIP": "Eine Zahl.", - "MATH_ARITHMETIC_HELPURL": "https://de.wikipedia.org/wiki/Grundrechenart", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Ist die Summe zweier Werte.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ist die Differenz zweier Werte.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ist das Produkt zweier Werte.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ist der Quotient zweier Werte.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Ist der erste Wert potenziert mit dem zweiten Wert.", - "MATH_SINGLE_HELPURL": "https://de.wikipedia.org/wiki/Quadratwurzel", - "MATH_SINGLE_OP_ROOT": "Quadratwurzel", - "MATH_SINGLE_TOOLTIP_ROOT": "Ist die Quadratwurzel eines Wertes.", - "MATH_SINGLE_OP_ABSOLUTE": "Absolutwert", - "MATH_SINGLE_TOOLTIP_ABS": "Ist der Absolutwert eines Wertes.", - "MATH_SINGLE_TOOLTIP_NEG": "Negiert einen Wert.", - "MATH_SINGLE_TOOLTIP_LN": "Ist der natürliche Logarithmus eines Wertes.", - "MATH_SINGLE_TOOLTIP_LOG10": "Ist der dekadische Logarithmus eines Wertes.", - "MATH_SINGLE_TOOLTIP_EXP": "Ist Wert der Exponentialfunktion eines Wertes.", - "MATH_SINGLE_TOOLTIP_POW10": "Rechnet 10 hoch Eingabewert.", - "MATH_TRIG_HELPURL": "https://de.wikipedia.org/wiki/Trigonometrie", - "MATH_TRIG_TOOLTIP_SIN": "Ist der Sinus des Winkels.", - "MATH_TRIG_TOOLTIP_COS": "Ist der Kosinus des Winkels.", - "MATH_TRIG_TOOLTIP_TAN": "Ist der Tangens des Winkels.", - "MATH_TRIG_TOOLTIP_ASIN": "Ist der Arkussinus des Eingabewertes.", - "MATH_TRIG_TOOLTIP_ACOS": "Ist der Arkuskosinus des Eingabewertes.", - "MATH_TRIG_TOOLTIP_ATAN": "Ist der Arkustangens des Eingabewertes.", - "MATH_CONSTANT_HELPURL": "https://de.wikipedia.org/wiki/Mathematische_Konstante", - "MATH_CONSTANT_TOOLTIP": "Mathematische Konstanten wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich).", - "MATH_IS_EVEN": "ist gerade", - "MATH_IS_ODD": "ist ungerade", - "MATH_IS_PRIME": "ist eine Primzahl", - "MATH_IS_WHOLE": "ist eine ganze Zahl", - "MATH_IS_POSITIVE": "ist positiv", - "MATH_IS_NEGATIVE": "ist negativ", - "MATH_IS_DIVISIBLE_BY": "ist teilbar durch", - "MATH_IS_TOOLTIP": "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr (true) oder falsch (false) zurück.", - "MATH_CHANGE_HELPURL": "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement", - "MATH_CHANGE_TITLE": "erhöhe %1 um %2", - "MATH_CHANGE_TOOLTIP": "Addiert einen Wert zur Variable \"%1\" hinzu.", - "MATH_ROUND_HELPURL": "https://de.wikipedia.org/wiki/Runden", - "MATH_ROUND_TOOLTIP": "Eine Zahl auf- oder abrunden.", - "MATH_ROUND_OPERATOR_ROUND": "runden", - "MATH_ROUND_OPERATOR_ROUNDUP": "aufrunden", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "abrunden", - "MATH_ONLIST_HELPURL": "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel", - "MATH_ONLIST_OPERATOR_SUM": "Summe einer Liste", - "MATH_ONLIST_TOOLTIP_SUM": "Ist die Summe aller Werte in einer Liste.", - "MATH_ONLIST_OPERATOR_MIN": "Minimalwert einer Liste", - "MATH_ONLIST_TOOLTIP_MIN": "Ist der kleinste Wert in einer Liste.", - "MATH_ONLIST_OPERATOR_MAX": "Maximalwert einer Liste", - "MATH_ONLIST_TOOLTIP_MAX": "Ist der größte Wert in einer Liste.", - "MATH_ONLIST_OPERATOR_AVERAGE": "Mittelwert einer Liste", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Ist der Durchschnittswert aller Werte in einer Liste.", - "MATH_ONLIST_OPERATOR_MEDIAN": "Median einer Liste", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Ist der Median aller Werte in einer Liste.", - "MATH_ONLIST_OPERATOR_MODE": "am häufigsten in Liste", - "MATH_ONLIST_TOOLTIP_MODE": "Findet den am häufigsten vorkommenden Wert in einer Liste. Falls kein Wert öfter vorkommt als alle anderen, wird die originale Liste zurückgeben", - "MATH_ONLIST_OPERATOR_STD_DEV": "Standardabweichung einer Liste", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Ist die standardisierte Standardabweichung aller Werte in der Liste", - "MATH_ONLIST_OPERATOR_RANDOM": "Zufallswert einer Liste", - "MATH_ONLIST_TOOLTIP_RANDOM": "Gebe einen zufälligen Wert aus der Liste zurück.", - "MATH_MODULO_HELPURL": "https://de.wikipedia.org/wiki/Modulo", - "MATH_MODULO_TITLE": "Rest von %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Der Rest nach einer Division.", - "MATH_CONSTRAIN_TITLE": "begrenze %1 von %2 bis %3", - "MATH_CONSTRAIN_TOOLTIP": "Begrenzt den Wertebereich auf den \"von\"-Wert bis einschließlich zum \"bis\"-Wert. (inklusiv)", - "MATH_RANDOM_INT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen", - "MATH_RANDOM_INT_TITLE": "ganzzahliger Zufallswert zwischen %1 bis %2", - "MATH_RANDOM_INT_TOOLTIP": "Erzeuge einen ganzzahligen Zufallswert zwischen zwei Werten (inklusiv).", - "MATH_RANDOM_FLOAT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Zufallszahl (0.0 -1.0)", - "MATH_RANDOM_FLOAT_TOOLTIP": "Erzeuge eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv).", - "TEXT_TEXT_HELPURL": "https://de.wikipedia.org/wiki/Zeichenkette", - "TEXT_TEXT_TOOLTIP": "Ein Buchstabe, Text oder Satz.", - "TEXT_JOIN_HELPURL": "", - "TEXT_JOIN_TITLE_CREATEWITH": "Erstelle Text aus", - "TEXT_JOIN_TOOLTIP": "Erstellt einen Text durch das Verbinden von mehreren Textelementen.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "verbinden", - "TEXT_CREATE_JOIN_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Ein Element zum Text hinzufügen.", - "TEXT_APPEND_TO": "An", - "TEXT_APPEND_APPENDTEXT": "Text anhängen", - "TEXT_APPEND_TOOLTIP": "Text an die Variable \"%1\" anhängen.", - "TEXT_LENGTH_TITLE": "Länge %1", - "TEXT_LENGTH_TOOLTIP": "Die Anzahl von Zeichen in einem Text. (inkl. Leerzeichen)", - "TEXT_ISEMPTY_TITLE": "%1 ist leer?", - "TEXT_ISEMPTY_TOOLTIP": "Ist wahr (true), wenn der Text keine Zeichen enthält ist.", - "TEXT_INDEXOF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs oder 0 zurück.", - "TEXT_INDEXOF_INPUT_INTEXT": "im Text", - "TEXT_INDEXOF_OPERATOR_FIRST": "Suche erstes Auftreten des Begriffs", - "TEXT_INDEXOF_OPERATOR_LAST": "Suche letztes Auftreten des Begriffs", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "TEXT_CHARAT_INPUT_INTEXT": "vom Text", - "TEXT_CHARAT_FROM_START": "Nehme #ten Buchstaben", - "TEXT_CHARAT_FROM_END": "Nehme #ten Buchstaben von hinten", - "TEXT_CHARAT_FIRST": "Nehme ersten Buchstaben", - "TEXT_CHARAT_LAST": "Nehme letzten Buchstaben", - "TEXT_CHARAT_RANDOM": "Nehme zufälligen Buchstaben", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "Extrahiere einen Buchstaben von einer spezifizierten Position.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Gibt die angegebenen Textabschnitt zurück.", - "TEXT_GET_SUBSTRING_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in Text", - "TEXT_GET_SUBSTRING_START_FROM_START": "vom #ten Buchstaben", - "TEXT_GET_SUBSTRING_START_FROM_END": "vom #ten Buchstaben von hinten", - "TEXT_GET_SUBSTRING_START_FIRST": "vom ersten Buchstaben", - "TEXT_GET_SUBSTRING_END_FROM_START": "bis zum #ten Buchstaben", - "TEXT_GET_SUBSTRING_END_FROM_END": "bis zum #ten Buchstaben von hinten", - "TEXT_GET_SUBSTRING_END_LAST": "bis zum letzten Buchstaben", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "Wandelt Schreibweise von Texten um, in Großbuchstaben, Kleinbuchstaben oder den ersten Buchstaben jedes Wortes groß und die anderen klein.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "umwandeln in GROSSBUCHSTABEN", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "umwandeln in kleinbuchstaben", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "umwandeln in Substantive", - "TEXT_TRIM_TOOLTIP": "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes.", - "TEXT_TRIM_OPERATOR_BOTH": "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)", - "TEXT_TRIM_OPERATOR_LEFT": "entferne Leerzeichen vom Anfang (links)", - "TEXT_TRIM_OPERATOR_RIGHT": "entferne Leerzeichen vom Ende (rechts)", - "TEXT_PRINT_TITLE": "Ausgabe %1", - "TEXT_PRINT_TOOLTIP": "Gib den Inhalt einer Variable aus.", - "TEXT_PROMPT_TYPE_TEXT": "Fragt nach Text mit Hinweis", - "TEXT_PROMPT_TYPE_NUMBER": "Fragt nach Zahl mit Hinweis", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Fragt den Benutzer nach einer Zahl.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Fragt den Benutzer nach einem Text.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "Erzeuge eine leere Liste", - "LISTS_CREATE_EMPTY_TOOLTIP": "Erzeugt eine leere Liste ohne Inhalt.", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Erzeugt eine List mit konfigurierten Elementen.", - "LISTS_CREATE_WITH_INPUT_WITH": "Erzeuge Liste mit", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "Liste", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ein Element zur Liste hinzufügen.", - "LISTS_REPEAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "LISTS_REPEAT_TOOLTIP": "Erzeugt eine Liste mit einer variablen Anzahl von Elementen", - "LISTS_REPEAT_TITLE": "Erzeuge Liste mit Element %1 wiederhole es %2 mal", - "LISTS_LENGTH_TITLE": "Länge von %1", - "LISTS_LENGTH_TOOLTIP": "Die Anzahl von Elementen in der Liste.", - "LISTS_ISEMPTY_TITLE": "%1 ist leer?", - "LISTS_ISEMPTY_TOOLTIP": "Ist wahr (true), wenn die Liste leer ist.", - "LISTS_INLIST": "von der Liste", - "LISTS_INDEX_OF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "LISTS_INDEX_OF_FIRST": "suche erstes Auftreten von", - "LISTS_INDEX_OF_LAST": "suche letztes Auftreten von", - "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (index) eines Elementes in der Liste. Gibt 0 zurück, falls kein Element gefunden wurde.", - "LISTS_GET_INDEX_GET": "nimm", - "LISTS_GET_INDEX_GET_REMOVE": "nimm und entferne", - "LISTS_GET_INDEX_REMOVE": "entferne", - "LISTS_GET_INDEX_FROM_START": "#tes", - "LISTS_GET_INDEX_FROM_END": "#tes von hinten", - "LISTS_GET_INDEX_FIRST": "erstes", - "LISTS_GET_INDEX_LAST": "letztes", - "LISTS_GET_INDEX_RANDOM": "zufälliges", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Extrahiere das #1te Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Extrahiere das #1te Element aus Ende der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Extrahiere das erste Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Extrahiere das letzte Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Extrahiere ein zufälliges Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Extrahiere und entfernt das #1te Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Extrahiere und entfernt das #1te Element aus Ende der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Extrahiere und entfernt das erste Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Extrahiere und entfernt das letzte Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Extrahiere und entfernt ein zufälliges Element aus der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Entfernt das #1te Element von der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Entfernt das #1te Element von Ende der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Entfernt das erste Element von der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Entfernt das letzte Element von der Liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Entfernt ein zufälliges Element von der Liste.", - "LISTS_SET_INDEX_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "LISTS_SET_INDEX_SET": "setze", - "LISTS_SET_INDEX_INSERT": "füge", - "LISTS_SET_INDEX_INPUT_TO": "ein", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setzte das Element an der angegebenen Position in der Liste. #1 ist das erste Element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setzt das Element an der angegebenen Position in der Liste. #1 ist das letzte Element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setzt das erste Element in der Liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setzt das letzte Element in der Liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt ein zufälliges Element in der Liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist die erste Element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Fügt das Element an der angegebenen Position in der Liste ein. #1 ist das letzte Element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Fügt das Element an den Anfang der Liste an.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Fügt das Element ans Ende der Liste an.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Fügt das Element zufällig in die Liste ein.", - "LISTS_GET_SUBLIST_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "LISTS_GET_SUBLIST_START_FROM_START": "erhalte Unterliste von #", - "LISTS_GET_SUBLIST_START_FROM_END": "erhalte Unterliste von # von hinten", - "LISTS_GET_SUBLIST_START_FIRST": "erhalte Unterliste vom Anfang", - "LISTS_GET_SUBLIST_END_FROM_START": "bis zu #", - "LISTS_GET_SUBLIST_END_FROM_END": "bis zu # von hinten", - "LISTS_GET_SUBLIST_END_LAST": "bis zum Ende", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "Liste aus Text erstellen", - "LISTS_SPLIT_TEXT_FROM_LIST": "Text aus Liste erstellen", - "LISTS_SPLIT_WITH_DELIMITER": "mit Trennzeichen", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen.", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_HELPURL": "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29", - "VARIABLES_GET_TOOLTIP": "Gibt den Wert der Variable zurück.", - "VARIABLES_GET_CREATE_SET": "Erzeuge \"Schreibe %1\"", - "VARIABLES_SET_HELPURL": "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29", - "VARIABLES_SET": "Schreibe %1 %2", - "VARIABLES_SET_TOOLTIP": "Setzt den Wert einer Variable.", - "VARIABLES_SET_CREATE_GET": "Erzeuge \"Lese %1\"", - "PROCEDURES_DEFNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_DEFNORETURN_TITLE": "zu", - "PROCEDURES_DEFNORETURN_PROCEDURE": "Funktionsblock", - "PROCEDURES_BEFORE_PARAMS": "mit:", - "PROCEDURES_CALL_BEFORE_PARAMS": "mit:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Ein Funktionsblock ohne Rückgabewert.", - "PROCEDURES_DEFRETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_DEFRETURN_RETURN": "gebe zurück", - "PROCEDURES_DEFRETURN_TOOLTIP": "Ein Funktionsblock mit Rückgabewert.", - "PROCEDURES_ALLOW_STATEMENTS": "Aussagen erlauben", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Warnung: dieser Funktionsblock hat zwei gleich benannte Parameter.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Rufe einen Funktionsblock ohne Rückgabewert auf.", - "PROCEDURES_CALLRETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Rufe einen Funktionsblock mit Rückgabewert auf.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "Parameter", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen.", - "PROCEDURES_MUTATORARG_TITLE": "Variable:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Eine Eingabe zur Funktion hinzufügen.", - "PROCEDURES_HIGHLIGHT_DEF": "Markiere Funktionsblock", - "PROCEDURES_CREATE_DO": "Erzeuge \"Aufruf %1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Wenn der erste Wert wahr (true) ist, Gebe den zweiten Wert zurück.", - "PROCEDURES_IFRETURN_WARNING": "Warnung: Dieser Block darf nur innerhalb eines Funktionsblock genutzt werden." -} diff --git a/msg/json/el.json b/msg/json/el.json deleted file mode 100644 index 50d55e1900..0000000000 --- a/msg/json/el.json +++ /dev/null @@ -1,332 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Azountas", - "Espertus", - "Evropi", - "Namatreasure", - "Sfyrakis", - "Glavkos", - "Gchr", - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "αντικείμενο", - "TODAY": "Σήμερα", - "DUPLICATE_BLOCK": "Αντίγραφο", - "ADD_COMMENT": "Πρόσθεσε Σχόλιο", - "REMOVE_COMMENT": "Αφαίρεσε Το Σχόλιο", - "EXTERNAL_INPUTS": "Εξωτερικές Είσοδοι", - "INLINE_INPUTS": "Εσωτερικές Είσοδοι", - "DELETE_BLOCK": "Διέγραψε Το Μπλοκ", - "DELETE_X_BLOCKS": "Διέγραψε %1 Μπλοκ", - "DELETE_ALL_BLOCKS": "Να διαγραφούν και τα %1 μπλοκ?", - "COLLAPSE_BLOCK": "Σύμπτυξε Το Μπλοκ", - "COLLAPSE_ALL": "Σύμπτυξτε Όλα Τα Μπλοκ", - "EXPAND_BLOCK": "Επέκτεινε Το Μπλοκ", - "EXPAND_ALL": "Επέκτεινε Όλα Τα Μπλοκ", - "DISABLE_BLOCK": "Απενεργοποίησε Το Μπλοκ", - "ENABLE_BLOCK": "Ενεργοποίησε Το Μπλοκ", - "HELP": "Βοήθεια", - "CHAT": "Μπορείς να μιλήσεις με τον συνεργάτη σου πληκτρολογώντας σ'αυτό το πλαίσιο!", - "AUTH": "Παρακαλώ κάνε έγκριση της εφαρμογής για να επιτρέπεται η αποθήκευση και κοινοποίηση της εργασίας σου.", - "ME": "Εγώ", - "CHANGE_VALUE_TITLE": "Άλλαξε την τιμή:", - "NEW_VARIABLE": "Νέα μεταβλητή...", - "NEW_VARIABLE_TITLE": "Νέο όνομα μεταβλητής:", - "RENAME_VARIABLE": "Μετονόμασε τη μεταβλητή...", - "RENAME_VARIABLE_TITLE": "Μετονόμασε όλες τις μεταβλητές «%1» σε:", - "COLOUR_PICKER_HELPURL": "https://el.wikipedia.org/wiki/%CE%A7%CF%81%CF%8E%CE%BC%CE%B1", - "COLOUR_PICKER_TOOLTIP": "Επιτρέπει επιλογή χρώματος από την παλέτα.", - "COLOUR_RANDOM_TITLE": "τυχαίο χρώμα", - "COLOUR_RANDOM_TOOLTIP": "Επιλέγει χρώμα τυχαία.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "χρώμα με", - "COLOUR_RGB_RED": "κόκκινο", - "COLOUR_RGB_GREEN": "πράσινο", - "COLOUR_RGB_BLUE": "μπλε", - "COLOUR_RGB_TOOLTIP": "Δημιουργεί χρώμα με το συγκεκριμένο ποσό του κόκκινου, πράσινου και μπλε που ορίζεις. Όλες οι τιμές πρέπει να είναι μεταξύ 0 και 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "μείγμα", - "COLOUR_BLEND_COLOUR1": "χρώμα 1", - "COLOUR_BLEND_COLOUR2": "χρώμα 2", - "COLOUR_BLEND_RATIO": "αναλογία", - "COLOUR_BLEND_TOOLTIP": "Συνδυάζει δύο χρώματα μαζί με μια δεδομένη αναλογία (0.0 - 1,0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "επανάλαβε %1 φορές", - "CONTROLS_REPEAT_INPUT_DO": "κάνε", - "CONTROLS_REPEAT_TOOLTIP": "Εκτελεί κάποιες εντολές αρκετές φορές.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "επανάλαβε ενώ", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "επανάλαβε μέχρι", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Ενόσω μια τιμή είναι αληθής, τότε εκτελεί κάποιες εντολές.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Ενόσω μια τιμή είναι ψευδής, τότε εκτελεί κάποιες εντολές.", - "CONTROLS_FOR_HELPURL": "Blockly", - "CONTROLS_FOR_TOOLTIP": "Η μεταβλητή «%1» παίρνει τιμές ξεκινώντας από τον αριθμό έναρξης μέχρι τον αριθμό τέλους αυξάνοντας κάθε φορά με το καθορισμένο βήμα και εκτελώντας το καθορισμένο μπλοκ.", - "CONTROLS_FOR_TITLE": "μέτρησε με %1 από το %2 έως το %3 ανά %4", - "CONTROLS_FOREACH_TITLE": "για κάθε στοιχείο %1 στη λίστα %2", - "CONTROLS_FOREACH_TOOLTIP": "Για κάθε στοιχείο σε μια λίστα, ορίζει τη μεταβλητή «%1» στο στοιχείο και, στη συνέχεια, εκτελεί κάποιες εντολές.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "φεύγει από το μπλοκ επαναλήψεως", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "συνέχισε με την επόμενη επανάληψη του μπλοκ επαναλήψεως", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Ξεφεύγει (βγαίνει έξω) από την επανάληψη.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Παραλείπει το υπόλοιπο τμήμα αυτού του μπλοκ επαναλήψεως, και συνεχίζει με την επόμενη επανάληψη.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Προειδοποίηση: Αυτό το μπλοκ μπορεί να χρησιμοποιηθεί μόνο μέσα σε μια επανάληψη.", - "CONTROLS_IF_TOOLTIP_1": "Αν μια τιμή είναι αληθής, τότε εκτελεί κάποιες εντολές.", - "CONTROLS_IF_TOOLTIP_2": "Αν μια τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, εκτελεί το δεύτερο τμήμα εντολών.", - "CONTROLS_IF_TOOLTIP_3": "Αν η πρώτη τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, αν η δεύτερη τιμή είναι αληθής, εκτελεί το δεύτερο μπλοκ εντολών.", - "CONTROLS_IF_TOOLTIP_4": "Αν η πρώτη τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, αν η δεύτερη τιμή είναι αληθής, εκτελεί το δεύτερο τμήμα εντολών. Αν καμία από τις τιμές δεν είναι αληθής, εκτελεί το τελευταίο τμήμα εντολών.", - "CONTROLS_IF_MSG_IF": "εάν", - "CONTROLS_IF_MSG_ELSEIF": "εναλλακτικά εάν", - "CONTROLS_IF_MSG_ELSE": "αλλιώς", - "CONTROLS_IF_IF_TOOLTIP": "Προσθέτει, αφαιρεί ή αναδιατάσσει τα τμήματα για να αναδιαμορφώσει αυτό το μπλοκ «εάν».", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Πρόσθετει μια κατάσταση/συνθήκη στο μπλοκ «εάν».", - "CONTROLS_IF_ELSE_TOOLTIP": "Προσθέτει μια τελική κατάσταση/συνθήκη, που πιάνει όλες τις άλλες περιπτώσεις, στο μπλοκ «εάν».", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι ίσες μεταξύ τους.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Επιστρέφει αληθής αν και οι δύο είσοδοι δεν είναι ίσες μεταξύ τους.", - "LOGIC_COMPARE_TOOLTIP_LT": "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από τη δεύτερη είσοδο.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από ή ίση με τη δεύτερη είσοδο.", - "LOGIC_COMPARE_TOOLTIP_GT": "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μεγαλύτερη από τη δεύτερη είσοδο.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη ή ίση με τη δεύτερη είσοδο.", - "LOGIC_OPERATION_TOOLTIP_AND": "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι αληθής.", - "LOGIC_OPERATION_AND": "και", - "LOGIC_OPERATION_TOOLTIP_OR": "Επιστρέφει αληθής αν τουλάχιστον μια από τις εισόδους είναι αληθής.", - "LOGIC_OPERATION_OR": "ή", - "LOGIC_NEGATE_TITLE": "όχι %1", - "LOGIC_NEGATE_TOOLTIP": "Επιστρέφει αληθής αν η είσοδος είναι ψευδής. Επιστρέφει ψευδής αν η είσοδος είναι αληθής.", - "LOGIC_BOOLEAN_TRUE": "αληθής", - "LOGIC_BOOLEAN_FALSE": "ψευδής", - "LOGIC_BOOLEAN_TOOLTIP": "Επιστρέφει είτε αληθής είτε ψευδής.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "κενό", - "LOGIC_NULL_TOOLTIP": "Επιστρέφει κενό.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "έλεγχος", - "LOGIC_TERNARY_IF_TRUE": "εάν είναι αληθής", - "LOGIC_TERNARY_IF_FALSE": "εάν είναι ψευδής", - "LOGIC_TERNARY_TOOLTIP": "Ελέγχει την κατάσταση/συνθήκη στον «έλεγχο». Αν η κατάσταση/συνθήκη είναι αληθής, επιστρέφει την τιμή «εάν αληθής», διαφορετικά επιστρέφει την τιμή «εάν ψευδής».", - "MATH_NUMBER_HELPURL": "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82", - "MATH_NUMBER_TOOLTIP": "Ένας αριθμός.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^ ύψωση σε δύναμη", - "MATH_TRIG_SIN": "ημ", - "MATH_TRIG_COS": "συν", - "MATH_TRIG_TAN": "εφ", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CE%B7%CF%84%CE%B9%CE%BA%CE%AE", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Επιστρέφει το άθροισμα των δύο αριθμών.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Επιστρέφει τη διαφορά των δύο αριθμών.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Επιστρέφει το γινόμενο των δύο αριθμών.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Επιστρέφει το πηλίκο των δύο αριθμών.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Επιστρέφει τον πρώτο αριθμό υψωμένο στη δύναμη του δεύτερου αριθμού.", - "MATH_SINGLE_HELPURL": "https://el.wikipedia.org/wiki/%CE%A4%CE%B5%CF%84%CF%81%CE%B1%CE%B3%CF%89%CE%BD%CE%B9%CE%BA%CE%AE_%CF%81%CE%AF%CE%B6%CE%B1", - "MATH_SINGLE_OP_ROOT": "τετραγωνική ρίζα", - "MATH_SINGLE_TOOLTIP_ROOT": "Επιστρέφει την τετραγωνική ρίζα ενός αριθμού.", - "MATH_SINGLE_OP_ABSOLUTE": "απόλυτη", - "MATH_SINGLE_TOOLTIP_ABS": "Επιστρέφει την απόλυτη τιμή ενός αριθμού.", - "MATH_SINGLE_TOOLTIP_NEG": "Επιστρέφει την αρνητική ενός αριθμού.", - "MATH_SINGLE_TOOLTIP_LN": "Επιστρέφει τον νεπέρειο λογάριθμο ενός αριθμού.", - "MATH_SINGLE_TOOLTIP_LOG10": "Επιστρέφει τον λογάριθμο με βάση το 10 ενός αριθμού.", - "MATH_SINGLE_TOOLTIP_EXP": "Επιστρέφει το e υψωμένο στη δύναμη ενός αριθμού.", - "MATH_SINGLE_TOOLTIP_POW10": "Επιστρέφει το 10 υψωμένο στη δύναμη ενός αριθμού.", - "MATH_TRIG_HELPURL": "https://el.wikipedia.org/wiki/%CE%A4%CF%81%CE%B9%CE%B3%CF%89%CE%BD%CE%BF%CE%BC%CE%B5%CF%84%CF%81%CE%B9%CE%BA%CE%AE_%CF%83%CF%85%CE%BD%CE%AC%CF%81%CF%84%CE%B7%CF%83%CE%B7", - "MATH_TRIG_TOOLTIP_SIN": "Επιστρέφει το ημίτονο ενός βαθμού (όχι ακτινίου).", - "MATH_TRIG_TOOLTIP_COS": "Επιστρέφει το συνημίτονο ενός βαθμού (όχι ακτινίου).", - "MATH_TRIG_TOOLTIP_TAN": "Επιστρέφει την εφαπτομένη ενός βαθμού (όχι ακτινίου).", - "MATH_TRIG_TOOLTIP_ASIN": "Επιστρέφει το τόξο ημίτονου ενός αριθμού.", - "MATH_TRIG_TOOLTIP_ACOS": "Επιστρέφει το τόξο συνημίτονου ενός αριθμού.", - "MATH_TRIG_TOOLTIP_ATAN": "Επιστρέφει το τόξο εφαπτομένης ενός αριθμού.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Επιστρέφει μία από τις κοινές σταθερές: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...), ή ∞ (άπειρο).", - "MATH_IS_EVEN": "είναι άρτιος", - "MATH_IS_ODD": "είναι περιττός", - "MATH_IS_PRIME": "είναι πρώτος", - "MATH_IS_WHOLE": "είναι ακέραιος", - "MATH_IS_POSITIVE": "είναι θετικός", - "MATH_IS_NEGATIVE": "είναι αρνητικός", - "MATH_IS_DIVISIBLE_BY": "είναι διαιρετός από το", - "MATH_IS_TOOLTIP": "Ελέγχει αν ένας αριθμός είναι άρτιος, περιττός, πρώτος, ακέραιος, θετικός, αρνητικός, ή αν είναι διαιρετός από έναν ορισμένο αριθμό. Επιστρέφει αληθής ή ψευδής.", - "MATH_CHANGE_HELPURL": "https://el.wikipedia.org/wiki/%CE%A0%CF%81%CF%8C%CF%83%CE%B8%CE%B5%CF%83%CE%B7", - "MATH_CHANGE_TITLE": "άλλαξε %1 από %2", - "MATH_CHANGE_TOOLTIP": "Προσθέτει έναν αριθμό στη μεταβλητή «%1».", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Στρογγυλοποιεί έναν αριθμό προς τα πάνω ή προς τα κάτω.", - "MATH_ROUND_OPERATOR_ROUND": "στρογγυλοποίησε", - "MATH_ROUND_OPERATOR_ROUNDUP": "στρογγυλοποίησε προς τα πάνω", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "στρογγυλοποίησε προς τα κάτω", - "MATH_ONLIST_OPERATOR_SUM": "άθροισμα λίστας", - "MATH_ONLIST_TOOLTIP_SUM": "Επιστρέφει το άθροισμα όλων των αριθμών στη λίστα.", - "MATH_ONLIST_OPERATOR_MIN": "μικρότερος λίστας", - "MATH_ONLIST_TOOLTIP_MIN": "Επιστρέφει τον μικρότερο αριθμό στη λίστα.", - "MATH_ONLIST_OPERATOR_MAX": "μεγαλύτερος λίστας", - "MATH_ONLIST_TOOLTIP_MAX": "Επιστρέφει τον μεγαλύτερο αριθμό στη λίστα.", - "MATH_ONLIST_OPERATOR_AVERAGE": "μέσος όρος λίστας", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Επιστρέφει τον αριθμητικό μέσο όρο από τις αριθμητικές τιμές στη λίστα.", - "MATH_ONLIST_OPERATOR_MEDIAN": "διάμεσος λίστας", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Επιστρέφει τον διάμεσο της λίστας.", - "MATH_ONLIST_OPERATOR_MODE": "μορφές λίστας", - "MATH_ONLIST_TOOLTIP_MODE": "Επιστρέφει μια λίστα με τα πιο κοινά στοιχεία στη λίστα.", - "MATH_ONLIST_OPERATOR_STD_DEV": "τυπική απόκλιση λίστας", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Επιστρέφει την τυπική απόκλιση της λίστας.", - "MATH_ONLIST_OPERATOR_RANDOM": "τυχαίο στοιχείο λίστας", - "MATH_ONLIST_TOOLTIP_RANDOM": "Επιστρέφει ένα τυχαίο στοιχείο από τη λίστα.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "υπόλοιπο της %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Επιστρέφει το υπόλοιπο της διαίρεσης των δύο αριθμών.", - "MATH_CONSTRAIN_TITLE": "περιόρισε %1 χαμηλή %2 υψηλή %3", - "MATH_CONSTRAIN_TOOLTIP": "Περιορίζει έναν αριθμό μεταξύ των προβλεπόμενων ορίων (χωρίς αποκλεισμούς).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "τυχαίος ακέραιος από το %1 έως το %2", - "MATH_RANDOM_INT_TOOLTIP": "Επιστρέφει έναν τυχαίο ακέραιο αριθμό μεταξύ δύο συγκεκριμένων ορίων (εντός - συμπεριλαμβανομένων και των ακραίων τιμών).", - "MATH_RANDOM_FLOAT_HELPURL": "https://el.wikipedia.org/wiki/%CE%93%CE%B5%CE%BD%CE%BD%CE%AE%CF%84%CF%81%CE%B9%CE%B1_%CE%A4%CF%85%CF%87%CE%B1%CE%AF%CF%89%CE%BD_%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8E%CE%BD", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "τυχαίο κλάσμα", - "MATH_RANDOM_FLOAT_TOOLTIP": "Επιστρέψει ένα τυχαία κλάσμα μεταξύ 0,0 (κλειστό) και 1,0 (ανοικτό).", - "TEXT_TEXT_HELPURL": "https://el.wikipedia.org/wiki/%CE%A3%CF%85%CE%BC%CE%B2%CE%BF%CE%BB%CE%BF%CF%83%CE%B5%CE%B9%CF%81%CE%AC", - "TEXT_TEXT_TOOLTIP": "Ένα γράμμα, μια λέξη ή μια γραμμή κειμένου.", - "TEXT_JOIN_TITLE_CREATEWITH": "δημιούργησε κείμενο με", - "TEXT_JOIN_TOOLTIP": "Δημιουργεί ένα κομμάτι κειμένου ενώνοντας έναν απεριόριστο αριθμό αντικειμένων.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "ένωσε", - "TEXT_CREATE_JOIN_TOOLTIP": "Προσθέτει, αφαιρεί ή αναδιατάσσει τους τομείς για να αναδιαμορφώσει αυτό το μπλοκ κειμένου.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Προσθέτει ένα στοιχείο στο κείμενο.", - "TEXT_APPEND_TO": "έως", - "TEXT_APPEND_APPENDTEXT": "ανάθεσε κείμενο", - "TEXT_APPEND_TOOLTIP": "Αναθέτει κείμενο στη μεταβλητή «%1».", - "TEXT_LENGTH_TITLE": "το μήκος του %1", - "TEXT_LENGTH_TOOLTIP": "Επιστρέφει το πλήθος των γραμμάτων (συμπεριλαμβανομένων και των κενών διαστημάτων) στο παρεχόμενο κείμενο.", - "TEXT_ISEMPTY_TITLE": "το %1 είναι κενό", - "TEXT_ISEMPTY_TOOLTIP": "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό.", - "TEXT_INDEXOF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή 0, αν δε βρει το κείμενο.", - "TEXT_INDEXOF_INPUT_INTEXT": "στο κείμενο", - "TEXT_INDEXOF_OPERATOR_FIRST": "βρες την πρώτη εμφάνιση του κειμένου", - "TEXT_INDEXOF_OPERATOR_LAST": "βρες την τελευταία εμφάνιση του κειμένου", - "TEXT_CHARAT_INPUT_INTEXT": "στο κείμενο", - "TEXT_CHARAT_FROM_START": "πάρε το γράμμα #", - "TEXT_CHARAT_FROM_END": "πάρε το γράμμα # από το τέλος", - "TEXT_CHARAT_FIRST": "πάρε το πρώτο γράμμα", - "TEXT_CHARAT_LAST": "πάρε το τελευταίο γράμμα", - "TEXT_CHARAT_RANDOM": "πάρε τυχαίο γράμμα", - "TEXT_CHARAT_TOOLTIP": "Επιστρέφει το γράμμα στην καθορισμένη θέση.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Επιστρέφει ένα συγκεκριμένο τμήμα του κειμένου.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "στο κείμενο", - "TEXT_GET_SUBSTRING_START_FROM_START": "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα", - "TEXT_GET_SUBSTRING_START_FROM_END": "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα από το τέλος", - "TEXT_GET_SUBSTRING_START_FIRST": "πάρε τη δευτερεύουσα συμβολοσειρά από το πρώτο γράμμα", - "TEXT_GET_SUBSTRING_END_FROM_START": "μέχρι το # γράμμα", - "TEXT_GET_SUBSTRING_END_FROM_END": "μέχρι το # γράμμα από το τέλος", - "TEXT_GET_SUBSTRING_END_LAST": "μέχρι το τελευταίο γράμμα", - "TEXT_CHANGECASE_TOOLTIP": "Επιστρέφει ένα αντίγραφο του κειμένου σε διαφορετική μορφή γραμμάτων.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "σε ΚΕΦΑΛΑΙΑ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "σε πεζά", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "σε Λέξεις Με Πρώτα Κεφαλαία", - "TEXT_TRIM_TOOLTIP": "Επιστρέφει ένα αντίγραφο του κειμένου με αφαιρεμένα τα κενά από το ένα ή και τα δύο άκρα.", - "TEXT_TRIM_OPERATOR_BOTH": "περίκοψε τα κενά και από τις δυο πλευρές του", - "TEXT_TRIM_OPERATOR_LEFT": "περίκοψε τα κενά από την αριστερή πλευρά του", - "TEXT_TRIM_OPERATOR_RIGHT": "περίκοψε τα κενά από την δεξιά πλευρά του", - "TEXT_PRINT_TITLE": "εκτύπωσε %1", - "TEXT_PRINT_TOOLTIP": "Εκτυπώνει το καθορισμένο κείμενο, αριθμό ή άλλη τιμή.", - "TEXT_PROMPT_TYPE_TEXT": "πρότρεψε με μήνυμα για να δοθεί κείμενο", - "TEXT_PROMPT_TYPE_NUMBER": "πρότρεψε με μήνυμα για να δοθεί αριθμός", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Δημιουργεί προτροπή για τον χρήστη για να δώσει ένα αριθμό.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Δημιουργεί προτροπή για το χρήστη για να δώσει κάποιο κείμενο.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "δημιούργησε κενή λίστα", - "LISTS_CREATE_EMPTY_TOOLTIP": "Επιστρέφει μια λίστα, με μήκος 0, η οποία δεν περιέχει εγγραφές δεδομένων", - "LISTS_CREATE_WITH_TOOLTIP": "Δημιουργεί λίστα με οποιονδήποτε αριθμό αντικειμένων.", - "LISTS_CREATE_WITH_INPUT_WITH": "δημιούργησε λίστα με", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "λίστα", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Προσθέτει, αφαιρεί ή αναδιατάσσει τα τμήματα για να αναδιαμορφώσει αυτό το μπλοκ λίστας.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Προσθέτει αντικείμενο στη λίστα.", - "LISTS_REPEAT_HELPURL": "Blockly", - "LISTS_REPEAT_TOOLTIP": "Δημιουργεί μια λίστα που αποτελείται από την δεδομένη τιμή που επαναλαμβάνεται για συγκεκριμένο αριθμό επαναλήψεων.", - "LISTS_REPEAT_TITLE": "δημιούργησε λίστα με το στοιχείο %1 να επαναλαμβάνεται %2 φορές", - "LISTS_LENGTH_HELPURL": "Blockly", - "LISTS_LENGTH_TITLE": "το μήκος του %1", - "LISTS_LENGTH_TOOLTIP": "Επιστρέφει το μήκος μιας λίστας.", - "LISTS_ISEMPTY_TITLE": "το %1 είναι κενό", - "LISTS_ISEMPTY_TOOLTIP": "Επιστρέφει αληθής αν η λίστα είναι κενή.", - "LISTS_INLIST": "στη λίστα", - "LISTS_INDEX_OF_HELPURL": "Blockly", - "LISTS_INDEX_OF_FIRST": "βρες την πρώτη εμφάνιση του στοιχείου", - "LISTS_INDEX_OF_LAST": "βρες την τελευταία εμφάνιση του στοιχείου", - "LISTS_INDEX_OF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή 0, αν το κείμενο δεν βρεθεί.", - "LISTS_GET_INDEX_GET": "πάρε", - "LISTS_GET_INDEX_GET_REMOVE": "πάρε και αφαίρεσε", - "LISTS_GET_INDEX_REMOVE": "αφαίρεσε", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# από το τέλος", - "LISTS_GET_INDEX_FIRST": "πρώτο", - "LISTS_GET_INDEX_LAST": "τελευταίο", - "LISTS_GET_INDEX_RANDOM": "τυχαίο", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Επιστρέφει το πρώτο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Επιστρέφει το τελευταίο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Καταργεί και επιστρέφει το πρώτο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Καταργεί και επιστρέφει το τελευταίο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Καταργεί και επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Καταργεί το πρώτο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Καταργεί το τελευταίο στοιχείο σε μια λίστα.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Καταργεί ένα τυχαίο στοιχείο σε μια λίστα.", - "LISTS_SET_INDEX_SET": "όρισε", - "LISTS_SET_INDEX_INSERT": "είσαγε στο", - "LISTS_SET_INDEX_INPUT_TO": "σε", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Ορίζει το πρώτο στοιχείο σε μια λίστα.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Ορίζει το τελευταίο στοιχείο σε μια λίστα.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Ορίζει ένα τυχαίο στοιχείο σε μια λίστα.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Εισάγει το στοιχείο στην καθορισμένη θέση σε μια λίστα. Το #1 είναι το πρώτο στοιχείο.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Εισάγει το στοιχείο σε συγκεκριμένη θέση σε μια λίστα. Το #1 είναι το τελευταίο στοιχείο.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Εισάγει το στοιχείο στην αρχή μιας λίστας.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Αναθέτει το στοιχείο στο τέλος μιας λίστας.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Εισάγει το στοιχείο τυχαία σε μια λίστα.", - "LISTS_GET_SUBLIST_HELPURL": "Blockly", - "LISTS_GET_SUBLIST_START_FROM_START": "πάρε υπολίστα από #", - "LISTS_GET_SUBLIST_START_FROM_END": "πάρε υπολίστα από # από το τέλος", - "LISTS_GET_SUBLIST_START_FIRST": "πάρε υπολίστα από την αρχή", - "LISTS_GET_SUBLIST_END_FROM_START": "έως #", - "LISTS_GET_SUBLIST_END_FROM_END": "έως # από το τέλος", - "LISTS_GET_SUBLIST_END_LAST": "έως το τελευταίο", - "LISTS_GET_SUBLIST_TOOLTIP": "Δημιουργεί ένα αντίγραφο του καθορισμένου τμήματος μιας λίστας.", - "LISTS_SPLIT_LIST_FROM_TEXT": "κάνετε λίστα από το κείμενο", - "LISTS_SPLIT_TEXT_FROM_LIST": "κάνετε κείμενο από τη λίστα", - "LISTS_SPLIT_WITH_DELIMITER": "με διαχωριστικό", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Διαίρεση του κειμένου σε μια λίστα κειμένων, με σπάσιμο σε κάθε διαχωριστικό.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Ενώστε μια λίστα κειμένων σε ένα κείμενο, που χωρίζονται από ένα διαχωριστικό.", - "VARIABLES_GET_TOOLTIP": "Επιστρέφει την τιμή αυτής της μεταβλητής.", - "VARIABLES_GET_CREATE_SET": "Δημιούργησε «όρισε %1»", - "VARIABLES_SET": "όρισε %1 μέχρι το %2", - "VARIABLES_SET_TOOLTIP": "Ορίζει αυτή τη μεταβλητή να είναι ίση με την είσοδο.", - "VARIABLES_SET_CREATE_GET": "Δημιούργησε «πάρε %1»", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "στο", - "PROCEDURES_DEFNORETURN_PROCEDURE": "κάνε κάτι", - "PROCEDURES_BEFORE_PARAMS": "με:", - "PROCEDURES_CALL_BEFORE_PARAMS": "με:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Δημιουργεί μια συνάρτηση χωρίς έξοδο.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "επέστρεψε", - "PROCEDURES_DEFRETURN_TOOLTIP": "Δημιουργεί μια συνάρτηση με μια έξοδο.", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Προειδοποίηση: Αυτή η συνάρτηση έχει διπλότυπες παραμέτρους.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://el.wikipedia.org/wiki/%CE%94%CE%B9%CE%B1%CE%B4%CE%B9%CE%BA%CE%B1%CF%83%CE%AF%CE%B1_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Εκτελεί την ορισμένη από τον χρήστη συνάρτηση «%1».", - "PROCEDURES_CALLRETURN_HELPURL": "https://el.wikipedia.org/wiki/%CE%94%CE%B9%CE%B1%CE%B4%CE%B9%CE%BA%CE%B1%CF%83%CE%AF%CE%B1_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Εκτελεί την ορισμένη από τον χρήστη συνάρτηση «%1» και χρησιμοποίησε την έξοδό της.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "είσοδοι", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Προσθέτει, αφαιρεί ή αναδιατάσσει εισόδους σε αυτήν τη λειτουργία", - "PROCEDURES_MUTATORARG_TITLE": "όνομα εισόδου:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Πρόσθεσε μια είσοδος στη συνάρτηση", - "PROCEDURES_HIGHLIGHT_DEF": "Επισημάνετε τον ορισμό συνάρτησης", - "PROCEDURES_CREATE_DO": "Δημιούργησε «%1»", - "PROCEDURES_IFRETURN_TOOLTIP": "Αν μια τιμή είναι αληθής, τότε επιστρέφει τη δεύτερη τιμή.", - "PROCEDURES_IFRETURN_WARNING": "Προειδοποίηση: Αυτό το μπλοκ μπορεί να χρησιμοποιηθεί μόνο στον ορισμό μιας συνάρτησης." -} diff --git a/msg/json/en.json b/msg/json/en.json deleted file mode 100644 index 8e2775794b..0000000000 --- a/msg/json/en.json +++ /dev/null @@ -1,364 +0,0 @@ -{ - "@metadata": { - "author": "Ellen Spertus ", - "lastupdated": "2015-12-17 15:16:44.762585", - "locale": "en", - "messagedocumentation" : "qqq" - }, - "VARIABLES_DEFAULT_NAME": "item", - "TODAY": "Today", - "DUPLICATE_BLOCK": "Duplicate", - "ADD_COMMENT": "Add Comment", - "REMOVE_COMMENT": "Remove Comment", - "EXTERNAL_INPUTS": "External Inputs", - "INLINE_INPUTS": "Inline Inputs", - "DELETE_BLOCK": "Delete Block", - "DELETE_X_BLOCKS": "Delete %1 Blocks", - "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", - "CLEAN_UP": "Clean up Blocks", - "COLLAPSE_BLOCK": "Collapse Block", - "COLLAPSE_ALL": "Collapse Blocks", - "EXPAND_BLOCK": "Expand Block", - "EXPAND_ALL": "Expand Blocks", - "DISABLE_BLOCK": "Disable Block", - "ENABLE_BLOCK": "Enable Block", - "HELP": "Help", - "CHAT": "Chat with your collaborator by typing in this box!", - "AUTH": "Please authorize this app to enable your work to be saved and to allow it to be shared by you.", - "ME": "Me", - "CHANGE_VALUE_TITLE": "Change value:", - "NEW_VARIABLE": "New variable...", - "NEW_VARIABLE_TITLE": "New variable name:", - "RENAME_VARIABLE": "Rename variable...", - "RENAME_VARIABLE_TITLE": "Rename all '%1' variables to:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Choose a colour from the palette.", - "COLOUR_RANDOM_HELPURL": "http://randomcolour.com", - "COLOUR_RANDOM_TITLE": "random colour", - "COLOUR_RANDOM_TOOLTIP": "Choose a colour at random.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "colour with", - "COLOUR_RGB_RED": "red", - "COLOUR_RGB_GREEN": "green", - "COLOUR_RGB_BLUE": "blue", - "COLOUR_RGB_TOOLTIP": "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "blend", - "COLOUR_BLEND_COLOUR1": "colour 1", - "COLOUR_BLEND_COLOUR2": "colour 2", - "COLOUR_BLEND_RATIO": "ratio", - "COLOUR_BLEND_TOOLTIP": "Blends two colours together with a given ratio (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "repeat %1 times", - "CONTROLS_REPEAT_INPUT_DO": "do", - "CONTROLS_REPEAT_TOOLTIP": "Do some statements several times.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repeat while", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repeat until", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "While a value is true, then do some statements.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "While a value is false, then do some statements.", - "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", - "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.", - "CONTROLS_FOR_TITLE": "count with %1 from %2 to %3 by %4", - "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", - "CONTROLS_FOREACH_TITLE": "for each item %1 in list %2", - "CONTROLS_FOREACH_TOOLTIP": "For each item in a list, set the variable '%1' to the item, and then do some statements.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "break out of loop", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continue with next iteration of loop", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Break out of the containing loop.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Skip the rest of this loop, and continue with the next iteration.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Warning: This block may only be used within a loop.", - "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", - "CONTROLS_IF_TOOLTIP_1": "If a value is true, then do some statements.", - "CONTROLS_IF_TOOLTIP_2": "If a value is true, then do the first block of statements. Otherwise, do the second block of statements.", - "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.", - "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.", - "CONTROLS_IF_MSG_IF": "if", - "CONTROLS_IF_MSG_ELSEIF": "else if", - "CONTROLS_IF_MSG_ELSE": "else", - "CONTROLS_IF_IF_TOOLTIP": "Add, remove, or reorder sections to reconfigure this if block.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Add a condition to the if block.", - "CONTROLS_IF_ELSE_TOOLTIP": "Add a final, catch-all condition to the if block.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Return true if both inputs equal each other.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Return true if both inputs are not equal to each other.", - "LOGIC_COMPARE_TOOLTIP_LT": "Return true if the first input is smaller than the second input.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Return true if the first input is smaller than or equal to the second input.", - "LOGIC_COMPARE_TOOLTIP_GT": "Return true if the first input is greater than the second input.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Return true if the first input is greater than or equal to the second input.", - "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", - "LOGIC_OPERATION_TOOLTIP_AND": "Return true if both inputs are true.", - "LOGIC_OPERATION_AND": "and", - "LOGIC_OPERATION_TOOLTIP_OR": "Return true if at least one of the inputs is true.", - "LOGIC_OPERATION_OR": "or", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", - "LOGIC_NEGATE_TITLE": "not %1", - "LOGIC_NEGATE_TOOLTIP": "Returns true if the input is false. Returns false if the input is true.", - "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", - "LOGIC_BOOLEAN_TRUE": "true", - "LOGIC_BOOLEAN_FALSE": "false", - "LOGIC_BOOLEAN_TOOLTIP": "Returns either true or false.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Returns null.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "if true", - "LOGIC_TERNARY_IF_FALSE": "if false", - "LOGIC_TERNARY_TOOLTIP": "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "A number.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Return the sum of the two numbers.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Return the difference of the two numbers.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Return the product of the two numbers.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Return the quotient of the two numbers.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Return the first number raised to the power of the second number.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "square root", - "MATH_SINGLE_TOOLTIP_ROOT": "Return the square root of a number.", - "MATH_SINGLE_OP_ABSOLUTE": "absolute", - "MATH_SINGLE_TOOLTIP_ABS": "Return the absolute value of a number.", - "MATH_SINGLE_TOOLTIP_NEG": "Return the negation of a number.", - "MATH_SINGLE_TOOLTIP_LN": "Return the natural logarithm of a number.", - "MATH_SINGLE_TOOLTIP_LOG10": "Return the base 10 logarithm of a number.", - "MATH_SINGLE_TOOLTIP_EXP": "Return e to the power of a number.", - "MATH_SINGLE_TOOLTIP_POW10": "Return 10 to the power of a number.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Return the sine of a degree (not radian).", - "MATH_TRIG_TOOLTIP_COS": "Return the cosine of a degree (not radian).", - "MATH_TRIG_TOOLTIP_TAN": "Return the tangent of a degree (not radian).", - "MATH_TRIG_TOOLTIP_ASIN": "Return the arcsine of a number.", - "MATH_TRIG_TOOLTIP_ACOS": "Return the arccosine of a number.", - "MATH_TRIG_TOOLTIP_ATAN": "Return the arctangent of a number.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "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).", - "MATH_IS_EVEN": "is even", - "MATH_IS_ODD": "is odd", - "MATH_IS_PRIME": "is prime", - "MATH_IS_WHOLE": "is whole", - "MATH_IS_POSITIVE": "is positive", - "MATH_IS_NEGATIVE": "is negative", - "MATH_IS_DIVISIBLE_BY": "is divisible by", - "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.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "change %1 by %2", - "MATH_CHANGE_TOOLTIP": "Add a number to variable '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Round a number up or down.", - "MATH_ROUND_OPERATOR_ROUND": "round", - "MATH_ROUND_OPERATOR_ROUNDUP": "round up", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "round down", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "sum of list", - "MATH_ONLIST_TOOLTIP_SUM": "Return the sum of all the numbers in the list.", - "MATH_ONLIST_OPERATOR_MIN": "min of list", - "MATH_ONLIST_TOOLTIP_MIN": "Return the smallest number in the list.", - "MATH_ONLIST_OPERATOR_MAX": "max of list", - "MATH_ONLIST_TOOLTIP_MAX": "Return the largest number in the list.", - "MATH_ONLIST_OPERATOR_AVERAGE": "average of list", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Return the average (arithmetic mean) of the numeric values in the list.", - "MATH_ONLIST_OPERATOR_MEDIAN": "median of list", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Return the median number in the list.", - "MATH_ONLIST_OPERATOR_MODE": "modes of list", - "MATH_ONLIST_TOOLTIP_MODE": "Return a list of the most common item(s) in the list.", - "MATH_ONLIST_OPERATOR_STD_DEV": "standard deviation of list", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Return the standard deviation of the list.", - "MATH_ONLIST_OPERATOR_RANDOM": "random item of list", - "MATH_ONLIST_TOOLTIP_RANDOM": "Return a random element from the list.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "remainder of %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Return the remainder from dividing the two numbers.", - "MATH_CONSTRAIN_HELPURL": "https://en.wikipedia.org/wiki/Clamping_%28graphics%29", - "MATH_CONSTRAIN_TITLE": "constrain %1 low %2 high %3", - "MATH_CONSTRAIN_TOOLTIP": "Constrain a number to be between the specified limits (inclusive).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "random integer from %1 to %2", - "MATH_RANDOM_INT_TOOLTIP": "Return a random integer between the two specified limits, inclusive.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "random fraction", - "MATH_RANDOM_FLOAT_TOOLTIP": "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "A letter, word, or line of text.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", - "TEXT_JOIN_TITLE_CREATEWITH": "create text with", - "TEXT_JOIN_TOOLTIP": "Create a piece of text by joining together any number of items.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "join", - "TEXT_CREATE_JOIN_TOOLTIP": "Add, remove, or reorder sections to reconfigure this text block.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Add an item to the text.", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", - "TEXT_APPEND_TO": "to", - "TEXT_APPEND_APPENDTEXT": "append text", - "TEXT_APPEND_TOOLTIP": "Append some text to variable '%1'.", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", - "TEXT_LENGTH_TITLE": "length of %1", - "TEXT_LENGTH_TOOLTIP": "Returns the number of letters (including spaces) in the provided text.", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", - "TEXT_ISEMPTY_TITLE": "%1 is empty", - "TEXT_ISEMPTY_TOOLTIP": "Returns true if the provided text is empty.", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", - "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found.", - "TEXT_INDEXOF_INPUT_INTEXT": "in text", - "TEXT_INDEXOF_OPERATOR_FIRST": "find first occurrence of text", - "TEXT_INDEXOF_OPERATOR_LAST": "find last occurrence of text", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", - "TEXT_CHARAT_INPUT_INTEXT": "in text", - "TEXT_CHARAT_FROM_START": "get letter #", - "TEXT_CHARAT_FROM_END": "get letter # from end", - "TEXT_CHARAT_FIRST": "get first letter", - "TEXT_CHARAT_LAST": "get last letter", - "TEXT_CHARAT_RANDOM": "get random letter", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "Returns the letter at the specified position.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Returns a specified portion of the text.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in text", - "TEXT_GET_SUBSTRING_START_FROM_START": "get substring from letter #", - "TEXT_GET_SUBSTRING_START_FROM_END": "get substring from letter # from end", - "TEXT_GET_SUBSTRING_START_FIRST": "get substring from first letter", - "TEXT_GET_SUBSTRING_END_FROM_START": "to letter #", - "TEXT_GET_SUBSTRING_END_FROM_END": "to letter # from end", - "TEXT_GET_SUBSTRING_END_LAST": "to last letter", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", - "TEXT_CHANGECASE_TOOLTIP": "Return a copy of the text in a different case.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "to UPPER CASE", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "to lower case", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "to Title Case", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", - "TEXT_TRIM_TOOLTIP": "Return a copy of the text with spaces removed from one or both ends.", - "TEXT_TRIM_OPERATOR_BOTH": "trim spaces from both sides of", - "TEXT_TRIM_OPERATOR_LEFT": "trim spaces from left side of", - "TEXT_TRIM_OPERATOR_RIGHT": "trim spaces from right side of", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", - "TEXT_PRINT_TITLE": "print %1", - "TEXT_PRINT_TOOLTIP": "Print the specified text, number or other value.", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", - "TEXT_PROMPT_TYPE_TEXT": "prompt for text with message", - "TEXT_PROMPT_TYPE_NUMBER": "prompt for number with message", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Prompt for user for a number.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Prompt for user for some text.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "create empty list", - "LISTS_CREATE_EMPTY_TOOLTIP": "Returns a list, of length 0, containing no data records", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Create a list with any number of items.", - "LISTS_CREATE_WITH_INPUT_WITH": "create list with", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "list", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Add, remove, or reorder sections to reconfigure this list block.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Add an item to the list.", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_REPEAT_TOOLTIP": "Creates a list consisting of the given value repeated the specified number of times.", - "LISTS_REPEAT_TITLE": "create list with item %1 repeated %2 times", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", - "LISTS_LENGTH_TITLE": "length of %1", - "LISTS_LENGTH_TOOLTIP": "Returns the length of a list.", - "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", - "LISTS_ISEMPTY_TITLE": "%1 is empty", - "LISTS_ISEMPTY_TOOLTIP": "Returns true if the list is empty.", - "LISTS_INLIST": "in list", - "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", - "LISTS_INDEX_OF_FIRST": "find first occurrence of item", - "LISTS_INDEX_OF_LAST": "find last occurrence of item", - "LISTS_INDEX_OF_TOOLTIP": "Returns the index of the first/last occurrence of the item in the list. Returns 0 if item is not found.", - "LISTS_GET_INDEX_GET": "get", - "LISTS_GET_INDEX_GET_REMOVE": "get and remove", - "LISTS_GET_INDEX_REMOVE": "remove", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# from end", - "LISTS_GET_INDEX_FIRST": "first", - "LISTS_GET_INDEX_LAST": "last", - "LISTS_GET_INDEX_RANDOM": "random", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Returns the item at the specified position in a list. #1 is the first item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Returns the item at the specified position in a list. #1 is the last item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returns the first item in a list.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returns the last item in a list.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returns a random item in a list.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Removes and returns the item at the specified position in a list. #1 is the first item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Removes and returns the item at the specified position in a list. #1 is the last item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Removes and returns the first item in a list.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Removes and returns the last item in a list.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Removes and returns a random item in a list.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Removes the item at the specified position in a list. #1 is the first item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Removes the item at the specified position in a list. #1 is the last item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Removes the first item in a list.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Removes the last item in a list.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Removes a random item in a list.", - "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", - "LISTS_SET_INDEX_SET": "set", - "LISTS_SET_INDEX_INSERT": "insert at", - "LISTS_SET_INDEX_INPUT_TO": "as", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Sets the item at the specified position in a list. #1 is the first item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Sets the item at the specified position in a list. #1 is the last item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Sets the first item in a list.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Sets the last item in a list.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Sets a random item in a list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Inserts the item at the specified position in a list. #1 is the first item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Inserts the item at the specified position in a list. #1 is the last item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Inserts the item at the start of a list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Append the item to the end of a list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Inserts the item randomly in a list.", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", - "LISTS_GET_SUBLIST_START_FROM_START": "get sub-list from #", - "LISTS_GET_SUBLIST_START_FROM_END": "get sub-list from # from end", - "LISTS_GET_SUBLIST_START_FIRST": "get sub-list from first", - "LISTS_GET_SUBLIST_END_FROM_START": "to #", - "LISTS_GET_SUBLIST_END_FROM_END": "to # from end", - "LISTS_GET_SUBLIST_END_LAST": "to last", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "Creates a copy of the specified portion of a list.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "make list from text", - "LISTS_SPLIT_TEXT_FROM_LIST": "make text from list", - "LISTS_SPLIT_WITH_DELIMITER": "with delimiter", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Split text into a list of texts, breaking at each delimiter.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Join a list of texts into one text, separated by a delimiter.", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", - "VARIABLES_GET_TOOLTIP": "Returns the value of this variable.", - "VARIABLES_GET_CREATE_SET": "Create 'set %1'", - "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", - "VARIABLES_SET": "set %1 to %2", - "VARIABLES_SET_TOOLTIP": "Sets this variable to be equal to the input.", - "VARIABLES_SET_CREATE_GET": "Create 'get %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "to", - "PROCEDURES_DEFNORETURN_PROCEDURE": "do something", - "PROCEDURES_BEFORE_PARAMS": "with:", - "PROCEDURES_CALL_BEFORE_PARAMS": "with:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Creates a function with no output.", - "PROCEDURES_DEFNORETURN_COMMENT": "Describe this function...", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "return", - "PROCEDURES_DEFRETURN_TOOLTIP": "Creates a function with an output.", - "PROCEDURES_ALLOW_STATEMENTS": "allow statements", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Warning: This function has duplicate parameters.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Run the user-defined function '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Run the user-defined function '%1' and use its output.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "inputs", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Add, remove, or reorder inputs to this function.", - "PROCEDURES_MUTATORARG_TITLE": "input name:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Add an input to the function.", - "PROCEDURES_HIGHLIGHT_DEF": "Highlight function definition", - "PROCEDURES_CREATE_DO": "Create '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "If a value is true, then return a second value.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", - "PROCEDURES_IFRETURN_WARNING": "Warning: This block may be used only within a function definition." -} diff --git a/msg/json/es.json b/msg/json/es.json deleted file mode 100644 index b64687ef12..0000000000 --- a/msg/json/es.json +++ /dev/null @@ -1,309 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Fitoschido", - "VegaDark", - "WeSiToS", - "Macofe" - ] - }, - "VARIABLES_DEFAULT_NAME": "elemento", - "TODAY": "Hoy", - "DUPLICATE_BLOCK": "Duplicar", - "ADD_COMMENT": "Añadir comentario", - "REMOVE_COMMENT": "Eliminar comentario", - "EXTERNAL_INPUTS": "Entradas externas", - "INLINE_INPUTS": "Entradas en línea", - "DELETE_BLOCK": "Eliminar bloque", - "DELETE_X_BLOCKS": "Eliminar %1 bloques", - "DELETE_ALL_BLOCKS": "¿Eliminar todos los %1 bloques?", - "CLEAN_UP": "Limpiar los bloques", - "COLLAPSE_BLOCK": "Contraer bloque", - "COLLAPSE_ALL": "Contraer bloques", - "EXPAND_BLOCK": "Expandir bloque", - "EXPAND_ALL": "Expandir bloques", - "DISABLE_BLOCK": "Desactivar bloque", - "ENABLE_BLOCK": "Activar bloque", - "HELP": "Ayuda", - "CHAT": "¡Chatea con tu colaborador escribiendo en este cuadro!", - "AUTH": "Autoriza a esta aplicación para guardar tu trabajo y permitir que lo compartas.", - "ME": "Yo", - "CHANGE_VALUE_TITLE": "Cambiar el valor:", - "NEW_VARIABLE": "Variable nueva…", - "NEW_VARIABLE_TITLE": "Nombre de variable nueva:", - "RENAME_VARIABLE": "Renombrar la variable…", - "RENAME_VARIABLE_TITLE": "Renombrar todas las variables «%1» a:", - "COLOUR_PICKER_HELPURL": "https://es.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Elige un color de la paleta.", - "COLOUR_RANDOM_TITLE": "color aleatorio", - "COLOUR_RANDOM_TOOLTIP": "Elige un color al azar.", - "COLOUR_RGB_TITLE": "colorear con", - "COLOUR_RGB_RED": "rojo", - "COLOUR_RGB_GREEN": "verde", - "COLOUR_RGB_BLUE": "azul", - "COLOUR_RGB_TOOLTIP": "Crea un color con cantidades específicas de rojo, verde y azul. Todos los valores deben encontrarse entre 0 y 100.", - "COLOUR_BLEND_TITLE": "combinar", - "COLOUR_BLEND_COLOUR1": "color 1", - "COLOUR_BLEND_COLOUR2": "color 2", - "COLOUR_BLEND_RATIO": "proporción", - "COLOUR_BLEND_TOOLTIP": "Combina dos colores con una proporción determinada (0,0–1,0).", - "CONTROLS_REPEAT_HELPURL": "https://es.wikipedia.org/wiki/Bucle_for", - "CONTROLS_REPEAT_TITLE": "repetir %1 veces", - "CONTROLS_REPEAT_INPUT_DO": "hacer", - "CONTROLS_REPEAT_TOOLTIP": "Hacer algunas declaraciones varias veces.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repetir mientras", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repetir hasta", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Mientras un valor sea verdadero, entonces hacer algunas declaraciones.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Mientras un valor sea falso, entonces hacer algunas declaraciones.", - "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.", - "CONTROLS_FOR_TITLE": "contar con %1 desde %2 hasta %3 de a %4", - "CONTROLS_FOREACH_HELPURL": "https://es.wikipedia.org/wiki/Foreach", - "CONTROLS_FOREACH_TITLE": "para cada elemento %1 en la lista %2", - "CONTROLS_FOREACH_TOOLTIP": "Para cada elemento en una lista, establecer la variable '%1' al elemento y luego hacer algunas declaraciones.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "romper el bucle", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continuar con la siguiente iteración del bucle", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Romper el bucle que lo contiene.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Saltar el resto de este bucle, y continuar con la siguiente iteración.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "ADVERTENCIA: Este bloque puede usarse sólo dentro de un bucle.", - "CONTROLS_IF_TOOLTIP_1": "Si un valor es verdadero, entonces hacer algunas declaraciones.", - "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.", - "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.", - "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.", - "CONTROLS_IF_MSG_IF": "si", - "CONTROLS_IF_MSG_ELSEIF": "sino si", - "CONTROLS_IF_MSG_ELSE": "sino", - "CONTROLS_IF_IF_TOOLTIP": "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Agregar una condición a este bloque.", - "CONTROLS_IF_ELSE_TOOLTIP": "Agregar una condición general final a este bloque.", - "LOGIC_COMPARE_HELPURL": "https://es.wikipedia.org/wiki/Desigualdad_matemática", - "LOGIC_COMPARE_TOOLTIP_EQ": "Devuelve verdadero si ambas entradas son iguales.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Devuelve verdadero si ambas entradas son distintas.", - "LOGIC_COMPARE_TOOLTIP_LT": "Devuelve verdadero si la primera entrada es menor que la segunda entrada.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Devuelve verdadero si la primera entrada es menor que o igual a la segunda entrada.", - "LOGIC_COMPARE_TOOLTIP_GT": "Devuelve verdadero si la primera entrada es mayor que la segunda entrada.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Devuelve verdadero si la primera entrada es mayor o igual a la segunda entrada.", - "LOGIC_OPERATION_TOOLTIP_AND": "Devuelve verdadero si ambas entradas son verdaderas.", - "LOGIC_OPERATION_AND": "y", - "LOGIC_OPERATION_TOOLTIP_OR": "Devuelve verdadero si al menos una de las entradas es verdadera.", - "LOGIC_OPERATION_OR": "o", - "LOGIC_NEGATE_TITLE": "no %1", - "LOGIC_NEGATE_TOOLTIP": "Devuelve verdadero si la entrada es falsa. Devuelve falso si la entrada es verdadera.", - "LOGIC_BOOLEAN_TRUE": "verdadero", - "LOGIC_BOOLEAN_FALSE": "falso", - "LOGIC_BOOLEAN_TOOLTIP": "Devuelve verdadero o falso.", - "LOGIC_NULL": "nulo", - "LOGIC_NULL_TOOLTIP": "Devuelve nulo.", - "LOGIC_TERNARY_CONDITION": "prueba", - "LOGIC_TERNARY_IF_TRUE": "si es verdadero", - "LOGIC_TERNARY_IF_FALSE": "si es falso", - "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\".", - "MATH_NUMBER_HELPURL": "https://es.wikipedia.org/wiki/Número", - "MATH_NUMBER_TOOLTIP": "Un número.", - "MATH_ARITHMETIC_HELPURL": "https://es.wikipedia.org/wiki/Aritmética", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Devuelve la suma de ambos números.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Devuelve la diferencia de ambos números.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Devuelve el producto de ambos números.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Devuelve el cociente de ambos números.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Devuelve el primer número elevado a la potencia del segundo.", - "MATH_SINGLE_HELPURL": "https://es.wikipedia.org/wiki/Ra%C3%ADz_cuadrada", - "MATH_SINGLE_OP_ROOT": "raíz cuadrada", - "MATH_SINGLE_TOOLTIP_ROOT": "Devuelve la raíz cuadrada de un número.", - "MATH_SINGLE_OP_ABSOLUTE": "absoluto", - "MATH_SINGLE_TOOLTIP_ABS": "Devuelve el valor absoluto de un número.", - "MATH_SINGLE_TOOLTIP_NEG": "Devuelve la negación de un número.", - "MATH_SINGLE_TOOLTIP_LN": "Devuelve el logaritmo natural de un número.", - "MATH_SINGLE_TOOLTIP_LOG10": "Devuelve el logaritmo base 10 de un número.", - "MATH_SINGLE_TOOLTIP_EXP": "Devuelve e a la potencia de un número.", - "MATH_SINGLE_TOOLTIP_POW10": "Devuelve 10 a la potencia de un número.", - "MATH_TRIG_HELPURL": "https://es.wikipedia.org/wiki/Función_trigonométrica", - "MATH_TRIG_TOOLTIP_SIN": "Devuelve el seno de un grado (no radián).", - "MATH_TRIG_TOOLTIP_COS": "Devuelve el coseno de un grado (no radián).", - "MATH_TRIG_TOOLTIP_TAN": "Devuelve la tangente de un grado (no radián).", - "MATH_TRIG_TOOLTIP_ASIN": "Devuelve el arcoseno de un número.", - "MATH_TRIG_TOOLTIP_ACOS": "Devuelve el arcocoseno de un número.", - "MATH_TRIG_TOOLTIP_ATAN": "Devuelve el arcotangente de un número.", - "MATH_CONSTANT_HELPURL": "https://es.wikipedia.org/wiki/Anexo:Constantes_matemáticas", - "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).", - "MATH_IS_EVEN": "es par", - "MATH_IS_ODD": "es impar", - "MATH_IS_PRIME": "es primo", - "MATH_IS_WHOLE": "es entero", - "MATH_IS_POSITIVE": "es positivo", - "MATH_IS_NEGATIVE": "es negativo", - "MATH_IS_DIVISIBLE_BY": "es divisible por", - "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.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "cambiar %1 por %2", - "MATH_CHANGE_TOOLTIP": "Añadir un número a la variable «%1».", - "MATH_ROUND_HELPURL": "https://es.wikipedia.org/wiki/Redondeo", - "MATH_ROUND_TOOLTIP": "Redondear un número hacia arriba o hacia abajo.", - "MATH_ROUND_OPERATOR_ROUND": "redondear", - "MATH_ROUND_OPERATOR_ROUNDUP": "redondear hacia arriba", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "redondear hacia abajo", - "MATH_ONLIST_OPERATOR_SUM": "suma de la lista", - "MATH_ONLIST_TOOLTIP_SUM": "Devuelve la suma de todos los números en la lista.", - "MATH_ONLIST_OPERATOR_MIN": "mínimo de la lista", - "MATH_ONLIST_TOOLTIP_MIN": "Devuelve el número más pequeño en la lista.", - "MATH_ONLIST_OPERATOR_MAX": "máximo de la lista", - "MATH_ONLIST_TOOLTIP_MAX": "Devuelve el número más grande en la lista.", - "MATH_ONLIST_OPERATOR_AVERAGE": "promedio de la lista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Devuelve el promedio (media aritmética) de los valores numéricos en la lista.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana de la lista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Devuelve la mediana en la lista.", - "MATH_ONLIST_OPERATOR_MODE": "modas de la lista", - "MATH_ONLIST_TOOLTIP_MODE": "Devuelve una lista de los elementos más comunes en la lista.", - "MATH_ONLIST_OPERATOR_STD_DEV": "desviación estándar de la lista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Devuelve la desviación estándar de la lista.", - "MATH_ONLIST_OPERATOR_RANDOM": "elemento aleatorio de la lista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Devuelve un elemento aleatorio de la lista.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "resto de %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Devuelve el resto al dividir los dos números.", - "MATH_CONSTRAIN_TITLE": "limitar %1 entre %2 y %3", - "MATH_CONSTRAIN_TOOLTIP": "Limitar un número entre los límites especificados (inclusive).", - "MATH_RANDOM_INT_HELPURL": "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios", - "MATH_RANDOM_INT_TITLE": "entero aleatorio de %1 a %2", - "MATH_RANDOM_INT_TOOLTIP": "Devuelve un entero aleatorio entre los dos límites especificados, inclusive.", - "MATH_RANDOM_FLOAT_HELPURL": "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fracción aleatoria", - "MATH_RANDOM_FLOAT_TOOLTIP": "Devuelve una fracción aleatoria entre 0,0 (ambos inclusive) y 1.0 (exclusivo).", - "TEXT_TEXT_HELPURL": "https://es.wikipedia.org/wiki/Cadena_de_caracteres", - "TEXT_TEXT_TOOLTIP": "Una letra, palabra o línea de texto.", - "TEXT_JOIN_TITLE_CREATEWITH": "crear texto con", - "TEXT_JOIN_TOOLTIP": "Crear un fragmento de texto al unir cualquier número de elementos.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "unir", - "TEXT_CREATE_JOIN_TOOLTIP": "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque de texto.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Agregar un elemento al texto.", - "TEXT_APPEND_TO": "a", - "TEXT_APPEND_APPENDTEXT": "añadir texto", - "TEXT_APPEND_TOOLTIP": "Añadir texto a la variable '%1'.", - "TEXT_LENGTH_TITLE": "longitud de %1", - "TEXT_LENGTH_TOOLTIP": "Devuelve el número de letras (incluyendo espacios) en el texto proporcionado.", - "TEXT_ISEMPTY_TITLE": "%1 está vacío", - "TEXT_ISEMPTY_TOOLTIP": "Devuelve verdadero si el texto proporcionado está vacío.", - "TEXT_INDEXOF_TOOLTIP": "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve 0 si el texto no se encuentra.", - "TEXT_INDEXOF_INPUT_INTEXT": "en el texto", - "TEXT_INDEXOF_OPERATOR_FIRST": "encontrar la primera aparición del texto", - "TEXT_INDEXOF_OPERATOR_LAST": "encontrar la última aparición del texto", - "TEXT_CHARAT_INPUT_INTEXT": "en el texto", - "TEXT_CHARAT_FROM_START": "obtener la letra #", - "TEXT_CHARAT_FROM_END": "obtener la letra # del final", - "TEXT_CHARAT_FIRST": "obtener la primera letra", - "TEXT_CHARAT_LAST": "obtener la última letra", - "TEXT_CHARAT_RANDOM": "obtener letra aleatoria", - "TEXT_CHARAT_TOOLTIP": "Devuelve la letra en la posición especificada.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Devuelve una porción determinada del texto.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "en el texto", - "TEXT_GET_SUBSTRING_START_FROM_START": "obtener subcadena desde la letra #", - "TEXT_GET_SUBSTRING_START_FROM_END": "obtener subcadena desde la letra # del final", - "TEXT_GET_SUBSTRING_START_FIRST": "obtener subcadena desde la primera letra", - "TEXT_GET_SUBSTRING_END_FROM_START": "hasta la letra #", - "TEXT_GET_SUBSTRING_END_FROM_END": "hasta la letra # del final", - "TEXT_GET_SUBSTRING_END_LAST": "hasta la última letra", - "TEXT_CHANGECASE_TOOLTIP": "Devuelve una copia del texto en un caso diferente.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "a MAYÚSCULAS", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "a minúsculas", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "a Mayúsculas Cada Palabra", - "TEXT_TRIM_TOOLTIP": "Devuelve una copia del texto sin los espacios de uno o ambos extremos.", - "TEXT_TRIM_OPERATOR_BOTH": "quitar espacios de ambos lados de", - "TEXT_TRIM_OPERATOR_LEFT": "quitar espacios iniciales de", - "TEXT_TRIM_OPERATOR_RIGHT": "quitar espacios finales de", - "TEXT_PRINT_TITLE": "imprimir %1", - "TEXT_PRINT_TOOLTIP": "Imprimir el texto, número u otro valor especificado.", - "TEXT_PROMPT_TYPE_TEXT": "solicitar texto con el mensaje", - "TEXT_PROMPT_TYPE_NUMBER": "solicitar número con el mensaje", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Solicitar al usuario un número.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Solicitar al usuario un texto.", - "LISTS_CREATE_EMPTY_TITLE": "crear lista vacía", - "LISTS_CREATE_EMPTY_TOOLTIP": "Devuelve una lista, de longitud 0, sin ningún dato", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Crear una lista con cualquier número de elementos.", - "LISTS_CREATE_WITH_INPUT_WITH": "crear lista con", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Agregar, eliminar o reorganizar las secciones para reconfigurar este bloque de lista.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Agregar un elemento a la lista.", - "LISTS_REPEAT_TOOLTIP": "Crea una lista que consta de un valor dado repetido el número de veces especificado.", - "LISTS_REPEAT_TITLE": "crear lista con el elemento %1 repetido %2 veces", - "LISTS_LENGTH_TITLE": "longitud de %1", - "LISTS_LENGTH_TOOLTIP": "Devuelve la longitud de una lista.", - "LISTS_ISEMPTY_TITLE": "%1 está vacía", - "LISTS_ISEMPTY_TOOLTIP": "Devuelve verdadero si la lista está vacía.", - "LISTS_INLIST": "en la lista", - "LISTS_INDEX_OF_FIRST": "encontrar la primera aparición del elemento", - "LISTS_INDEX_OF_LAST": "encontrar la última aparición del elemento", - "LISTS_INDEX_OF_TOOLTIP": "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve 0 si el elemento no se encuentra.", - "LISTS_GET_INDEX_GET": "obtener", - "LISTS_GET_INDEX_GET_REMOVE": "obtener y eliminar", - "LISTS_GET_INDEX_REMOVE": "eliminar", - "LISTS_GET_INDEX_FROM_END": "# del final", - "LISTS_GET_INDEX_FIRST": "primero", - "LISTS_GET_INDEX_LAST": "último", - "LISTS_GET_INDEX_RANDOM": "aleatorio", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Devuelve el elemento en la posición especificada en la lista. #1 es el primer elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Devuelve el elemento en la posición especificada en una lista. #1 es el último elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Devuelve el primer elemento de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Devuelve el último elemento de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Devuelve un elemento aleatorio en una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Elimina y devuelve el elemento en la posición especificada en la lista. #1 es el primer elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Elimina y devuelve el elemento en la posición especificada en la lista. #1 es el último elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Elimina y devuelve el primer elemento de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Elimina y devuelve el último elemento de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Elimina y devuelve un elemento aleatorio en una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Elimina el elemento en la posición especificada en la lista. #1 es el primer elemento.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Elimina el elemento en la posición especificada en la lista. #1 es el último elemento.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Elimina el primer elemento de una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Elimina el último elemento de una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Elimina un elemento aleatorio en una lista.", - "LISTS_SET_INDEX_SET": "establecer", - "LISTS_SET_INDEX_INSERT": "insertar en", - "LISTS_SET_INDEX_INPUT_TO": "como", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Establece el elemento en la posición especificada en una lista. #1 es el primer elemento.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Establece el elemento en la posición especificada en una lista. #1 es el último elemento.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Establece el primer elemento de una lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Establece el último elemento de una lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Establece un elemento aleatorio en una lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Inserta el elemento en la posición especificada en la lista. #1 es el primer elemento.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Inserta el elemento en la posición especificada en la lista. #1 es el último elemento.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Inserta el elemento al inicio de una lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Añade el elemento al final de una lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Inserta el elemento aleatoriamente en una lista.", - "LISTS_GET_SUBLIST_START_FROM_START": "obtener sublista desde #", - "LISTS_GET_SUBLIST_START_FROM_END": "obtener sublista desde # del final", - "LISTS_GET_SUBLIST_START_FIRST": "obtener sublista desde el primero", - "LISTS_GET_SUBLIST_END_FROM_START": "hasta #", - "LISTS_GET_SUBLIST_END_FROM_END": "hasta # del final", - "LISTS_GET_SUBLIST_END_LAST": "hasta el último", - "LISTS_GET_SUBLIST_TOOLTIP": "Crea una copia de la parte especificada de una lista.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "hacer lista a partir de texto", - "LISTS_SPLIT_TEXT_FROM_LIST": "hacer texto a partir de lista", - "LISTS_SPLIT_WITH_DELIMITER": "con delimitador", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividir el texto en una lista de textos, separando en cada delimitador.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Unir una lista de textos en un solo texto, separado por un delimitador.", - "VARIABLES_GET_TOOLTIP": "Devuelve el valor de esta variable.", - "VARIABLES_GET_CREATE_SET": "Crear 'establecer %1'", - "VARIABLES_SET": "establecer %1 a %2", - "VARIABLES_SET_TOOLTIP": "Establece esta variable para que sea igual a la entrada.", - "VARIABLES_SET_CREATE_GET": "Crear 'obtener %1'", - "PROCEDURES_DEFNORETURN_TITLE": "para", - "PROCEDURES_DEFNORETURN_PROCEDURE": "hacer algo", - "PROCEDURES_BEFORE_PARAMS": "con:", - "PROCEDURES_CALL_BEFORE_PARAMS": "con:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Crea una función sin salida.", - "PROCEDURES_DEFRETURN_RETURN": "devuelve", - "PROCEDURES_DEFRETURN_TOOLTIP": "Crea una función con una salida.", - "PROCEDURES_ALLOW_STATEMENTS": "permitir declaraciones", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Advertencia: Esta función tiene parámetros duplicados.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://es.wikipedia.org/wiki/Subrutina", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Ejecuta la función definida por el usuario '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://es.wikipedia.org/wiki/Subrutina", - "PROCEDURES_CALLRETURN_TOOLTIP": "Ejecuta la función definida por el usuario '%1' y usa su salida.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "entradas", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Añadir, eliminar o reordenar entradas para esta función.", - "PROCEDURES_MUTATORARG_TITLE": "nombre de entrada:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Añadir una entrada a la función.", - "PROCEDURES_HIGHLIGHT_DEF": "Destacar definición de la función", - "PROCEDURES_CREATE_DO": "Crear '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Si un valor es verdadero, entonces devuelve un segundo valor.", - "PROCEDURES_IFRETURN_WARNING": "Advertencia: Este bloque solo puede ser utilizado dentro de la definición de una función." -} diff --git a/msg/json/fa.json b/msg/json/fa.json deleted file mode 100644 index 29048132b8..0000000000 --- a/msg/json/fa.json +++ /dev/null @@ -1,306 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Ebraminio", - "Reza1615", - "Alirezaaa", - "Mehran", - "MohandesWiki", - "Dalba" - ] - }, - "VARIABLES_DEFAULT_NAME": "مورد", - "TODAY": "امروز", - "DUPLICATE_BLOCK": "تکراری", - "ADD_COMMENT": "افزودن نظر", - "REMOVE_COMMENT": "حذف نظر", - "EXTERNAL_INPUTS": "ورودی‌های خارجی", - "INLINE_INPUTS": "ورودی‌های درون خطی", - "DELETE_BLOCK": "حذف بلوک", - "DELETE_X_BLOCKS": "حذف بلوک‌های %1", - "DELETE_ALL_BLOCKS": "حذف همهٔ بلاک‌های %1؟", - "CLEAN_UP": "تمیز کردن بلوک‌ها", - "COLLAPSE_BLOCK": "فروپاشی بلوک", - "COLLAPSE_ALL": "فروپاشی بلوک‌ها", - "EXPAND_BLOCK": "گسترش بلوک", - "EXPAND_ALL": "گسترش بلوک‌ها", - "DISABLE_BLOCK": "غیرفعال‌سازی بلوک", - "ENABLE_BLOCK": "فعال‌سازی بلوک", - "HELP": "راهنما", - "CHAT": "با همکارتان با نوشتن در این کادر چت کنید!", - "AUTH": "لطفا این اپلیکیشن را ثبت کنید و آثارتان را فعال کنید تا ذخیره شود و اجازهٔ اشتراک‌گذاری توسط شما داده شود.", - "ME": "من", - "CHANGE_VALUE_TITLE": "تغییر مقدار:", - "NEW_VARIABLE": "متغیر تازه...", - "NEW_VARIABLE_TITLE": "نام متغیر تازه:", - "RENAME_VARIABLE": "تغییر نام متغیر...", - "RENAME_VARIABLE_TITLE": "تغییر نام همهٔ متغیرهای «%1» به:", - "COLOUR_PICKER_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%86%DA%AF", - "COLOUR_PICKER_TOOLTIP": "انتخاب یک رنگ از تخته‌رنگ.", - "COLOUR_RANDOM_TITLE": "رنگ تصادفی", - "COLOUR_RANDOM_TOOLTIP": "انتخاب یک رنگ به شکل تصادفی.", - "COLOUR_RGB_TITLE": "رنگ با", - "COLOUR_RGB_RED": "قرمز", - "COLOUR_RGB_GREEN": "سبز", - "COLOUR_RGB_BLUE": "آبی", - "COLOUR_RGB_TOOLTIP": "ساخت یک رنگ با مقدار مشخص‌شده‌ای از قرمز، سبز و آبی. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند.", - "COLOUR_BLEND_TITLE": "مخلوط", - "COLOUR_BLEND_COLOUR1": "رنگ ۱", - "COLOUR_BLEND_COLOUR2": "رنگ ۲", - "COLOUR_BLEND_RATIO": "نسبت", - "COLOUR_BLEND_TOOLTIP": "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)", - "CONTROLS_REPEAT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AD%D9%84%D9%82%D9%87_%D9%81%D9%88%D8%B1", - "CONTROLS_REPEAT_TITLE": "%1 بار تکرار", - "CONTROLS_REPEAT_INPUT_DO": "انحام", - "CONTROLS_REPEAT_TOOLTIP": "انجام چند عبارت چندین بار.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "تکرار در حالی که", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "تکرار تا زمانی که", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "تا زمانی که یک مقدار صحیح است، چند عبارت را انجام بده.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "تا زمانی که یک مقدار ناصحیح است، چند عبارت را انجام بده.", - "CONTROLS_FOR_TOOLTIP": "متغیر %1 را در مقادیر شروع‌شده از عدد انتهای به عدد انتهایی را دارد، با فواصل مشخص‌شده می‌شمارد و این بلوک مشخص‌شده را انجام می‌دهد.", - "CONTROLS_FOR_TITLE": "با تعداد %1 از %2 به %3 با گام‌های %4", - "CONTROLS_FOREACH_TITLE": "برای هر مورد %1 در فهرست %2", - "CONTROLS_FOREACH_TOOLTIP": "برای هر مورد در این فهرست، تنظیم متغیر «%1» به مورد و انجام تعدادی عبارت.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "شکستن حلقه", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ادامه با تکرار بعدی حلقه", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "شکستن حلقهٔ شامل.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "پریدن از بقیهٔ حلقه و ادامه با تکرار بعدی.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "اخطار: این بلوک ممکن است فقط داخل یک حلقه استفاده شود.", - "CONTROLS_IF_TOOLTIP_1": "اگر یک مقدار صحیح است، سپس چند عبارت را انجام بده.", - "CONTROLS_IF_TOOLTIP_2": "اگر یک مقدار صحیح است، اول بلوک اول عبارات را انجام بده. در غیر این صورت بلوک دوم عبارات انجام بده.", - "CONTROLS_IF_TOOLTIP_3": "اگر مقدار اول صحیح بود، از آن بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم صحیح است، بلوک دوم عبارات را انجام بده.", - "CONTROLS_IF_TOOLTIP_4": "اگر مقدار اول درست است، بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم درست باشد بلوک دوم عبارات را انجام بده. اگر هیچ از مقادیر درست نبود، آخرین بلوک عبارات را انجام بده.", - "CONTROLS_IF_MSG_IF": "اگر", - "CONTROLS_IF_MSG_ELSEIF": "اگر آنگاه", - "CONTROLS_IF_MSG_ELSE": "آنگاه", - "CONTROLS_IF_IF_TOOLTIP": "افزودن، حذف یا بازمرتب‌سازی قسمت‌ها برای پیکربندی دوبارهٔ این بلوک اگر.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "افزودن یک شرط به بلوک اگر.", - "CONTROLS_IF_ELSE_TOOLTIP": "اضافه‌کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر.", - "LOGIC_COMPARE_HELPURL": "https://fa.wikipedia.org/wiki/%D9%86%D8%A7%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1%DB%8C", - "LOGIC_COMPARE_TOOLTIP_EQ": "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "برگرداندن صحیح اگر هر دو ورودی با یکدیگر برابر نباشند.", - "LOGIC_COMPARE_TOOLTIP_LT": "بازگرداندن صحیح اگر ورودی اول کوچکتر از ورودی دوم باشد.", - "LOGIC_COMPARE_TOOLTIP_LTE": "بازگرداندن صحیح اگر ورودی اول کوچکتر یا مساوی با ورودی دوم باشد.", - "LOGIC_COMPARE_TOOLTIP_GT": "بازگرداندن صحیح اگر ورودی اول بزرگتر از ورودی دوم باشد.", - "LOGIC_COMPARE_TOOLTIP_GTE": "بازگرداندن صحیح اگر ورودی اول بزرگتر یا مساوی یا ورودی دوم باشد.", - "LOGIC_OPERATION_TOOLTIP_AND": "بازگرداندن صحیح اگر هر دو ورودی صحیح باشد.", - "LOGIC_OPERATION_AND": "و", - "LOGIC_OPERATION_TOOLTIP_OR": "بازگرداندن صحیح اگر یکی از دو ورودی صحیح باشد.", - "LOGIC_OPERATION_OR": "یا", - "LOGIC_NEGATE_TITLE": "نه %1", - "LOGIC_NEGATE_TOOLTIP": "صجیج باز می‌گرداند اگر ورودی نا صحیح باشند. ناصحیح بازمی‌گرداند اگر ورودی صحیح باشد.", - "LOGIC_BOOLEAN_TRUE": "صحیح", - "LOGIC_BOOLEAN_FALSE": "ناصحیح", - "LOGIC_BOOLEAN_TOOLTIP": "بازگرداندن یکی از صحیح یا ناصحیح.", - "LOGIC_NULL": "تهی", - "LOGIC_NULL_TOOLTIP": "تهی بازمی‌گرداند.", - "LOGIC_TERNARY_CONDITION": "آزمایش", - "LOGIC_TERNARY_IF_TRUE": "اگر صحیح", - "LOGIC_TERNARY_IF_FALSE": "اگر ناصحیح", - "LOGIC_TERNARY_TOOLTIP": "بررسی وضعیت در «آزمایش». اگر وضعیت صحیح باشد، مقدار «اگر صحیح» را بر می‌گرداند در غیر اینصورت مقدار «اگر ناصحیح» را.", - "MATH_NUMBER_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF", - "MATH_NUMBER_TOOLTIP": "یک عدد.", - "MATH_ARITHMETIC_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AD%D8%B3%D8%A7%D8%A8", - "MATH_ARITHMETIC_TOOLTIP_ADD": "بازگرداندن مقدار جمع دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "بازگرداندن تفاوت دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "بازگرداندن حاصلضرب دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "بازگرداندن باقی‌ماندهٔ دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد.", - "MATH_SINGLE_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%DB%8C%D8%B4%D9%87_%D8%AF%D9%88%D9%85", - "MATH_SINGLE_OP_ROOT": "ریشهٔ دوم", - "MATH_SINGLE_TOOLTIP_ROOT": "ریشهٔ دوم یک عدد را باز می‌گرداند.", - "MATH_SINGLE_OP_ABSOLUTE": "مطلق", - "MATH_SINGLE_TOOLTIP_ABS": "قدر مطلق یک عدد را بازمی‌گرداند.", - "MATH_SINGLE_TOOLTIP_NEG": "منفی‌شدهٔ یک عدد را باز می‌گرداند.", - "MATH_SINGLE_TOOLTIP_LN": "لوگاریتم طبیعی یک عدد را باز می‌گرداند.", - "MATH_SINGLE_TOOLTIP_LOG10": "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد.", - "MATH_SINGLE_TOOLTIP_EXP": "بازگرداندن توان e یک عدد.", - "MATH_SINGLE_TOOLTIP_POW10": "بازگرداندن توان ۱۰ یک عدد.", - "MATH_TRIG_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AA%D8%A7%D8%A8%D8%B9%E2%80%8C%D9%87%D8%A7%DB%8C_%D9%85%D8%AB%D9%84%D8%AB%D8%A7%D8%AA%DB%8C", - "MATH_TRIG_TOOLTIP_SIN": "بازگرداندن سینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_COS": "بازگرداندن کسینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_TAN": "بازگرداندن تانژانت یک درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_ASIN": "بازگرداندن آرک‌سینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_ACOS": "بازگرداندن آرک‌کسینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_ATAN": "بازگرداندن آرک‌تانژانت درجه (نه رادیان).", - "MATH_CONSTANT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AB%D8%A7%D8%A8%D8%AA_%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C", - "MATH_CONSTANT_TOOLTIP": "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت).", - "MATH_IS_EVEN": "زوج است", - "MATH_IS_ODD": "فرد است", - "MATH_IS_PRIME": "عدد اول است", - "MATH_IS_WHOLE": "کامل است", - "MATH_IS_POSITIVE": "مثبت است", - "MATH_IS_NEGATIVE": "منفی است", - "MATH_IS_DIVISIBLE_BY": "تقسیم شده بر", - "MATH_IS_TOOLTIP": "بررسی می‌کند که آیا یک عدد زوج، فرد، اول، کامل، مثبت، منفی یا بخش‌پذیر عدد خاصی باشد را بررسی می‌کند. درست یا نادرست باز می‌گرداند.", - "MATH_CHANGE_HELPURL": "https://fa.wikipedia.org/wiki/%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C#.D8.A7.D9.81.D8.B2.D8.A7.DB.8C.D8.B4_.D8.B4.D9.85.D8.A7.D8.B1.D9.86.D8.AF.D9.87", - "MATH_CHANGE_TITLE": "تغییر %1 با %2", - "MATH_CHANGE_TOOLTIP": "افزودن یک عدد به متغیر '%1'.", - "MATH_ROUND_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", - "MATH_ROUND_TOOLTIP": "گردکردن یک عدد به بالا یا پایین.", - "MATH_ROUND_OPERATOR_ROUND": "گردکردن", - "MATH_ROUND_OPERATOR_ROUNDUP": "گرد به بالا", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "گرد به پایین", - "MATH_ONLIST_OPERATOR_SUM": "جمع فهرست", - "MATH_ONLIST_TOOLTIP_SUM": "جمع همهٔ عددهای فهرست را باز می‌گرداند.", - "MATH_ONLIST_OPERATOR_MIN": "کوچکترین فهرست", - "MATH_ONLIST_TOOLTIP_MIN": "کوچک‌ترین عدد در فهرست را باز می‌گرداند.", - "MATH_ONLIST_OPERATOR_MAX": "بزرگ‌ترین فهرست", - "MATH_ONLIST_TOOLTIP_MAX": "بزرگ‌ترین عدد در فهرست را باز می‌گرداند.", - "MATH_ONLIST_OPERATOR_AVERAGE": "میانگین فهرست", - "MATH_ONLIST_TOOLTIP_AVERAGE": "میانگین (میانگین ریاضی) مقادیر عددی فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_MEDIAN": "میانهٔ فهرست", - "MATH_ONLIST_TOOLTIP_MEDIAN": "میانهٔ عدد در فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_MODE": "مد فهرست", - "MATH_ONLIST_TOOLTIP_MODE": "شایع‌ترین قلم(های) در فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_STD_DEV": "انحراف معیار فهرست", - "MATH_ONLIST_TOOLTIP_STD_DEV": "انحراف معیار فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_RANDOM": "مورد تصادفی از فهرست", - "MATH_ONLIST_TOOLTIP_RANDOM": "موردی تصادفی از فهرست را بر می‌گرداند.", - "MATH_MODULO_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA_%D9%BE%DB%8C%D9%85%D8%A7%D9%86%D9%87", - "MATH_MODULO_TITLE": "باقی‌ماندهٔ %1 + %2", - "MATH_MODULO_TOOLTIP": "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند.", - "MATH_CONSTRAIN_TITLE": "محدودکردن %1 پایین %2 بالا %3", - "MATH_CONSTRAIN_TOOLTIP": "محدودکردن یک عدد بین محدودیت‌های مشخص‌شده (بسته).", - "MATH_RANDOM_INT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF_%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C", - "MATH_RANDOM_INT_TITLE": "عدد صحیح تصادفی بین %1 تا %2", - "MATH_RANDOM_INT_TOOLTIP": "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند.", - "MATH_RANDOM_FLOAT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF_%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "کسر تصادفی", - "MATH_RANDOM_FLOAT_TOOLTIP": "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز).", - "TEXT_TEXT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D8%B4%D8%AA%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", - "TEXT_TEXT_TOOLTIP": "یک حرف، کلمه یا خطی از متن.", - "TEXT_JOIN_TITLE_CREATEWITH": "ایجاد متن با", - "TEXT_JOIN_TOOLTIP": "یک تکه‌ای از متن را با چسپاندن همهٔ تعداد از موارد ایجاد می‌کند.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "عضویت", - "TEXT_CREATE_JOIN_TOOLTIP": "اضافه‌کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "افزودن یک مورد به متن.", - "TEXT_APPEND_TO": "به", - "TEXT_APPEND_APPENDTEXT": "الحاق متن", - "TEXT_APPEND_TOOLTIP": "الحاق متنی به متغیر «%1».", - "TEXT_LENGTH_TITLE": "طول %1", - "TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده.", - "TEXT_ISEMPTY_TITLE": "%1 خالی است", - "TEXT_ISEMPTY_TOOLTIP": "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است.", - "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد ۰ باز می‌گرداند.", - "TEXT_INDEXOF_INPUT_INTEXT": "در متن", - "TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب", - "TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب", - "TEXT_CHARAT_INPUT_INTEXT": "در متن", - "TEXT_CHARAT_FROM_START": "گرفتن حرف #", - "TEXT_CHARAT_FROM_END": "گرفتن حرف # از آخر", - "TEXT_CHARAT_FIRST": "گرفتن اولین حرف", - "TEXT_CHARAT_LAST": "گرفتن آخرین حرف", - "TEXT_CHARAT_RANDOM": "گرفتن حرف تصادفی", - "TEXT_CHARAT_TOOLTIP": "حرفی در موقعیت مشخص‌شده بر می‌گرداند.", - "TEXT_GET_SUBSTRING_TOOLTIP": "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "در متن", - "TEXT_GET_SUBSTRING_START_FROM_START": "گرفتن زیرمتن از حرف #", - "TEXT_GET_SUBSTRING_START_FROM_END": "گرفتن زیرمتن از حرف # به انتها", - "TEXT_GET_SUBSTRING_START_FIRST": "گرفتن زیرمتن از اولین حرف", - "TEXT_GET_SUBSTRING_END_FROM_START": "به حرف #", - "TEXT_GET_SUBSTRING_END_FROM_END": "به حرف # از انتها", - "TEXT_GET_SUBSTRING_END_LAST": "به آخرین حرف", - "TEXT_CHANGECASE_TOOLTIP": "بازگرداندن کپی متن در حالتی متفاوت.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "به حروف بزرگ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "به حروف کوچک", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "به حروف بزرگ عنوان", - "TEXT_TRIM_TOOLTIP": "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند.", - "TEXT_TRIM_OPERATOR_BOTH": "تراشیدن فاصله‌ها از هر دو طرف", - "TEXT_TRIM_OPERATOR_LEFT": "تراشیدن فاصله‌ها از طرف چپ", - "TEXT_TRIM_OPERATOR_RIGHT": "تراشیدن فاصله‌ها از طرف چپ", - "TEXT_PRINT_TITLE": "چاپ %1", - "TEXT_PRINT_TOOLTIP": "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده.", - "TEXT_PROMPT_TYPE_TEXT": "اعلان برای متن با پیام", - "TEXT_PROMPT_TYPE_NUMBER": "اعلان برای عدد با پیام", - "TEXT_PROMPT_TOOLTIP_NUMBER": "اعلان برای کاربر با یک عدد.", - "TEXT_PROMPT_TOOLTIP_TEXT": "اعلان برای کاربر برای یک متن.", - "LISTS_CREATE_EMPTY_TITLE": "ایجاد فهرست خالی", - "LISTS_CREATE_EMPTY_TOOLTIP": "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند.", - "LISTS_CREATE_WITH_TOOLTIP": "فهرستی از هر عددی از موارد می‌سازد.", - "LISTS_CREATE_WITH_INPUT_WITH": "ایجاد فهرست با", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "فهرست", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "اضافه‌کردن، حذف‌کردن یا ترتیب‌سازی مجدد بخش‌ها این بلوک فهرستی.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "اضافه‌کردن یک مورد به فهرست.", - "LISTS_REPEAT_TOOLTIP": "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد.", - "LISTS_REPEAT_TITLE": "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد", - "LISTS_LENGTH_TITLE": "طول %1", - "LISTS_LENGTH_TOOLTIP": "طول یک فهرست را برمی‌گرداند.", - "LISTS_ISEMPTY_TITLE": "%1 خالی است", - "LISTS_ISEMPTY_TOOLTIP": "اگر فهرست خالی است مقدار صجیج بر می‌گرداند.", - "LISTS_INLIST": "در فهرست", - "LISTS_INDEX_OF_FIRST": "یافتن اولین رخ‌داد مورد", - "LISTS_INDEX_OF_LAST": "یافتن آخرین رخ‌داد مورد", - "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. ۰ بر می‌گرداند اگر آیتم موجود نبود.", - "LISTS_GET_INDEX_GET": "گرفتن", - "LISTS_GET_INDEX_GET_REMOVE": "گرفتن و حذف‌کردن", - "LISTS_GET_INDEX_REMOVE": "حذف‌کردن", - "LISTS_GET_INDEX_FROM_END": "# از انتها", - "LISTS_GET_INDEX_FIRST": "اولین", - "LISTS_GET_INDEX_LAST": "آخرین", - "LISTS_GET_INDEX_RANDOM": "تصادفی", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "موردی در محل مشخص‌شده بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "موردی در محل مشخص در فهرست بر می‌گرداند. #1 آخرین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "اولین مورد یک فهرست را بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "آخرین مورد در یک فهرست را بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "یک مورد تصادفی در یک فهرست بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "اولین مورد را در یک فهرست حذف می‌کند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "آخرین مورد را در یک فهرست حذف می‌کند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "یک مورد تصادفی را یک فهرست حذف می‌کند.", - "LISTS_SET_INDEX_SET": "مجموعه", - "LISTS_SET_INDEX_INSERT": "درج در", - "LISTS_SET_INDEX_INPUT_TO": "به عنوان", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 آخرین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "اولین مورد در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "آخرین مورد در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "یک مورد تصادفی در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 آخرین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "موردی به ته فهرست اضافه می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "موردی به ته فهرست الحاق می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "مورد را به صورت تصادفی در یک فهرست می‌افزاید.", - "LISTS_GET_SUBLIST_START_FROM_START": "گرفتن زیرمجموعه‌ای از #", - "LISTS_GET_SUBLIST_START_FROM_END": "گرفتن زیرمجموعه‌ای از # از انتها", - "LISTS_GET_SUBLIST_START_FIRST": "گرفتن زیرمجموعه‌ای از ابتدا", - "LISTS_GET_SUBLIST_END_FROM_START": "به #", - "LISTS_GET_SUBLIST_END_FROM_END": "به # از انتها", - "LISTS_GET_SUBLIST_END_LAST": "به آخرین", - "LISTS_GET_SUBLIST_TOOLTIP": "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند.", - "LISTS_SPLIT_LIST_FROM_TEXT": "ایجاد فهرست از متن", - "LISTS_SPLIT_TEXT_FROM_LIST": "ایجاد متن از فهرست", - "LISTS_SPLIT_WITH_DELIMITER": "همراه جداساز", - "VARIABLES_GET_TOOLTIP": "مقدار این متغیر را بر می‌گرداند.", - "VARIABLES_GET_CREATE_SET": "درست‌کردن «تنظیم %1»", - "VARIABLES_SET": "مجموعه %1 به %2", - "VARIABLES_SET_TOOLTIP": "متغیر برابر با خروجی را مشخص می‌کند.", - "VARIABLES_SET_CREATE_GET": "درست‌کردن «گرفتن %1»", - "PROCEDURES_DEFNORETURN_TITLE": "به", - "PROCEDURES_DEFNORETURN_PROCEDURE": "انجام چیزی", - "PROCEDURES_BEFORE_PARAMS": "با:", - "PROCEDURES_CALL_BEFORE_PARAMS": "با:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "تابعی می‌سازد بدون هیچ خروجی.", - "PROCEDURES_DEFRETURN_RETURN": "بازگشت", - "PROCEDURES_DEFRETURN_TOOLTIP": "تابعی با یک خروجی می‌سازد.", - "PROCEDURES_ALLOW_STATEMENTS": "اجازه اظهارات", - "PROCEDURES_DEF_DUPLICATE_WARNING": "اخطار: این تابعی پارامتر تکراری دارد.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1».", - "PROCEDURES_CALLRETURN_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "ورودی‌ها", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع.", - "PROCEDURES_MUTATORARG_TITLE": "نام ورودی:", - "PROCEDURES_MUTATORARG_TOOLTIP": "اضافه کردن ورودی به تابع.", - "PROCEDURES_HIGHLIGHT_DEF": "برجسته‌سازی تعریف تابع", - "PROCEDURES_CREATE_DO": "ساختن «%1»", - "PROCEDURES_IFRETURN_TOOLTIP": "اگر یک مقدار صحیح است، مقدار دوم را برگردان.", - "PROCEDURES_IFRETURN_WARNING": "اخطار: این بلوک احتمالاً فقط داخل یک تابع استفاده می‌شود." -} diff --git a/msg/json/fi.json b/msg/json/fi.json deleted file mode 100644 index 81c503f3f5..0000000000 --- a/msg/json/fi.json +++ /dev/null @@ -1,318 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Nike", - "Silvonen", - "Espertus", - "Pettevi", - "McSalama", - "Espeox" - ] - }, - "VARIABLES_DEFAULT_NAME": "kohde", - "TODAY": "Tänään", - "DUPLICATE_BLOCK": "Kopioi", - "ADD_COMMENT": "Lisää kommentti", - "REMOVE_COMMENT": "Poista kommentti", - "EXTERNAL_INPUTS": "Ulkoiset syötteet", - "INLINE_INPUTS": "Tuo syötteet", - "DELETE_BLOCK": "Poista lohko", - "DELETE_X_BLOCKS": "Poista %1 lohkoa", - "COLLAPSE_BLOCK": "Sulje lohko", - "COLLAPSE_ALL": "Sulje lohkot", - "EXPAND_BLOCK": "Laajenna lohko", - "EXPAND_ALL": "Laajenna lohkot", - "DISABLE_BLOCK": "Passivoi lohko", - "ENABLE_BLOCK": "Aktivoi lohko", - "HELP": "Apua", - "CHAT": "Keskustele yhteistyökumppanisi kanssa tässä laatikossa!", - "AUTH": "Valtuuta tämä ohjelma jotta voit tallettaa työsi ja jakaa sen.", - "ME": "Minä", - "CHANGE_VALUE_TITLE": "Muuta arvoa:", - "NEW_VARIABLE": "Uusi muuttuja...", - "NEW_VARIABLE_TITLE": "Uuden muuttujan nimi:", - "RENAME_VARIABLE": "Nimeä uudelleen muuttuja...", - "RENAME_VARIABLE_TITLE": "Nimeä uudelleen kaikki '%1' muuttujaa:", - "COLOUR_PICKER_HELPURL": "https://fi.wikipedia.org/wiki/V%C3%A4ri", - "COLOUR_PICKER_TOOLTIP": "Valitse väri paletista.", - "COLOUR_RANDOM_TITLE": "satunnainen väri", - "COLOUR_RANDOM_TOOLTIP": "Valitse väri sattumanvaraisesti.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "väri, jossa on", - "COLOUR_RGB_RED": "punainen", - "COLOUR_RGB_GREEN": "vihreä", - "COLOUR_RGB_BLUE": "sininen", - "COLOUR_RGB_TOOLTIP": "Luo väri, jossa on tietty määrä punaista, vihreää ja sinistä. Kaikkien arvojen tulee olla välillä 0 - 100.", - "COLOUR_BLEND_TITLE": "sekoitus", - "COLOUR_BLEND_COLOUR1": "väri 1", - "COLOUR_BLEND_COLOUR2": "väri 2", - "COLOUR_BLEND_RATIO": "suhde", - "COLOUR_BLEND_TOOLTIP": "Sekoittaa kaksi väriä keskenään annetussa suhteessa (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "toista %1 kertaa", - "CONTROLS_REPEAT_INPUT_DO": "tee", - "CONTROLS_REPEAT_TOOLTIP": "Suorita joukko lausekkeita useampi kertaa.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "toista niin kauan kuin", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "toista kunnes", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Niin kauan kuin arvo on tosi, suorita joukko lausekkeita.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Niin kauan kuin arvo on epätosi, suorita joukko lausekkeita.", - "CONTROLS_FOR_TOOLTIP": "Aseta muuttujaan \"%1\" arvot alkuarvosta loppuarvoon annetun askeleen välein ja suorita joka askeleella annettu koodilohko.", - "CONTROLS_FOR_TITLE": "laske %1 Väli %2-%3 %4:n välein", - "CONTROLS_FOREACH_TITLE": "kullekin kohteelle %1 listassa %2", - "CONTROLS_FOREACH_TOOLTIP": "Aseta muuttujan %1 arvoksi kukin listan kohde vuorollaan ja suorita joukko lausekkeita.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "poistu silmukasta", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "jatka silmukan seuraavaan toistoon", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Poistu sisemmästä silmukasta.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Ohita loput tästä silmukasta ja siirry seuraavaan toistoon.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Varoitus: Tätä lohkoa voi käyttää vain silmukan sisällä.", - "CONTROLS_IF_TOOLTIP_1": "Jos arvo on tosi, suorita lauseke.", - "CONTROLS_IF_TOOLTIP_2": "Jos arvo on tosi, suorita ensimmäinen lohko lausekkeita. Muuten suorita toinen lohko lausekkeita.", - "CONTROLS_IF_TOOLTIP_3": "Jos ensimmäinen arvo on tosi, suorita ensimmäinen lohko lausekkeita. Muuten, jos toinen arvo on tosi, suorita toinen lohko lausekkeita.", - "CONTROLS_IF_TOOLTIP_4": "Jos ensimmäinen arvo on tosi, suorita ensimmäinen lohko lausekkeita. Muuten, jos toinen arvo on tosi, suorita toinen lohko lausekkeita. Jos mikään arvoista ei ole tosi, suorita viimeinen lohko lausekkeita.", - "CONTROLS_IF_MSG_IF": "jos", - "CONTROLS_IF_MSG_ELSEIF": "muuten jos", - "CONTROLS_IF_MSG_ELSE": "muuten", - "CONTROLS_IF_IF_TOOLTIP": "Lisää, poista tai järjestele osioita tässä \"jos\" lohkossa.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Lisää ehto \"jos\" lohkoon.", - "CONTROLS_IF_ELSE_TOOLTIP": "Lisää lopullinen \"muuten\" lohko \"jos\" lohkoon.", - "LOGIC_COMPARE_HELPURL": "https://fi.wikipedia.org/wiki/Ep%C3%A4yht%C3%A4l%C3%B6", - "LOGIC_COMPARE_TOOLTIP_EQ": "Palauta tosi, jos syötteet ovat keskenään samat.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Palauttaa tosi, jos syötteet eivät ole keskenään samoja.", - "LOGIC_COMPARE_TOOLTIP_LT": "Palauttaa tosi, jos ensimmäinen syöte on pienempi, kuin toinen.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Palauttaa tosi, jos ensimmäinen syöte on pienempi tai yhtä suuri, kuin toinen.", - "LOGIC_COMPARE_TOOLTIP_GT": "Palauttaa tosi, jos ensimmäinen syöte on suurempi, kuin toinen.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Palauttaa tosi, jos ensimmäinen syöte on suurempi tai yhtä suuri, kuin toinen.", - "LOGIC_OPERATION_TOOLTIP_AND": "Palauttaa tosi, jos kummatkin syötteet ovat tosia.", - "LOGIC_OPERATION_AND": "ja", - "LOGIC_OPERATION_TOOLTIP_OR": "Palauttaa tosi, jos ainakin yksi syötteistä on tosi.", - "LOGIC_OPERATION_OR": "tai", - "LOGIC_NEGATE_TITLE": "ei %1", - "LOGIC_NEGATE_TOOLTIP": "Palauttaa tosi, jos syöte on epätosi. Palauttaa epätosi, jos syöte on tosi.", - "LOGIC_BOOLEAN_TRUE": "tosi", - "LOGIC_BOOLEAN_FALSE": "epätosi", - "LOGIC_BOOLEAN_TOOLTIP": "Palauttaa joko tosi tai epätosi.", - "LOGIC_NULL": "ei mitään", - "LOGIC_NULL_TOOLTIP": "Palauttaa \"ei mitään\"-arvon.", - "LOGIC_TERNARY_CONDITION": "ehto", - "LOGIC_TERNARY_IF_TRUE": "jos tosi", - "LOGIC_TERNARY_IF_FALSE": "jos epätosi", - "LOGIC_TERNARY_TOOLTIP": "Tarkistaa testin ehdon. Jos ehto on tosi, palauttaa \"jos tosi\" arvon, muuten palauttaa \"jos epätosi\" arvon.", - "MATH_NUMBER_HELPURL": "https://fi.wikipedia.org/wiki/Luku", - "MATH_NUMBER_TOOLTIP": "Luku.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "⋅", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "http://fi.wikipedia.org/wiki/Aritmetiikka", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Palauttaa kahden luvun summan.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Palauttaa kahden luvun erotuksen.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Palauttaa kertolaskun tulon.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Palauttaa jakolaskun osamäärän.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Palauttaa ensimmäisen luvun korotettuna toisen luvun potenssiin.", - "MATH_SINGLE_HELPURL": "https://fi.wikipedia.org/wiki/Neli%C3%B6juuri", - "MATH_SINGLE_OP_ROOT": "neliöjuuri", - "MATH_SINGLE_TOOLTIP_ROOT": "Palauttaa luvun neliöjuuren.", - "MATH_SINGLE_OP_ABSOLUTE": "itseisarvo", - "MATH_SINGLE_TOOLTIP_ABS": "Palauttaa luvun itseisarvon.", - "MATH_SINGLE_TOOLTIP_NEG": "Palauttaa numeron vastaluvun.", - "MATH_SINGLE_TOOLTIP_LN": "Palauttaa luvun luonnollisen logaritmin.", - "MATH_SINGLE_TOOLTIP_LOG10": "Palauttaa luvun kymmenkantaisen logaritmin.", - "MATH_SINGLE_TOOLTIP_EXP": "Palauttaa e potenssiin luku.", - "MATH_SINGLE_TOOLTIP_POW10": "Palauttaa 10 potenssiin luku.", - "MATH_TRIG_HELPURL": "https://fi.wikipedia.org/wiki/Trigonometrinen_funktio", - "MATH_TRIG_TOOLTIP_SIN": "Palauttaa asteluvun (ei radiaanin) sinin.", - "MATH_TRIG_TOOLTIP_COS": "Palauttaa asteluvun (ei radiaanin) kosinin.", - "MATH_TRIG_TOOLTIP_TAN": "Palauttaa asteluvun (ei radiaanin) tangentin.", - "MATH_TRIG_TOOLTIP_ASIN": "Palauttaa luvun arkussinin.", - "MATH_TRIG_TOOLTIP_ACOS": "Palauttaa luvun arkuskosinin.", - "MATH_TRIG_TOOLTIP_ATAN": "Palauttaa luvun arkustangentin.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Palauttaa jonkin seuraavista vakioista: π (3.141…), e (2.718…), φ (1.618…), neliöjuuri(2) (1.414…), neliöjuuri(½) (0.707…), or ∞ (ääretön).", - "MATH_IS_EVEN": "on parillinen", - "MATH_IS_ODD": "on pariton", - "MATH_IS_PRIME": "on alkuluku", - "MATH_IS_WHOLE": "on kokonaisluku", - "MATH_IS_POSITIVE": "on positiivinen", - "MATH_IS_NEGATIVE": "on negatiivinen", - "MATH_IS_DIVISIBLE_BY": "on jaollinen luvulla", - "MATH_IS_TOOLTIP": "Tarkistaa onko numero parillinen, pariton, alkuluku, kokonaisluku, positiivinen, negatiivinen, tai jos se on jaollinen toisella luvulla. Palauttaa tosi tai epätosi.", - "MATH_CHANGE_HELPURL": "https://fi.wikipedia.org/wiki/Yhteenlasku", - "MATH_CHANGE_TITLE": "muuta %1 arvolla %2", - "MATH_CHANGE_TOOLTIP": "Lisää arvo muuttujaan '%1'.", - "MATH_ROUND_HELPURL": "https://fi.wikipedia.org/wiki/Py%C3%B6rist%C3%A4minen", - "MATH_ROUND_TOOLTIP": "Pyöristää luvun ylös- tai alaspäin.", - "MATH_ROUND_OPERATOR_ROUND": "pyöristä", - "MATH_ROUND_OPERATOR_ROUNDUP": "pyöristä ylöspäin", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "pyöristä alaspäin", - "MATH_ONLIST_OPERATOR_SUM": "summa luvuista", - "MATH_ONLIST_TOOLTIP_SUM": "Palauttaa kaikkien annettujen lukujen summan.", - "MATH_ONLIST_OPERATOR_MIN": "pienin luvuista", - "MATH_ONLIST_TOOLTIP_MIN": "Palauttaa pienimmän annetuista luvuista.", - "MATH_ONLIST_OPERATOR_MAX": "suurin luvuista", - "MATH_ONLIST_TOOLTIP_MAX": "Palauttaa suurimman annetuista luvuista.", - "MATH_ONLIST_OPERATOR_AVERAGE": "keskiarvo luvuista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Palauttaa aritmeettisen keskiarvon annetuista luvuista.", - "MATH_ONLIST_OPERATOR_MEDIAN": "keskiluku luvuista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Palauttaa annettujen lukujen keskiluvun.", - "MATH_ONLIST_OPERATOR_MODE": "tyyppiarvo luvuista", - "MATH_ONLIST_TOOLTIP_MODE": "Palauttaa luettelon yleisimmistä luvuista annetussa listassa.", - "MATH_ONLIST_OPERATOR_STD_DEV": "keskihajonta luvuista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Palauttaa annettujen lukujen keskihajonnan.", - "MATH_ONLIST_OPERATOR_RANDOM": "satunnainen valinta luvuista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Palauttaa satunnaisesti valitun luvun annetuista luvuista.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "%1 ÷ %2 jakojäännös", - "MATH_MODULO_TOOLTIP": "Palauttaa jakolaskun jakojäännöksen.", - "MATH_CONSTRAIN_TITLE": "rajoita %1 vähintään %2 enintään %3", - "MATH_CONSTRAIN_TOOLTIP": "Rajoittaa arvon annetulle suljetulle välille.", - "MATH_RANDOM_INT_HELPURL": "https://fi.wikipedia.org/wiki/Satunnaisluku", - "MATH_RANDOM_INT_TITLE": "Palauttaa satunnaisen kokonaisluvun väliltä %1-%2", - "MATH_RANDOM_INT_TOOLTIP": "Palauttaa satunnaisen kokonaisluvun kahden annetun arvon suljetulta väliltä.", - "MATH_RANDOM_FLOAT_HELPURL": "https://fi.wikipedia.org/wiki/Satunnaisluku", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "satunnainen murtoluku", - "MATH_RANDOM_FLOAT_TOOLTIP": "Palauttaa satunnaisen luvun oikealta puoliavoimesta välistä [0.0, 1.0).", - "TEXT_TEXT_HELPURL": "https://fi.wikipedia.org/wiki/Merkkijono", - "TEXT_TEXT_TOOLTIP": "Kirjain, sana tai rivi tekstiä.", - "TEXT_JOIN_TITLE_CREATEWITH": "luo teksti", - "TEXT_JOIN_TOOLTIP": "Luo merkkijonon liittämällä yhteen minkä tahansa määrän kohteita.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "liitä", - "TEXT_CREATE_JOIN_TOOLTIP": "Lisää, poista tai uudelleen järjestä osioita tässä lohkossa.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Lisää kohteen tekstiin.", - "TEXT_APPEND_TO": "muuttujaan", - "TEXT_APPEND_APPENDTEXT": "lisää teksti", - "TEXT_APPEND_TOOLTIP": "Lisää tekstiä muuttujaan '%1'.", - "TEXT_LENGTH_TITLE": "%1:n pituus", - "TEXT_LENGTH_TOOLTIP": "Palauttaa annetussa tekstissä olevien merkkien määrän (välilyönnit mukaan lukien).", - "TEXT_ISEMPTY_TITLE": "%1 on tyhjä", - "TEXT_ISEMPTY_TOOLTIP": "Palauttaa tosi, jos annettu teksti on tyhjä.", - "TEXT_INDEXOF_TOOLTIP": "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen 0 jos tekstiä ei löytynyt.", - "TEXT_INDEXOF_INPUT_INTEXT": "tekstistä", - "TEXT_INDEXOF_OPERATOR_FIRST": "etsi ensimmäinen esiintymä merkkijonolle", - "TEXT_INDEXOF_OPERATOR_LAST": "etsi viimeinen esiintymä merkkijonolle", - "TEXT_CHARAT_INPUT_INTEXT": "tekstistä", - "TEXT_CHARAT_FROM_START": "Hae kirjain nro", - "TEXT_CHARAT_FROM_END": "Hae kirjain nro (lopusta laskien)", - "TEXT_CHARAT_FIRST": "hae ensimmäinen kirjain", - "TEXT_CHARAT_LAST": "hae viimeinen kirjain", - "TEXT_CHARAT_RANDOM": "hae satunnainen kirjain", - "TEXT_CHARAT_TOOLTIP": "Palauttaa annetussa kohdassa olevan kirjaimen.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Palauttaa määrätyn osan tekstistä.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "merkkijonosta", - "TEXT_GET_SUBSTRING_START_FROM_START": "hae osa alkaen kirjaimesta nro", - "TEXT_GET_SUBSTRING_START_FROM_END": "hae osa alkaen kirjaimesta nro (lopusta laskien)", - "TEXT_GET_SUBSTRING_START_FIRST": "hae osa alkaen ensimmäisestä kirjaimesta", - "TEXT_GET_SUBSTRING_END_FROM_START": "kirjaimeen nro", - "TEXT_GET_SUBSTRING_END_FROM_END": "kirjaimeen nro (lopusta laskien)", - "TEXT_GET_SUBSTRING_END_LAST": "viimeiseen kirjaimeen", - "TEXT_CHANGECASE_TOOLTIP": "Palauttaa kopion tekstistä eri kirjainkoossa.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "isot kirjaimet", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "pienet kirjaimet", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "isot alkukirjaimet", - "TEXT_TRIM_TOOLTIP": "Palauttaa kopion tekstistä siten, että välilyönnit on poistettu yhdestä tai molemmista päistä.", - "TEXT_TRIM_OPERATOR_BOTH": "poistaa välilyönnit kummaltakin puolelta", - "TEXT_TRIM_OPERATOR_LEFT": "poistaa välilyönnit vasemmalta puolelta", - "TEXT_TRIM_OPERATOR_RIGHT": "poistaa välilyönnit oikealta puolelta", - "TEXT_PRINT_TITLE": "tulosta %1", - "TEXT_PRINT_TOOLTIP": "Tulostaa annetun tekstin, numeron tia muun arvon.", - "TEXT_PROMPT_TYPE_TEXT": "käyttäen annettua viestiä, kehottaa syöttämään tekstiä", - "TEXT_PROMPT_TYPE_NUMBER": "käyttäen annettua viestiä, kehottaa syöttämään numeron", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Kehottaa käyttäjää syöttämään numeron.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Kehottaa käyttäjää syöttämään tekstiä.", - "LISTS_CREATE_EMPTY_TITLE": "Luo tyhjä lista", - "LISTS_CREATE_EMPTY_TOOLTIP": "Palauta tyhjä lista, pituus 0", - "LISTS_CREATE_WITH_TOOLTIP": "Luo lista, jossa on mikä tahansa määrä kohteita.", - "LISTS_CREATE_WITH_INPUT_WITH": "luo lista", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Listää, poista tai järjestele uudestaan osioita tässä lohkossa.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Lisää kohde listaan.", - "LISTS_REPEAT_TOOLTIP": "Luo listan, jossa annettu arvo toistuu määrätyn monta kertaa.", - "LISTS_REPEAT_TITLE": "luo lista, jossa kohde %1 toistuu %2 kertaa", - "LISTS_LENGTH_TITLE": "%1:n pituus", - "LISTS_LENGTH_TOOLTIP": "Palauttaa listan pituuden.", - "LISTS_ISEMPTY_TITLE": "%1 on tyhjä", - "LISTS_ISEMPTY_TOOLTIP": "Palauttaa tosi, jos lista on tyhjä.", - "LISTS_INLIST": "listassa", - "LISTS_INDEX_OF_FIRST": "etsi ensimmäinen esiintymä kohteelle", - "LISTS_INDEX_OF_LAST": "etsi viimeinen esiintymä kohteelle", - "LISTS_INDEX_OF_TOOLTIP": "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan. Palauttaa 0 jos tekstiä ei löydy.", - "LISTS_GET_INDEX_GET": "hae", - "LISTS_GET_INDEX_GET_REMOVE": "hae ja poista", - "LISTS_GET_INDEX_REMOVE": "poista", - "LISTS_GET_INDEX_FROM_START": "nro", - "LISTS_GET_INDEX_FROM_END": "nro (lopusta laskien)", - "LISTS_GET_INDEX_FIRST": "ensimmäinen", - "LISTS_GET_INDEX_LAST": "viimeinen", - "LISTS_GET_INDEX_RANDOM": "satunnainen", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Palauta kohde annetusta kohdasta listaa. Numero 1 tarkoittaa listan ensimmäistä kohdetta.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Palauta kohde annetusta kohdasta listaa. Numero 1 tarkoittaa listan viimeistä kohdetta.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Palauta ensimmäinen kohde listalta.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Palauttaa listan viimeisen kohteen.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Palauttaa satunnaisen kohteen listalta.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Poistaa ja palauttaa kohteen annetusta kohden listaa. Nro 1 on ensimmäinen kohde.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Poistaa ja palauttaa kohteen annetusta kohden listaa. Nro 1 on ensimmäinen kohde.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Poistaa ja palauttaa ensimmäisen kohteen listalta.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Poistaa ja palauttaa viimeisen kohteen listalta.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Poistaa ja palauttaa satunnaisen kohteen listalta.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Poistaa kohteen listalta annetusta kohtaa. Nro 1 on ensimmäinen kohde.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Poistaa kohteen listalta annetusta kohtaa. Nro 1 on viimeinen kohde.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Poistaa ensimmäisen kohteen listalta.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Poistaa viimeisen kohteen listalta.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Poistaa satunnaisen kohteen listalta.", - "LISTS_SET_INDEX_SET": "aseta", - "LISTS_SET_INDEX_INSERT": "lisää kohtaan", - "LISTS_SET_INDEX_INPUT_TO": "kohteeksi", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Asettaa kohteen määrättyyn kohtaa listassa. Nro 1 on listan alku.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Asettaa listan määrätyssä kohtaa olevan kohteen. Nro 1 on listan loppu.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Asettaa listan ensimmäisen kohteen.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Asettaa listan viimeisen kohteen.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Asettaa satunnaisen kohteen listassa.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Lisää kohteen listan annettuun kohtaan. Nro 1 on listan kärki.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Lisää kohteen annettuun kohtaan listaa. Nro 1 on listan häntä.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Lisää kohteen listan kärkeen.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Lisää kohteen listan loppuun.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Lisää kohteen satunnaiseen kohtaan listassa.", - "LISTS_GET_SUBLIST_START_FROM_START": "hae osalista alkaen kohdasta", - "LISTS_GET_SUBLIST_START_FROM_END": "hae osalista alkaen kohdasta (lopusta laskien)", - "LISTS_GET_SUBLIST_START_FIRST": "hae osalista alkaen alusta", - "LISTS_GET_SUBLIST_END_FROM_START": "päättyen kohtaan", - "LISTS_GET_SUBLIST_END_FROM_END": "päättyen kohtaan (lopusta laskien)", - "LISTS_GET_SUBLIST_END_LAST": "viimeinen", - "LISTS_GET_SUBLIST_TOOLTIP": "Luo kopio määrätystä kohden listaa.", - "LISTS_SPLIT_LIST_FROM_TEXT": "tee listasta tekstiä", - "LISTS_SPLIT_TEXT_FROM_LIST": "tee tekstistä lista", - "LISTS_SPLIT_WITH_DELIMITER": "erottimen kanssa", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Jaa teksti osiin erotinmerkin perusteella ja järjestä osat listaksi.", - "VARIABLES_GET_TOOLTIP": "Palauttaa muuttujan arvon.", - "VARIABLES_GET_CREATE_SET": "Luo 'aseta %1'", - "VARIABLES_SET": "aseta %1 arvoksi %2", - "VARIABLES_SET_TOOLTIP": "Asettaa muutujan arvoksi annetun syötteen.", - "VARIABLES_SET_CREATE_GET": "Luo 'hae %1'", - "PROCEDURES_DEFNORETURN_TITLE": "tehdäksesi", - "PROCEDURES_DEFNORETURN_PROCEDURE": "tee jotain", - "PROCEDURES_BEFORE_PARAMS": "parametrit:", - "PROCEDURES_CALL_BEFORE_PARAMS": "parametrit:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Luo funktio, jolla ei ole tuotosta.", - "PROCEDURES_DEFRETURN_RETURN": "palauta", - "PROCEDURES_DEFRETURN_TOOLTIP": "Luo funktio, jolla ei ole tuotosta.", - "PROCEDURES_ALLOW_STATEMENTS": "salli kommentit", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Varoitus: tällä funktiolla on sama parametri useamman kerran.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://fi.wikipedia.org/wiki/Aliohjelma", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Suorittaa käyttäjän määrittelemä funktio '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://fi.wikipedia.org/wiki/Aliohjelma", - "PROCEDURES_CALLRETURN_TOOLTIP": "Suorittaa käyttäjän määrittelemän funktion '%1' ja käyttää sen tuotosta.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "syötteet", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Lisää, poista tai järjestele uudelleen tämän toiminnon tulot.", - "PROCEDURES_MUTATORARG_TITLE": "syötteen nimi:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Lisää sisääntulon funktioon.", - "PROCEDURES_HIGHLIGHT_DEF": "Korosta funktion määritelmä", - "PROCEDURES_CREATE_DO": "Luo '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Jos arvo on tosi, palauta toinen arvo.", - "PROCEDURES_IFRETURN_WARNING": "Varoitus: tätä lohkoa voi käyttää vain funktion määrityksessä." -} diff --git a/msg/json/fr.json b/msg/json/fr.json deleted file mode 100644 index eb0e3ec6de..0000000000 --- a/msg/json/fr.json +++ /dev/null @@ -1,312 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Espertus", - "Gomoko", - "ProfGra", - "Wladek92" - ] - }, - "VARIABLES_DEFAULT_NAME": "élément", - "TODAY": "Aujourd'hui", - "DUPLICATE_BLOCK": "Dupliquer", - "ADD_COMMENT": "Ajouter un commentaire", - "REMOVE_COMMENT": "Supprimer un commentaire", - "EXTERNAL_INPUTS": "Entrées externes", - "INLINE_INPUTS": "Entrées en ligne", - "DELETE_BLOCK": "Supprimer le bloc", - "DELETE_X_BLOCKS": "Supprimer %1 blocs", - "DELETE_ALL_BLOCKS": "Supprimer tous les %1 blocs ?", - "CLEAN_UP": "Nettoyer les blocs", - "COLLAPSE_BLOCK": "Réduire le bloc", - "COLLAPSE_ALL": "Réduire les blocs", - "EXPAND_BLOCK": "Développer le bloc", - "EXPAND_ALL": "Développer les blocs", - "DISABLE_BLOCK": "Désactiver le bloc", - "ENABLE_BLOCK": "Activer le bloc", - "HELP": "Aide", - "CHAT": "Discuter avec votre collaborateur en tapant dans cette zone !", - "AUTH": "Veuillez autoriser cette application à permettre la sauvegarde de votre travail et à l’autoriser à la partager.", - "ME": "Moi", - "CHANGE_VALUE_TITLE": "Modifier la valeur :", - "NEW_VARIABLE": "Nouvelle variable…", - "NEW_VARIABLE_TITLE": "Nom de la nouvelle variable :", - "RENAME_VARIABLE": "Renommer la variable…", - "RENAME_VARIABLE_TITLE": "Renommer toutes les variables '%1' en :", - "COLOUR_PICKER_HELPURL": "https://fr.wikipedia.org/wiki/Couleur", - "COLOUR_PICKER_TOOLTIP": "Choisir une couleur dans la palette", - "COLOUR_RANDOM_TITLE": "couleur aléatoire", - "COLOUR_RANDOM_TOOLTIP": "Choisir une couleur au hasard.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "colorer avec", - "COLOUR_RGB_RED": "rouge", - "COLOUR_RGB_GREEN": "vert", - "COLOUR_RGB_BLUE": "bleu", - "COLOUR_RGB_TOOLTIP": "Créer une couleur avec la quantité de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "mélanger", - "COLOUR_BLEND_COLOUR1": "couleur 1", - "COLOUR_BLEND_COLOUR2": "couleur 2", - "COLOUR_BLEND_RATIO": "ratio", - "COLOUR_BLEND_TOOLTIP": "Mélange deux couleurs avec un ratio donné (de 0.0 à 1.0).", - "CONTROLS_REPEAT_HELPURL": "http://fr.wikipedia.org/wiki/Boucle_for", - "CONTROLS_REPEAT_TITLE": "répéter %1 fois", - "CONTROLS_REPEAT_INPUT_DO": "faire", - "CONTROLS_REPEAT_TOOLTIP": "Exécuter certains ordres plusieurs fois.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "répéter tant que", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "répéter jusqu’à", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Tant qu’une valeur est vraie, alors exécuter certains ordres.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Tant qu’une valeur est fausse, alors exécuter certains ordres.", - "CONTROLS_FOR_TOOLTIP": "Faire en sorte que la variable « %1 » prenne les valeurs depuis le numéro de début jusqu’au numéro de fin, en s’incrémentant de l’intervalle spécifié, et exécuter les ordres spécifiés.", - "CONTROLS_FOR_TITLE": "compter avec %1 de %2 à %3 par %4", - "CONTROLS_FOREACH_TITLE": "pour chaque élément %1 dans la liste %2", - "CONTROLS_FOREACH_TOOLTIP": "Pour chaque élément dans une liste, donner la valeur de l’élément à la variable '%1', puis exécuter certains ordres.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "sortir de la boucle", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continuer avec la prochaine itération de la boucle", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Sortir de la boucle englobante.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sauter le reste de cette boucle, et poursuivre avec l’itération suivante.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Attention : Ce bloc ne devrait être utilisé que dans une boucle.", - "CONTROLS_IF_TOOLTIP_1": "Si une valeur est vraie, alors exécuter certains ordres.", - "CONTROLS_IF_TOOLTIP_2": "Si une valeur est vraie, alors exécuter le premier bloc d’ordres. Sinon, exécuter le second bloc d’ordres.", - "CONTROLS_IF_TOOLTIP_3": "Si la première valeur est vraie, alors exécuter le premier bloc d’ordres. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’ordres.", - "CONTROLS_IF_TOOLTIP_4": "Si la première valeur est vraie, alors exécuter le premier bloc d’ordres. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’ordres. Si aucune des valeurs n’est vraie, exécuter le dernier bloc d’ordres.", - "CONTROLS_IF_MSG_IF": "si", - "CONTROLS_IF_MSG_ELSEIF": "sinon si", - "CONTROLS_IF_MSG_ELSE": "sinon", - "CONTROLS_IF_IF_TOOLTIP": "Ajouter, supprimer ou réordonner les sections pour reconfigurer ce bloc si.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Ajouter une condition au bloc si.", - "CONTROLS_IF_ELSE_TOOLTIP": "Ajouter une condition finale fourre-tout au bloc si.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Renvoyer vrai si les deux entrées sont égales.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Renvoyer vrai si les deux entrées ne sont pas égales.", - "LOGIC_COMPARE_TOOLTIP_LT": "Renvoyer vrai si la première entrée est plus petite que la seconde.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Renvoyer vrai si la première entrée est plus petite ou égale à la seconde.", - "LOGIC_COMPARE_TOOLTIP_GT": "Renvoyer vrai si la première entrée est plus grande que la seconde.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Renvoyer vrai si la première entrée est plus grande ou égale à la seconde.", - "LOGIC_OPERATION_TOOLTIP_AND": "Renvoyer vrai si les deux entrées sont vraies.", - "LOGIC_OPERATION_AND": "et", - "LOGIC_OPERATION_TOOLTIP_OR": "Renvoyer vrai si au moins une des entrées est vraie.", - "LOGIC_OPERATION_OR": "ou", - "LOGIC_NEGATE_TITLE": "pas %1", - "LOGIC_NEGATE_TOOLTIP": "Renvoie vrai si l’entrée est fausse. Renvoie faux si l’entrée est vraie.", - "LOGIC_BOOLEAN_TRUE": "vrai", - "LOGIC_BOOLEAN_FALSE": "faux", - "LOGIC_BOOLEAN_TOOLTIP": "Renvoie soit vrai soit faux.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "nul", - "LOGIC_NULL_TOOLTIP": "Renvoie nul.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "si vrai", - "LOGIC_TERNARY_IF_FALSE": "si faux", - "LOGIC_TERNARY_TOOLTIP": "Vérifier la condition dans 'test'. Si elle est vraie, renvoie la valeur 'si vrai' ; sinon renvoie la valeur 'si faux'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Un nombre.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Renvoie la somme des deux nombres.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Renvoie la différence des deux nombres.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Renvoie le produit des deux nombres.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Renvoie le quotient des deux nombres.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Renvoie le premier nombre élevé à la puissance du second.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "racine carrée", - "MATH_SINGLE_TOOLTIP_ROOT": "Renvoie la racine carrée d’un nombre.", - "MATH_SINGLE_OP_ABSOLUTE": "absolu", - "MATH_SINGLE_TOOLTIP_ABS": "Renvoie la valeur absolue d’un nombre.", - "MATH_SINGLE_TOOLTIP_NEG": "Renvoie l’opposé d’un nombre", - "MATH_SINGLE_TOOLTIP_LN": "Renvoie le logarithme naturel d’un nombre.", - "MATH_SINGLE_TOOLTIP_LOG10": "Renvoie le logarithme base 10 d’un nombre.", - "MATH_SINGLE_TOOLTIP_EXP": "Renvoie e à la puissance d’un nombre.", - "MATH_SINGLE_TOOLTIP_POW10": "Renvoie 10 à la puissance d’un nombre.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Renvoie le sinus d’un angle en degrés (pas en radians).", - "MATH_TRIG_TOOLTIP_COS": "Renvoie le cosinus d’un angle en degrés (pas en radians).", - "MATH_TRIG_TOOLTIP_TAN": "Renvoie la tangente d’un angle en degrés (pas en radians).", - "MATH_TRIG_TOOLTIP_ASIN": "Renvoie l’arcsinus d’un nombre.", - "MATH_TRIG_TOOLTIP_ACOS": "Renvoie l’arccosinus d’un nombre.", - "MATH_TRIG_TOOLTIP_ATAN": "Renvoie l’arctangente d’un nombre.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Renvoie une des constantes courantes : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infini).", - "MATH_IS_EVEN": "est pair", - "MATH_IS_ODD": "est impair", - "MATH_IS_PRIME": "est premier", - "MATH_IS_WHOLE": "est entier", - "MATH_IS_POSITIVE": "est positif", - "MATH_IS_NEGATIVE": "est négatif", - "MATH_IS_DIVISIBLE_BY": "est divisible par", - "MATH_IS_TOOLTIP": "Vérifier si un nombre est pair, impair, premier, entier, positif, négatif, ou s’il est divisible par un certain nombre. Renvoie vrai ou faux.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "incrémenter %1 de %2", - "MATH_CHANGE_TOOLTIP": "Ajouter un nombre à la variable '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Arrondir un nombre au-dessus ou au-dessous.", - "MATH_ROUND_OPERATOR_ROUND": "arrondir", - "MATH_ROUND_OPERATOR_ROUNDUP": "arrondir au supérieur", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "arrondir à l’inférieur", - "MATH_ONLIST_OPERATOR_SUM": "somme de la liste", - "MATH_ONLIST_TOOLTIP_SUM": "Renvoyer la somme de tous les nombres dans la liste.", - "MATH_ONLIST_OPERATOR_MIN": "minimum de la liste", - "MATH_ONLIST_TOOLTIP_MIN": "Renvoyer le plus petit nombre dans la liste.", - "MATH_ONLIST_OPERATOR_MAX": "maximum de la liste", - "MATH_ONLIST_TOOLTIP_MAX": "Renvoyer le plus grand nombre dans la liste.", - "MATH_ONLIST_OPERATOR_AVERAGE": "moyenne de la liste", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Renvoyer la moyenne (arithmétique) des valeurs numériques dans la liste.", - "MATH_ONLIST_OPERATOR_MEDIAN": "médiane de la liste", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Renvoyer le nombre médian dans la liste.", - "MATH_ONLIST_OPERATOR_MODE": "majoritaires de la liste", - "MATH_ONLIST_TOOLTIP_MODE": "Renvoyer une liste des élément(s) le(s) plus courant(s) dans la liste.", - "MATH_ONLIST_OPERATOR_STD_DEV": "écart-type de la liste", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Renvoyer l’écart-type de la liste.", - "MATH_ONLIST_OPERATOR_RANDOM": "élément aléatoire de la liste", - "MATH_ONLIST_TOOLTIP_RANDOM": "Renvoyer un élément dans la liste au hasard.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "reste de %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Renvoyer le reste de la division des deux nombres.", - "MATH_CONSTRAIN_TITLE": "contraindre %1 entre %2 et %3", - "MATH_CONSTRAIN_TOOLTIP": "Contraindre un nombre à être entre les limites spécifiées (incluses).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "entier aléatoire entre %1 et %2", - "MATH_RANDOM_INT_TOOLTIP": "Renvoyer un entier aléatoire entre les deux limites spécifiées, incluses.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fraction aléatoire", - "MATH_RANDOM_FLOAT_TOOLTIP": "Renvoyer une fraction aléatoire entre 0.0 (inclus) et 1.0 (exclus).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Une lettre, un mot ou une ligne de texte.", - "TEXT_JOIN_TITLE_CREATEWITH": "créer le texte avec", - "TEXT_JOIN_TOOLTIP": "Créer un morceau de texte en agrégeant un nombre quelconque d’éléments.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "joindre", - "TEXT_CREATE_JOIN_TOOLTIP": "Ajouter, supprimer, ou réordonner des sections pour reconfigurer ce bloc de texte.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Ajouter un élément au texte.", - "TEXT_APPEND_TO": "à", - "TEXT_APPEND_APPENDTEXT": "ajouter le texte", - "TEXT_APPEND_TOOLTIP": "Ajouter du texte à la variable '%1'.", - "TEXT_LENGTH_TITLE": "longueur de %1", - "TEXT_LENGTH_TOOLTIP": "Renvoie le nombre de lettres (espaces compris) dans le texte fourni.", - "TEXT_ISEMPTY_TITLE": "%1 est vide", - "TEXT_ISEMPTY_TOOLTIP": "Renvoie vrai si le texte fourni est vide.", - "TEXT_INDEXOF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie 0 si la chaîne n’est pas trouvée.", - "TEXT_INDEXOF_INPUT_INTEXT": "dans le texte", - "TEXT_INDEXOF_OPERATOR_FIRST": "trouver la première occurrence de la chaîne", - "TEXT_INDEXOF_OPERATOR_LAST": "trouver la dernière occurrence de la chaîne", - "TEXT_CHARAT_INPUT_INTEXT": "dans le texte", - "TEXT_CHARAT_FROM_START": "obtenir la lettre #", - "TEXT_CHARAT_FROM_END": "obtenir la lettre # depuis la fin", - "TEXT_CHARAT_FIRST": "obtenir la première lettre", - "TEXT_CHARAT_LAST": "obtenir la dernière lettre", - "TEXT_CHARAT_RANDOM": "obtenir une lettre au hasard", - "TEXT_CHARAT_TOOLTIP": "Renvoie la lettre à la position indiquée.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Renvoie une partie indiquée du texte.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "dans le texte", - "TEXT_GET_SUBSTRING_START_FROM_START": "obtenir la sous-chaîne depuis la lettre #", - "TEXT_GET_SUBSTRING_START_FROM_END": "obtenir la sous-chaîne depuis la lettre # depuis la fin", - "TEXT_GET_SUBSTRING_START_FIRST": "obtenir la sous-chaîne depuis la première lettre", - "TEXT_GET_SUBSTRING_END_FROM_START": "jusqu’à la lettre #", - "TEXT_GET_SUBSTRING_END_FROM_END": "jusqu’à la lettre # depuis la fin", - "TEXT_GET_SUBSTRING_END_LAST": "jusqu’à la dernière lettre", - "TEXT_CHANGECASE_TOOLTIP": "Renvoyer une copie du texte dans une autre casse.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "en MAJUSCULES", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "en minuscules", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "en Majuscule Au Début De Chaque Mot", - "TEXT_TRIM_TOOLTIP": "Renvoyer une copie du texte avec les espaces supprimés d’un bout ou des deux.", - "TEXT_TRIM_OPERATOR_BOTH": "supprimer les espaces des deux côtés", - "TEXT_TRIM_OPERATOR_LEFT": "supprimer les espaces du côté gauche", - "TEXT_TRIM_OPERATOR_RIGHT": "supprimer les espaces du côté droit", - "TEXT_PRINT_TITLE": "afficher %1", - "TEXT_PRINT_TOOLTIP": "Afficher le texte, le nombre ou une autre valeur spécifié.", - "TEXT_PROMPT_TYPE_TEXT": "invite pour un texte avec un message", - "TEXT_PROMPT_TYPE_NUMBER": "invite pour un nombre avec un message", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Demander un nombre à l’utilisateur.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Demander un texte à l’utilisateur.", - "LISTS_CREATE_EMPTY_TITLE": "créer une liste vide", - "LISTS_CREATE_EMPTY_TOOLTIP": "Renvoyer une liste, de longueur 0, ne contenant aucun enregistrement", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Créer une liste avec un nombre quelconque d’éléments.", - "LISTS_CREATE_WITH_INPUT_WITH": "créer une liste avec", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "liste", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Ajouter, supprimer, ou réordonner les sections pour reconfigurer ce bloc de liste.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ajouter un élément à la liste.", - "LISTS_REPEAT_TOOLTIP": "Crée une liste consistant en la valeur fournie répétée le nombre de fois indiqué.", - "LISTS_REPEAT_TITLE": "créer une liste avec l’élément %1 répété %2 fois", - "LISTS_LENGTH_TITLE": "longueur de %1", - "LISTS_LENGTH_TOOLTIP": "Renvoie la longueur d’une liste.", - "LISTS_ISEMPTY_TITLE": "%1 est vide", - "LISTS_ISEMPTY_TOOLTIP": "Renvoie vrai si la liste est vide.", - "LISTS_INLIST": "dans la liste", - "LISTS_INDEX_OF_FIRST": "trouver la première occurrence de l’élément", - "LISTS_INDEX_OF_LAST": "trouver la dernière occurrence de l’élément", - "LISTS_INDEX_OF_TOOLTIP": "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie 0 si l'élément n'est pas trouvé.", - "LISTS_GET_INDEX_GET": "obtenir", - "LISTS_GET_INDEX_GET_REMOVE": "obtenir et supprimer", - "LISTS_GET_INDEX_REMOVE": "supprimer", - "LISTS_GET_INDEX_FROM_END": "# depuis la fin", - "LISTS_GET_INDEX_FIRST": "premier", - "LISTS_GET_INDEX_LAST": "dernier", - "LISTS_GET_INDEX_RANDOM": "aléatoire", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Renvoie l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Renvoie l’élément à la position indiquée dans une liste. #1 est le dernier élément.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Renvoie le premier élément dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Renvoie le dernier élément dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Renvoie un élément au hasard dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Supprime et renvoie l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Supprime et renvoie l’élément à la position indiquée dans une liste. #1 est le dernier élément.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Supprime et renvoie le premier élément dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Supprime et renvoie le dernier élément dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Supprime et renvoie un élément au hasard dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Supprime l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Supprime l’élément à la position indiquée dans une liste. #1 est le dernier élément.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Supprime le premier élément dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Supprime le dernier élément dans une liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Supprime un élément au hasard dans une liste.", - "LISTS_SET_INDEX_SET": "mettre", - "LISTS_SET_INDEX_INSERT": "insérer en", - "LISTS_SET_INDEX_INPUT_TO": "comme", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Fixe l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Fixe l’élément à la position indiquée dans une liste. #1 est le dernier élément.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Fixe le premier élément dans une liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Fixe le dernier élément dans une liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Fixe un élément au hasard dans une liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insère l’élément à la position indiquée dans une liste. #1 est le premier élément.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insère l’élément à la position indiquée dans une liste. #1 est le dernier élément.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insère l’élément au début d’une liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Ajouter l’élément à la fin d’une liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insère l’élément au hasard dans une liste.", - "LISTS_GET_SUBLIST_START_FROM_START": "obtenir la sous-liste depuis #", - "LISTS_GET_SUBLIST_START_FROM_END": "obtenir la sous-liste depuis # depuis la fin", - "LISTS_GET_SUBLIST_START_FIRST": "obtenir la sous-liste depuis le début", - "LISTS_GET_SUBLIST_END_FROM_START": "jusqu’à #", - "LISTS_GET_SUBLIST_END_FROM_END": "jusqu’à # depuis la fin", - "LISTS_GET_SUBLIST_END_LAST": "jusqu’à la fin", - "LISTS_GET_SUBLIST_TOOLTIP": "Crée une copie de la partie spécifiée d’une liste.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "créer une liste depuis le texte", - "LISTS_SPLIT_TEXT_FROM_LIST": "créer un texte depuis la liste", - "LISTS_SPLIT_WITH_DELIMITER": "avec le séparateur", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Couper un texte en une liste de textes, en coupant à chaque séparateur.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Réunir une liste de textes en un seul, en les séparant par un séparateur.", - "VARIABLES_GET_TOOLTIP": "Renvoie la valeur de cette variable.", - "VARIABLES_GET_CREATE_SET": "Créer 'fixer %1'", - "VARIABLES_SET": "fixer %1 à %2", - "VARIABLES_SET_TOOLTIP": "Fixe cette variable pour qu’elle soit égale à la valeur de l’entrée.", - "VARIABLES_SET_CREATE_GET": "Créer 'obtenir %1'", - "PROCEDURES_DEFNORETURN_TITLE": "à", - "PROCEDURES_DEFNORETURN_PROCEDURE": "faire quelque chose", - "PROCEDURES_BEFORE_PARAMS": "avec :", - "PROCEDURES_CALL_BEFORE_PARAMS": "avec :", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Crée une fonction sans sortie.", - "PROCEDURES_DEFRETURN_RETURN": "retour", - "PROCEDURES_DEFRETURN_TOOLTIP": "Crée une fonction avec une sortie.", - "PROCEDURES_ALLOW_STATEMENTS": "autoriser les ordres", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Attention : Cette fonction a des paramètres en double.", - "PROCEDURES_CALLNORETURN_HELPURL": "http://fr.wikipedia.org/wiki/Proc%C3%A9dure_%28informatique%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Exécuter la fonction '%1' définie par l’utilisateur.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Exécuter la fonction '%1' définie par l’utilisateur et utiliser son résultat.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "entrées", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Ajouter, supprimer, ou réarranger les entrées de cette fonction.", - "PROCEDURES_MUTATORARG_TITLE": "nom de l’entrée :", - "PROCEDURES_MUTATORARG_TOOLTIP": "Ajouter une entrée à la fonction.", - "PROCEDURES_HIGHLIGHT_DEF": "Surligner la définition de la fonction", - "PROCEDURES_CREATE_DO": "Créer '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Si une valeur est vraie, alors renvoyer une seconde valeur.", - "PROCEDURES_IFRETURN_WARNING": "Attention : Ce bloc pourrait n’être utilisé que dans une définition de fonction." -} diff --git a/msg/json/he.json b/msg/json/he.json deleted file mode 100644 index 8dd1bbd897..0000000000 --- a/msg/json/he.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Dorongol", - "YaronSh", - "Amire80", - "Inkbug", - "Yona b", - "Noamrotem", - "Dvb", - "LaG roiL", - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "פריט", - "TODAY": "היום", - "DUPLICATE_BLOCK": "שכפל", - "ADD_COMMENT": "הוסף תגובה", - "REMOVE_COMMENT": "הסר הערה", - "EXTERNAL_INPUTS": "קלטים חיצוניים", - "INLINE_INPUTS": "קלטים פנימיים", - "DELETE_BLOCK": "מחק קטע קוד", - "DELETE_X_BLOCKS": "מחק %1 קטעי קוד", - "DELETE_ALL_BLOCKS": "האם למחוק את כל %1 קטעי הקוד?", - "COLLAPSE_BLOCK": "צמצם קטע קוד", - "COLLAPSE_ALL": "צמצם קטעי קוד", - "EXPAND_BLOCK": "הרחב קטע קוד", - "EXPAND_ALL": "הרחב קטעי קוד", - "DISABLE_BLOCK": "נטרל קטע קוד", - "ENABLE_BLOCK": "הפעל קטע קוד", - "HELP": "עזרה", - "CHAT": "שוחח עם משתף פעולה שלך על-ידי הקלדה בתיבה זו!", - "AUTH": "בבקשה נא לאשר את היישום הזה כדי לאפשר לעבודה שלך להישמר וכדי לאפשר את השיתוף על ידיך.", - "ME": "אותי", - "CHANGE_VALUE_TITLE": "שנה ערך:", - "NEW_VARIABLE": "משתנה חדש...", - "NEW_VARIABLE_TITLE": "שם המשתנה החדש:", - "RENAME_VARIABLE": "שנה את שם המשתנה...", - "RENAME_VARIABLE_TITLE": "שנה את שם כל '%1' המשתנים ל:", - "COLOUR_PICKER_HELPURL": "http://he.wikipedia.org/wiki/%D7%A6%D7%91%D7%A2", - "COLOUR_PICKER_TOOLTIP": "בחר צבע מן הצבעים.", - "COLOUR_RANDOM_TITLE": "צבע אקראי", - "COLOUR_RANDOM_TOOLTIP": "בחר צבא אקראי.", - "COLOUR_RGB_TITLE": "צבע עם", - "COLOUR_RGB_RED": "אדום", - "COLOUR_RGB_GREEN": "ירוק", - "COLOUR_RGB_BLUE": "כחול", - "COLOUR_RGB_TOOLTIP": "צור צבע עם הסכום המצוין של אדום, ירוק וכחול. כל הערכים חייבים להיות בין 0 ל100.", - "COLOUR_BLEND_TITLE": "ערבב", - "COLOUR_BLEND_COLOUR1": "צבע 1", - "COLOUR_BLEND_COLOUR2": "צבע 2", - "COLOUR_BLEND_RATIO": "יחס", - "COLOUR_BLEND_TOOLTIP": "מערבב שני צבעים יחד עם יחס נתון(0.0 - 1.0).", - "CONTROLS_REPEAT_TITLE": "חזור על הפעולה %1 פעמים", - "CONTROLS_REPEAT_INPUT_DO": "תעשה", - "CONTROLS_REPEAT_TOOLTIP": "לעשות כמה פעולות מספר פעמים.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "חזור כל עוד", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "חזור עד ש...", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "כל עוד הערך הוא אמת, לעשות כמה פעולות.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "בזמן שהערך שווה לשגוי, תעשה מספר חישובים.", - "CONTROLS_FOR_TITLE": "תספור עם %1 מ- %2 ל- %3 עד- %4", - "CONTROLS_FOREACH_TITLE": "לכל פריט %1 ברשימה %2", - "CONTROLS_FOREACH_TOOLTIP": "לכל פריט ברשימה, להגדיר את המשתנה '%1' לפריט הזה, ולאחר מכן לעשות כמה פעולות.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "צא מהלולאה", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "המשך עם האיטרציה הבאה של הלולאה", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "צא אל מחוץ ללולאה הכוללת.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "דלג על שאר הלולאה והמשך עם האיטרציה הבאה.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "אזהרה: בלוק זה עשוי לשמש רק בתוך לולאה.", - "CONTROLS_IF_TOOLTIP_1": "אם ערך נכון, לבצע כמה פעולות.", - "CONTROLS_IF_TOOLTIP_2": "אם הערך הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, לבצע את הבלוק השני של הפעולות.", - "CONTROLS_IF_TOOLTIP_3": "אם הערך הראשון הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, אם הערך השני הוא אמת, לבצע את הבלוק השני של הפעולות.", - "CONTROLS_IF_TOOLTIP_4": "אם הערך הראשון הוא אמת, לבצע את הבלוק הראשון של הפעולות. אחרת, אם הערך השני הוא אמת, לבצע את הבלוק השני של הפעולות. אם אף אחד מהם אינו נכון, לבצע את הבלוק האחרון של הפעולות.", - "CONTROLS_IF_MSG_IF": "אם", - "CONTROLS_IF_MSG_ELSEIF": "אחרת אם", - "CONTROLS_IF_MSG_ELSE": "אחרת", - "CONTROLS_IF_IF_TOOLTIP": "תוסיף, תמחק, או תסדר מחדש כדי להגדיר מחדש את הבלוק If.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "תוסיף תנאי לבלוק If.", - "CONTROLS_IF_ELSE_TOOLTIP": "לסיום, כל התנאים תקפים לגבי בלוק If.", - "LOGIC_COMPARE_TOOLTIP_EQ": "תחזיר נכון אם שני הקלטים שווים אחד לשני.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "תחזיר אמת אם שני הקלטים אינם שווים זה לזה.", - "LOGIC_COMPARE_TOOLTIP_LT": "תחזיר אמת (true) אם הקלט הראשון הוא קטן יותר מאשר הקלט השני.", - "LOGIC_COMPARE_TOOLTIP_LTE": "תחזיר אמת אם הקלט הראשון הוא קטן יותר או שווה לקלט השני.", - "LOGIC_COMPARE_TOOLTIP_GT": "תחזיר נכון אם הקלט הראשון גדול יותר מהקלט השני.", - "LOGIC_COMPARE_TOOLTIP_GTE": "תחזיר נכון אם הקלט הראשון גדול יותר או שווה לכניסה השנייה.", - "LOGIC_OPERATION_TOOLTIP_AND": "תחזיר נכון אם שני הקלטים נכונים.", - "LOGIC_OPERATION_AND": "ו", - "LOGIC_OPERATION_TOOLTIP_OR": "תחזיר נכון אם מתקיים לפחות אחד מהקלטים נכונים.", - "LOGIC_OPERATION_OR": "או", - "LOGIC_NEGATE_TITLE": "לא %1", - "LOGIC_BOOLEAN_TRUE": "נכון", - "LOGIC_BOOLEAN_FALSE": "שגוי", - "LOGIC_BOOLEAN_TOOLTIP": "תחזיר אם נכון או אם שגוי.", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "תחזיר ריק.", - "LOGIC_TERNARY_CONDITION": "בדיקה", - "LOGIC_TERNARY_IF_TRUE": "אם נכון", - "LOGIC_TERNARY_IF_FALSE": "אם שגוי", - "LOGIC_TERNARY_TOOLTIP": "בדוק את התנאי ב'מבחן'. אם התנאי נכון, תחזיר את הערך 'אם נכון'; אחרת תחזיר את הערך 'אם שגוי'.", - "MATH_NUMBER_TOOLTIP": "מספר.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://he.wikipedia.org/wiki/ארבע_פעולות_החשבון", - "MATH_ARITHMETIC_TOOLTIP_ADD": "תחזיר את סכום שני המספרים.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "החזרת ההפרש בין שני מספרים.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "החזרת תוצאת הכפל בין שני מספרים.", - "MATH_SINGLE_OP_ROOT": "שורש ריבועי", - "MATH_SINGLE_OP_ABSOLUTE": "ערך מוחלט", - "MATH_SINGLE_TOOLTIP_ABS": "החזרת הערך המוחלט של מספר.", - "MATH_SINGLE_TOOLTIP_NEG": "החזרת הערך הנגדי של מספר.", - "MATH_SINGLE_TOOLTIP_LN": "החזרת הלוגריתם הטבעי של מספר.", - "MATH_IS_EVEN": "זוגי", - "MATH_IS_ODD": "אי-זוגי", - "MATH_IS_PRIME": "ראשוני", - "MATH_IS_WHOLE": "שלם", - "MATH_IS_POSITIVE": "חיובי", - "MATH_IS_NEGATIVE": "שלילי", - "MATH_IS_DIVISIBLE_BY": "מתחלק ב", - "MATH_CHANGE_TOOLTIP": "הוסף מספר למשתנה '%1'.", - "MATH_ROUND_TOOLTIP": "עיגול מספר למעלה או למטה.", - "MATH_ROUND_OPERATOR_ROUND": "עיגול", - "MATH_ROUND_OPERATOR_ROUNDUP": "עיגול למעלה", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "עיגול למטה", - "MATH_ONLIST_OPERATOR_SUM": "סכום של רשימה", - "MATH_ONLIST_OPERATOR_MIN": "מינימום של רשימה", - "MATH_ONLIST_TOOLTIP_MIN": "תחזיר את המספר הקטן ביותר ברשימה.", - "MATH_ONLIST_OPERATOR_MAX": "מקסימום של רשימה", - "MATH_ONLIST_TOOLTIP_MAX": "תחזיר את המספר הגדול ביותר ברשימה.", - "MATH_ONLIST_OPERATOR_AVERAGE": "ממוצע של רשימה", - "MATH_ONLIST_OPERATOR_MEDIAN": "חציון של רשימה", - "MATH_ONLIST_TOOLTIP_MEDIAN": "תחזיר את המספר החיצוני ביותר ברשימה.", - "MATH_ONLIST_OPERATOR_MODE": "שכיחי הרשימה", - "MATH_ONLIST_OPERATOR_RANDOM": "פריט אקראי מרשימה", - "MATH_ONLIST_TOOLTIP_RANDOM": "תחזיר רכיב אקראי מרשימה.", - "MATH_MODULO_TITLE": "שארית החילוק %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "החזרת השארית מחלוקת שני המספרים.", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "שבר אקראי", - "TEXT_JOIN_TITLE_CREATEWITH": "יצירת טקסט עם", - "TEXT_CREATE_JOIN_TITLE_JOIN": "צירוף", - "TEXT_APPEND_TO": "אל", - "TEXT_APPEND_APPENDTEXT": "הוספת טקסט", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "לאותיות גדולות (עבור טקסט באנגלית)", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "לאותיות קטנות (עבור טקסט באנגלית)", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "לאותיות גדולות בתחילת כל מילה (עבור טקסט באנגלית)", - "TEXT_TRIM_TOOLTIP": "להחזיר עותק של הטקסט לאחר מחיקת רווחים מאחד או משני הקצוות.", - "TEXT_TRIM_OPERATOR_BOTH": "למחוק רווחים משני הקצוות", - "TEXT_TRIM_OPERATOR_LEFT": "למחוק רווחים מימין", - "TEXT_TRIM_OPERATOR_RIGHT": "למחוק רווחים משמאל", - "TEXT_PRINT_TITLE": "הדפס %1", - "TEXT_PRINT_TOOLTIP": "להדפיס טקסט, מספר או ערך אחר שצוין", - "TEXT_PROMPT_TYPE_TEXT": "בקשה להזנת טקסט עם הודעה", - "TEXT_PROMPT_TYPE_NUMBER": "בקשה למספר עם הודעה", - "TEXT_PROMPT_TOOLTIP_NUMBER": "בקש מהמשתמש מספר.", - "TEXT_PROMPT_TOOLTIP_TEXT": "בקשה למשתמש להזין טקסט כלשהו.", - "LISTS_CREATE_EMPTY_TITLE": "צור רשימה ריקה", - "LISTS_CREATE_EMPTY_TOOLTIP": "החזר רשימה,באורך 0, המכילה רשומות נתונים", - "LISTS_CREATE_WITH_TOOLTIP": "צור רשימה עם כל מספר של פריטים.", - "LISTS_CREATE_WITH_INPUT_WITH": "צור רשימה עם", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "רשימה", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "תוסיף, תמחק, או תסדר מחדש כדי להגדיר מחדש את הבלוק If.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "הוסף פריט לרשימה.", - "LISTS_REPEAT_TOOLTIP": "יוצר רשימה המורכבת מהערך נתון חוזר מספר פעמים שצוין.", - "LISTS_REPEAT_TITLE": "ליצור רשימה עם הפריט %1 %2 פעמים", - "LISTS_LENGTH_TITLE": "אורכו של %1", - "LISTS_LENGTH_TOOLTIP": "מחזירה את האורך של רשימה.", - "LISTS_ISEMPTY_TITLE": "%1 הוא ריק", - "LISTS_ISEMPTY_TOOLTIP": "מחזיר אמת אם הרשימה ריקה.", - "LISTS_INLIST": "ברשימה", - "LISTS_INDEX_OF_FIRST": "מחזירה את המיקום הראשון של פריט ברשימה", - "LISTS_INDEX_OF_LAST": "מחזירה את המיקום האחרון של פריט ברשימה", - "LISTS_INDEX_OF_TOOLTIP": "מחזירה את האינדקס של המופע ראשון/אחרון של הפריט ברשימה. מחזירה 0 אם טקסט אינו נמצא.", - "LISTS_GET_INDEX_GET": "לקבל", - "LISTS_GET_INDEX_GET_REMOVE": "קבל ומחק", - "LISTS_GET_INDEX_REMOVE": "הסרה", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# מהסוף", - "LISTS_GET_INDEX_FIRST": "ראשון", - "LISTS_GET_INDEX_LAST": "אחרון", - "LISTS_GET_INDEX_RANDOM": "אקראי", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "מחזיר את הפריט הראשון ברשימה.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "מחזיר את הפריט האחרון ברשימה.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "מחזיר פריט אקראי מהרשימה.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "מסיר ומחזיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "מסיר ומחזיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "מסיר ומחזיר את הפריט הראשון ברשימה.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "מסיר ומחזיר את הפריט האחרון ברשימה.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "מחק והחזר פריט אקראי מהרשימה.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "מחזיר פריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "הסר את הפריט הראשון ברשימה.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "הסר את הפריט הראשון ברשימה.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "הסר פריט אקראי ברשימה.", - "LISTS_SET_INDEX_SET": "הגדר", - "LISTS_SET_INDEX_INSERT": "הכנס ב", - "LISTS_SET_INDEX_INPUT_TO": "כמו", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "מגדיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "מגדיר את הפריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "מגדיר את הפריט הראשון ברשימה.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "מגדיר את הפריט האחרון ברשימה.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "מגדיר פריט אקראי ברשימה.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "מכניס את הפריט במיקום שצוין ברשימה. #1 הוא הפריט הראשון.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "מכניס את הפריט במיקום שצוין ברשימה. #1 הוא הפריט האחרון.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "מכניס את הפריט בתחילת רשימה.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "מוסיף את הפריט בסוף רשימה.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "הוסף פריט באופן אקראי ברשימה.", - "LISTS_GET_SUBLIST_START_FROM_START": "לקבל חלק מהרשימה החל מ-#", - "LISTS_GET_SUBLIST_START_FROM_END": "לקבל חלק מהרשימה החל מ-# עד הסוף", - "LISTS_GET_SUBLIST_START_FIRST": "לקבל חלק מהרשימה החל מהתחלה", - "LISTS_GET_SUBLIST_END_FROM_START": "ל #", - "LISTS_GET_SUBLIST_END_FROM_END": "ל # מהסוף", - "LISTS_GET_SUBLIST_END_LAST": "לאחרון", - "LISTS_GET_SUBLIST_TOOLTIP": "יוצרת עותק של חלק מסוים מהרשימה.", - "LISTS_SPLIT_LIST_FROM_TEXT": "יצירת רשימה מטקסט", - "LISTS_SPLIT_TEXT_FROM_LIST": "יצירת טקסט מרשימה", - "VARIABLES_GET_TOOLTIP": "להחזיר את הערך של משתנה זה.", - "VARIABLES_GET_CREATE_SET": "ליצור 'הגדר %1'", - "VARIABLES_SET": "הגדר %1 ל- %2", - "VARIABLES_SET_TOOLTIP": "מגדיר משתנה זה להיות שווה לקלט.", - "VARIABLES_SET_CREATE_GET": "ליצור 'קרא %1'", - "PROCEDURES_DEFNORETURN_TITLE": "לביצוע:", - "PROCEDURES_DEFNORETURN_PROCEDURE": "לעשות משהו", - "PROCEDURES_BEFORE_PARAMS": "עם:", - "PROCEDURES_CALL_BEFORE_PARAMS": "עם:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "יצירת פונקציה ללא פלט.", - "PROCEDURES_DEFRETURN_RETURN": "להחזיר", - "PROCEDURES_DEFRETURN_TOOLTIP": "יצירת פונקציה עם פלט.", - "PROCEDURES_ALLOW_STATEMENTS": "לאפשר פעולות", - "PROCEDURES_DEF_DUPLICATE_WARNING": "אזהרה: לפונקציה זו יש פרמטרים כפולים.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://he.wikipedia.org/wiki/שגרה_(תכנות)", - "PROCEDURES_CALLNORETURN_TOOLTIP": "להפעיל את הפונקציה המוגדרת על-ידי המשתמש '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://he.wikipedia.org/wiki/שגרה_(תכנות)", - "PROCEDURES_CALLRETURN_TOOLTIP": "להפעיל את הפונקציה המוגדרת על-ידי המשתמש '%1' ולהשתמש הפלט שלה.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "מקורות קלט", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "הוסף, הסר או סדר מחדש קלטים לפונקציה זו", - "PROCEDURES_MUTATORARG_TITLE": "שם הקלט:", - "PROCEDURES_MUTATORARG_TOOLTIP": "הוסף קלט לפונקציה", - "PROCEDURES_HIGHLIGHT_DEF": "הדגש הגדרה של פונקציה", - "PROCEDURES_CREATE_DO": "ליצור '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "אם ערך נכון, אז להחזיר ערך שני.", - "PROCEDURES_IFRETURN_WARNING": "אזהרה: בלוק זה עשוי לשמש רק בתוך הגדרה של פונקציה." -} diff --git a/msg/json/hi.json b/msg/json/hi.json deleted file mode 100644 index f2d06f58df..0000000000 --- a/msg/json/hi.json +++ /dev/null @@ -1,254 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Bl707", - "संजीव कुमार", - "Phoenix303" - ] - }, - "VARIABLES_DEFAULT_NAME": "आइटम", - "TODAY": "आज", - "DUPLICATE_BLOCK": "कॉपी करें", - "ADD_COMMENT": "टिप्पणी छोड़ें", - "REMOVE_COMMENT": "टिप्पणी हटायें", - "EXTERNAL_INPUTS": "बाहरी इनपुट", - "INLINE_INPUTS": "इनलाइन इनपुट", - "DELETE_BLOCK": "ब्लॉक हटाएँ", - "DELETE_X_BLOCKS": "%1 ब्लॉक हटाएँ", - "COLLAPSE_BLOCK": "ब्लॉक को संक्षिप्त करें", - "COLLAPSE_ALL": "ब्लॉक संक्षिप्त करें", - "EXPAND_BLOCK": "ब्लॉक का विस्तार करें", - "EXPAND_ALL": "ब्लॉक विस्तार करें", - "DISABLE_BLOCK": "ब्लॉक को अक्षम करें", - "ENABLE_BLOCK": "ब्लॉक को सक्षम करें", - "HELP": "सहायता", - "CHAT": "इस सन्दूक में लिखकर हमारे सहयोगी के साथ बातचीत करें!", - "AUTH": "अपने कार्य को सहेजना सक्षम करने और अपने साथ इसे साझा करने हेतु कृपया इस एप्प को अधिकृत करें।", - "ME": "मैं", - "CHANGE_VALUE_TITLE": "मान परिवर्तित करें:", - "NEW_VARIABLE": "नया चर...", - "NEW_VARIABLE_TITLE": "नए चर का नाम:", - "RENAME_VARIABLE": "चर का नाम बदलें...", - "RENAME_VARIABLE_TITLE": "सभी '%1' चरों के नाम बदलें:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "पैलेट से एक रंग चुनें।", - "COLOUR_RANDOM_TITLE": "रैन्डम रंग", - "COLOUR_RANDOM_TOOLTIP": "रैन्डम्ली एक रंग चयन करें।", - "COLOUR_RGB_TITLE": "इसके साथ रंग करें", - "COLOUR_RGB_RED": "लाल", - "COLOUR_RGB_GREEN": "हरा", - "COLOUR_RGB_BLUE": "नीला", - "COLOUR_RGB_TOOLTIP": "लाल, हरा और नीले की निर्दिष्ट मात्रा के साथ एक रंग बनायें। सभी मान ० से १०० के बीच होने चाहिए।", - "COLOUR_BLEND_TITLE": "मिश्रण करें", - "COLOUR_BLEND_COLOUR1": "रंग 1", - "COLOUR_BLEND_COLOUR2": "रंग 2", - "COLOUR_BLEND_RATIO": "अनुपात", - "COLOUR_BLEND_TOOLTIP": "दिए गए अनुपात (0.0 - 1.0) के साथ दो रंगों का मिश्रण करता है।", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "%1 बार दोहराएँ", - "CONTROLS_REPEAT_INPUT_DO": "डू", - "CONTROLS_REPEAT_TOOLTIP": "कुछ स्टेट्मन्ट कई बार चलाएँ।", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "दोहराएँ जब कि", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "दोहराएँ जब तक", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "जब तक मान ट्रू है, तब तक कुछ स्टेट्मेंट्स चलाएँ।", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "जब तक मान फॉल्स है, तब तक कुछ स्टेट्मेंट्स चलाएँ।", - "CONTROLS_FOR_TITLE": "काउंट करें", - "CONTROLS_FOREACH_TITLE": "प्रत्येक आइटम के लिए %1 सूची में %2", - "CONTROLS_FOREACH_TOOLTIP": "सूची के प्रत्येक आयटम के लिए, आयटम में चर का मान '%1' रखें और बाद में कुछ कथन लिखें।", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "लूप से बाहर निकलें", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "लूप का अगला आईटरेशन जारी रखें", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "भीतरी लूप से बाहर निकलें।", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "बाकी बचे लूप को छोड़ें, और अगला आईटरेशन जारी रखें।", - "CONTROLS_FLOW_STATEMENTS_WARNING": "सावधान: ये ब्लॉक केवल लूप के अंदर इस्तेमाल किया जा सकता है।", - "CONTROLS_IF_TOOLTIP_1": "यदी मान ट्रू है, तो कुछ स्टेट्मेंट्स चलाएँ।", - "CONTROLS_IF_TOOLTIP_2": "यदि एक मान सत्य है तो कथनों का प्रथम खण्ड बनायें। अन्यथा कथनों का दूसरा भाग निर्मित करें।", - "CONTROLS_IF_MSG_IF": "इफ", - "CONTROLS_IF_MSG_ELSEIF": "एल्स इफ", - "CONTROLS_IF_MSG_ELSE": "एल्स", - "CONTROLS_IF_ELSEIF_TOOLTIP": "यदि ब्लॉक मे एक शर्त जोड़ें।", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "ट्रू रिटर्न करें यदि दोनो इनपुट इक दूसरे के बराबर हों।", - "LOGIC_COMPARE_TOOLTIP_NEQ": "ट्रू रिटर्न करें यदि दोनो इनपुट इक दूसरे के बराबर नहीं हों।", - "LOGIC_COMPARE_TOOLTIP_LT": "ट्रू रिटर्न करें यदि पहला इनपुट दूसरे इनपुट से छोटा हो।", - "LOGIC_COMPARE_TOOLTIP_LTE": "ट्रू रिटर्न करें यदि पहला इनपुट दूसरे इनपुट से छोटा हो या बराबर हो।", - "LOGIC_COMPARE_TOOLTIP_GT": "ट्रू रिटर्न करें यदि पहला इनपुट दूसरे इनपुट से बड़ा हो।", - "LOGIC_COMPARE_TOOLTIP_GTE": "ट्रू रिटर्न करें यदि पहला इनपुट दूसरे इनपुट से बड़ा हो या बराबर हो।", - "LOGIC_OPERATION_TOOLTIP_AND": "ट्रू रिटर्न करें यदि दोनो इनपुट ट्रू हों।", - "LOGIC_OPERATION_AND": "AND (तथा)", - "LOGIC_OPERATION_TOOLTIP_OR": "ट्रू रिटर्न करें यदि दोनो मे से इक इनपुट ट्रू हो।", - "LOGIC_OPERATION_OR": "OR (अथवा)", - "LOGIC_NEGATE_TITLE": "NOT (पूरक) %1", - "LOGIC_NEGATE_TOOLTIP": "ट्रू रिटर्न करता है यदि इनपुट फॉल्स है। फॉल्स रिटर्न करता है यदि इनपुट ट्रू है।", - "LOGIC_BOOLEAN_TRUE": "ट्रू", - "LOGIC_BOOLEAN_FALSE": "फॉल्स", - "LOGIC_BOOLEAN_TOOLTIP": "ट्रू या फॉल्स रिटर्न करता है।", - "LOGIC_NULL": "NULL (अमान्य)", - "LOGIC_NULL_TOOLTIP": "null (अमान्य) रिटर्न करता है।", - "LOGIC_TERNARY_CONDITION": "टेस्ट", - "LOGIC_TERNARY_IF_TRUE": "यदि ट्रू है", - "LOGIC_TERNARY_IF_FALSE": "यदि फॉल्स है", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "एक संख्या।", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "दो संख्याओं का योग रिटर्न करें।", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "दो संख्याओं का अंतर रिटर्न करें।", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "दो संख्याओं का गुणन रिटर्न करें।", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "दो संख्याओं का भागफल रिटर्न करें।", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "वर्गमूल", - "MATH_SINGLE_TOOLTIP_ROOT": "संख्या का वर्गमूल रिटर्न करें।", - "MATH_SINGLE_OP_ABSOLUTE": "परम", - "MATH_SINGLE_TOOLTIP_ABS": "संख्या का परम मान रिटर्न करें।", - "MATH_SINGLE_TOOLTIP_NEG": "संख्या का निषेध मान रिटर्न करें।", - "MATH_SINGLE_TOOLTIP_LN": "संख्या का प्राकृतिक लघुगणक रिटर्न करें।", - "MATH_SINGLE_TOOLTIP_LOG10": "संख्या का मूल 10 लघुगणक रिटर्न करें।", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "डिग्री का साइन रिटर्न करें (रेडियन नही)", - "MATH_TRIG_TOOLTIP_COS": "डिग्री का कोसाइन रिटर्न करें (रेडियन नही)", - "MATH_TRIG_TOOLTIP_TAN": "डिग्री का टैन्जन्ट रिटर्न करें (रेडियन नही)", - "MATH_TRIG_TOOLTIP_ASIN": "संख्या का आर्कसाइन रिटर्न करें।", - "MATH_TRIG_TOOLTIP_ACOS": "संख्या का आर्ककोसाइन रिटर्न करें।", - "MATH_TRIG_TOOLTIP_ATAN": "संख्या का आर्कटैन्जन्ट रिटर्न करें।", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_IS_EVEN": "सम है", - "MATH_IS_ODD": "विषम है", - "MATH_IS_PRIME": "अभाज्य है", - "MATH_IS_WHOLE": "पूर्णांक है", - "MATH_IS_POSITIVE": "धनात्मक है", - "MATH_IS_NEGATIVE": "ऋणात्मक है", - "MATH_IS_DIVISIBLE_BY": "इसके द्वारा विभाज्य है", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TOOLTIP": "संख्या को चर '%1' से जोड़ें।", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "संख्या को बड़ा या घटा के पूर्णांक बनाएँ।", - "MATH_ROUND_OPERATOR_ROUND": "पूर्णांक बनाएँ", - "MATH_ROUND_OPERATOR_ROUNDUP": "बड़ा के पूर्णांक बनाएँ", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "घटा के पूर्णांक बनाएँ", - "MATH_ONLIST_OPERATOR_SUM": "सूची का योग", - "MATH_ONLIST_TOOLTIP_SUM": "सूची की सभी संख्याओं का योग रिटर्न करें।", - "MATH_ONLIST_OPERATOR_MIN": "सूची मे न्यूनतम", - "MATH_ONLIST_TOOLTIP_MIN": "सूची मे सबसे छोटी संख्या रिटर्न करें।", - "MATH_ONLIST_OPERATOR_MAX": "सूची मे अधिकतम", - "MATH_ONLIST_TOOLTIP_MAX": "सूची मे सबसे बड़ी संख्या रिटर्न करें।", - "MATH_ONLIST_OPERATOR_AVERAGE": "सूची का औसत मान", - "MATH_ONLIST_OPERATOR_MEDIAN": "सूची की माध्यिका", - "MATH_ONLIST_TOOLTIP_MEDIAN": "सूची की माध्यिका संख्या रिटर्न करें।", - "MATH_ONLIST_OPERATOR_MODE": "सूची का मोड", - "MATH_ONLIST_TOOLTIP_MODE": "सूची मे सबसे आम आइटम(s) की सूची रिटर्न करें।", - "MATH_ONLIST_OPERATOR_STD_DEV": "सूची का मानक विचलन", - "MATH_ONLIST_TOOLTIP_STD_DEV": "सूची का मानक विचलन रिटर्न करें।", - "MATH_ONLIST_OPERATOR_RANDOM": "सूची का रैन्डम आइटम", - "MATH_ONLIST_TOOLTIP_RANDOM": "सूची से एक रैन्डम आइटम रिटर्न करें।", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "%1 ÷ %2 का शेषफल", - "MATH_MODULO_TOOLTIP": "दो संख्याओं के भाग का शेषफल रिटर्न करें।", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "%1 से %2 तक रैन्डम पूर्णांक", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "रैन्डम अंश", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "एक अक्षर, शब्द, या टेक्स्ट की पंक्ति।", - "TEXT_JOIN_TITLE_CREATEWITH": "इसके साथ टेक्स्ट बनाएँ", - "TEXT_CREATE_JOIN_TITLE_JOIN": "जोड़", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "सूची मे एक आइटम जोड़ें।", - "TEXT_APPEND_TO": "इस", - "TEXT_APPEND_APPENDTEXT": "से जोड़ें ये टेक्स्ट", - "TEXT_APPEND_TOOLTIP": "कुछ टेक्स्ट इस चर '%1' से जोड़ें।", - "TEXT_LENGTH_TITLE": "%1 की लंबाई", - "TEXT_LENGTH_TOOLTIP": "दिए गये टेक्स्ट मे अक्षरों की संख्या रिटर्न करता है (खाली स्थान मिला के)।", - "TEXT_ISEMPTY_TITLE": "%1 खाली है", - "TEXT_ISEMPTY_TOOLTIP": "ट्रू रिटर्न करता है यदि दिया गया टेक्स्ट खाली है।", - "TEXT_INDEXOF_INPUT_INTEXT": "इस टेक्स्ट मे", - "TEXT_INDEXOF_OPERATOR_FIRST": "टेक्स्ट पहली बार जहाँ आया है उसे ढूढ़े", - "TEXT_INDEXOF_OPERATOR_LAST": "टेक्स्ट आखरी बार जहाँ आया है उसे ढूढ़े", - "TEXT_CHARAT_INPUT_INTEXT": "इस टेक्स्ट मे", - "TEXT_CHARAT_FROM_START": "अक्षर # पाएँ", - "TEXT_CHARAT_FROM_END": "आखिर से अक्षर # पाएँ", - "TEXT_CHARAT_FIRST": "पहला अक्षर पाएँ", - "TEXT_CHARAT_LAST": "आखरी अक्षर पाएँ", - "TEXT_CHARAT_RANDOM": "रैन्डम अक्षर पाएँ", - "TEXT_CHARAT_TOOLTIP": "बताई गयी जगह से अक्षर रिटर्न करता है", - "TEXT_GET_SUBSTRING_TOOLTIP": "टेक्स्ट का बताया गया अंश रिटर्न करता है", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "इस टेक्स्ट मे", - "TEXT_GET_SUBSTRING_START_FROM_START": "अक्षर # से सबस्ट्रिंग पाएँ", - "TEXT_GET_SUBSTRING_START_FROM_END": "आखरी अक्षर # से सबस्ट्रिंग पाएँ", - "TEXT_GET_SUBSTRING_START_FIRST": "पहले अक्षर से सबस्ट्रिंग पाएँ", - "TEXT_GET_SUBSTRING_END_FROM_START": "यहाँ तक अक्षर #", - "TEXT_GET_SUBSTRING_END_FROM_END": "आखिर से यहाँ तक अक्षर #", - "TEXT_GET_SUBSTRING_END_LAST": "यहाँ तक आखरी अक्षर", - "TEXT_CHANGECASE_TOOLTIP": "टेक्स्ट की कॉपी भिन्न केस (अक्षर से संबंधित) मे रिटर्न करें।", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "बड़े अक्षर मे", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "छोटे अक्षर मे", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "टाइटल केस मे", - "TEXT_TRIM_OPERATOR_BOTH": "रिक्त स्थान को इस टेक्स्ट के दोनों तरफ से निकालें", - "TEXT_TRIM_OPERATOR_LEFT": "रिक्त स्थान को इस टेक्स्ट के बायें तरफ से निकालें", - "TEXT_TRIM_OPERATOR_RIGHT": "रिक्त स्थान को इस टेक्स्ट के दाईं तरफ से निकालें", - "TEXT_PRINT_TITLE": "प्रिंट करें %1", - "TEXT_PRINT_TOOLTIP": "दिया गया टेक्स्ट प्रिंट करें, संख्या या अन्य मान।", - "TEXT_PROMPT_TYPE_TEXT": "सूचना के साथ टेक्स्ट के लिए प्रॉम्प्ट करें", - "TEXT_PROMPT_TYPE_NUMBER": "सूचना के साथ संख्या के लिए प्रॉम्प्ट करें", - "TEXT_PROMPT_TOOLTIP_NUMBER": "यूज़र से संख्या के लिए प्रॉम्प्ट करें।", - "TEXT_PROMPT_TOOLTIP_TEXT": "यूज़र से कुछ टेक्स्ट के लिए प्रॉम्प्ट करें।", - "LISTS_CREATE_EMPTY_TITLE": "खाली सूची बनाएँ", - "LISTS_CREATE_WITH_TOOLTIP": "कितने भी आइटम वाली एक सूची बनाएँ।", - "LISTS_CREATE_WITH_INPUT_WITH": "इसके सूची बनाएँ", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "सूची", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "सूची मे एक आइटम जोड़ें।", - "LISTS_LENGTH_TITLE": "%1 की लंबाई", - "LISTS_LENGTH_TOOLTIP": "सूची की लंबाई रिटर्न करता है।", - "LISTS_ISEMPTY_TITLE": "%1 खाली है", - "LISTS_ISEMPTY_TOOLTIP": "यदि सूची खाली है तो ट्रू रिटर्न करता है।", - "LISTS_INLIST": "सूची में", - "LISTS_INDEX_OF_FIRST": "आइटम पहली बार जहाँ आया है उसे ढूढ़े", - "LISTS_INDEX_OF_LAST": "आइटम आखरी बार जहाँ आया है उसे ढूढ़े", - "LISTS_GET_INDEX_GET": "प्राप्त", - "LISTS_GET_INDEX_GET_REMOVE": "प्राप्त करे और हटाए", - "LISTS_GET_INDEX_REMOVE": "निकालें", - "LISTS_GET_INDEX_FROM_END": "अंत से #", - "LISTS_GET_INDEX_FIRST": "पहला", - "LISTS_GET_INDEX_LAST": "आखिरी", - "LISTS_GET_INDEX_RANDOM": "रैन्डम", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "सूची का पहला आइटम रिटर्न करता है।", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "सूची का आखरी आइटम रिटर्न करता है।", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "सूची से रैन्डम आइटम रिटर्न करता है।", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "सूची का पहला आइटम निकालता है और रिटर्न करता है।", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "सूची का आखरी आइटम निकालता है और रिटर्न करता है।", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "सूची से रैन्डम आइटम निकालता है और रिटर्न करता है।", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "सूची का पहला आइटम निकालता है।", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "सूची का आखरी आइटम निकालता है।", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "सूची से रैन्डम आइटम निकालता है।", - "LISTS_SET_INDEX_SET": "सैट करें", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "सूची मे बताए गये स्थान में आइटम सैट करता है। #1 पहला आइटम है।", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "सूची मे बताए गये स्थान में आइटम सैट करता है। #1 आखरी आइटम है।", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "सूची में पहला आइटम सैट करता है।", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "सूची में आखरी आइटम सैट करता है।", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "सूची में रैन्डम आइटम सैट करता है।", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है। #1 पहला आइटम है।", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है। #1 आखरी आइटम है।", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "आइटम को सूची के शुरू में इनसर्ट करता है।", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "आइटम को सूची के अंत में जोड़ता है।", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "आइटम को सूची में रैन्डम्ली इनसर्ट करता है।", - "LISTS_GET_SUBLIST_TOOLTIP": "सूची के बताए गये भाग की कॉपी बनता है।", - "VARIABLES_GET_TOOLTIP": "इस चर का मान रिटर्न करता है।", - "VARIABLES_GET_CREATE_SET": "सेट '%1' बनाएँ", - "VARIABLES_SET": "सेट करें %1 को %2", - "VARIABLES_SET_TOOLTIP": "इस चर को इनपुट के बराबर सेट करता है।", - "PROCEDURES_DEFNORETURN_PROCEDURE": "कुछ करें", - "PROCEDURES_BEFORE_PARAMS": ": के साथ", - "PROCEDURES_CALL_BEFORE_PARAMS": ": के साथ", - "PROCEDURES_DEFNORETURN_TOOLTIP": "बिना आउटपुट वाला एक फ़ंक्शन बनाता है।", - "PROCEDURES_DEFRETURN_RETURN": "रिटर्न", - "PROCEDURES_DEFRETURN_TOOLTIP": "आउटपुट वाला एक फ़ंक्शन बनाता है।", - "PROCEDURES_DEF_DUPLICATE_WARNING": "सावधान: इस फ़ंक्शन मे डुप्लिकेट पैरामीटर हैं।", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ।", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ और उसका आउटपुट इस्तेमाल करें।", - "PROCEDURES_MUTATORCONTAINER_TITLE": "इनपुट", - "PROCEDURES_MUTATORARG_TITLE": "इनपुट का नाम:", - "PROCEDURES_MUTATORARG_TOOLTIP": "फंगक्शन को इनपुट प्रदान करें।", - "PROCEDURES_HIGHLIGHT_DEF": "फ़ंक्शन परिभाषा को हाइलाइट करें", - "PROCEDURES_CREATE_DO": "'%1' बनाएँ", - "PROCEDURES_IFRETURN_TOOLTIP": "यदि एक मान ट्रू है तो, दूसरा मान रिटर्न करें।", - "PROCEDURES_IFRETURN_WARNING": "सावधान: ये ब्लॉक फ़ंक्शन परिभाषा के अंदर ही इस्तेमाल किया जा सकता।" -} diff --git a/msg/json/hrx.json b/msg/json/hrx.json deleted file mode 100644 index 39a3f37ad8..0000000000 --- a/msg/json/hrx.json +++ /dev/null @@ -1,295 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Paul Beppler" - ] - }, - "VARIABLES_DEFAULT_NAME": "Element", - "DUPLICATE_BLOCK": "Kopieren", - "ADD_COMMENT": "Kommentar hinzufüche", - "REMOVE_COMMENT": "Kommentar entferne", - "EXTERNAL_INPUTS": "External Inputsexterne Ingänge", - "INLINE_INPUTS": "interne Ingänge", - "DELETE_BLOCK": "Block lösche", - "DELETE_X_BLOCKS": "Block %1 lösche", - "DELETE_ALL_BLOCKS": "All %1 Bausten lösche?", - "COLLAPSE_BLOCK": "Block zusammerfalte", - "COLLAPSE_ALL": "Blocke zusammerfalte", - "EXPAND_BLOCK": "Block entfalte", - "EXPAND_ALL": "Blocke expandiere", - "DISABLE_BLOCK": "Block deaktivieren", - "ENABLE_BLOCK": "Block aktivieren", - "HELP": "Hellef", - "CHAT": "Sprech mit unsrem Mitoorweiter doorrich renschreiwe von Text hier in den Kaste!", - "AUTH": "Weart ännre:", - "ME": "Ich", - "CHANGE_VALUE_TITLE": "Neie Variable...", - "NEW_VARIABLE": "Neie Variable...", - "NEW_VARIABLE_TITLE": "Die neie Variable sei Noome:", - "RENAME_VARIABLE": "Die neie Variable sei Noome:", - "RENAME_VARIABLE_TITLE": "All \"%1\" Variable umbenenne in:", - "COLOUR_PICKER_HELPURL": "https://hrx.wikipedia.org/wiki/Farreb", - "COLOUR_PICKER_TOOLTIP": "Wähl en Farreb von der Palett.", - "COLOUR_RANDOM_TITLE": "zufälliche Farwe", - "COLOUR_RANDOM_TOOLTIP": "Wähl en Farreb noh dem Zufallsprinzip.", - "COLOUR_RGB_TITLE": "Färreb mit", - "COLOUR_RGB_RED": "rot", - "COLOUR_RGB_GREEN": "grün", - "COLOUR_RGB_BLUE": "blau", - "COLOUR_RGB_TOOLTIP": "Kreiere ene Farreb mit sellrbst definierte rot, grün und blau Wearte. All Wearte müsse zwischich 0 und 100 liehe.", - "COLOUR_BLEND_TITLE": "misch", - "COLOUR_BLEND_COLOUR1": "Farreb 1", - "COLOUR_BLEND_COLOUR2": "mit Farreb 2", - "COLOUR_BLEND_RATIO": "im Verhältniss", - "COLOUR_BLEND_TOOLTIP": "Vermischt 2 Farwe mit konfigurierbare Farrebverhältniss (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://hrx.wikipedia.org/wiki/For-Schleif", - "CONTROLS_REPEAT_TITLE": "wiederhol %1 mol", - "CONTROLS_REPEAT_INPUT_DO": "mach", - "CONTROLS_REPEAT_TOOLTIP": "En Oonweisung meahrfach ausführe.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Repetier solang", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "Repetiere bis", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Füahr die Oonweisung solang aus wie die Bedingung woahr (true) ist.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Füahr die Oonweisung solang aus wie die Bedingung falsch (false) ist.", - "CONTROLS_FOR_TOOLTIP": "Zähl die Variable \"%1\" von enem Startweart bis zu enem Zielweart und füahrefür jede Weart en Oonweisung aus.", - "CONTROLS_FOR_TITLE": "Zähl %1 von %2 bis %3 mit %4", - "CONTROLS_FOREACH_TITLE": "Für Weart %1 aus der List %2", - "CONTROLS_FOREACH_TOOLTIP": "Füahr en Oonweisung für jede Weart in der List aus und setzt dabei die Variable \"%1\" uff den aktuelle List Weart.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ausbreche aus der Schleif", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "mit der nächste Iteration fortfoohre aus der Schleifa", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Die umgebne Schleif beenne.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Die Oonweisung abbreche und mit der nächste Schleifiteration fortfoohre.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Warnung: Die block sollt nuar in en Schleif verwennet sin.", - "CONTROLS_IF_TOOLTIP_1": "Wenn en Bedingung woahr (true) ist, dann füahr en Oonweisung aus.", - "CONTROLS_IF_TOOLTIP_2": "Wenn en Bedingung woahr (true) ist, dann füahr die earscht Oonweisung aus. Ansonscht füahr die zwooite Oonweisung aus.", - "CONTROLS_IF_TOOLTIP_3": "Wenn der erschte Bedingung woahr (true) ist, dann füahr die erschte Oonweisung aus. Orrer wenn die zwooite Bedingung woahr (true) ist, dann füahr die zwooite Oonweisung aus.", - "CONTROLS_IF_TOOLTIP_4": "Wenn der erscht Bedingung woahr (true) ist, dann füahr die erschte Oonweisung aus. Orrer wenn die zwooite Bedingung woahr (true) ist, dann füahr die zwooite Oonweisung aus. Falls ken der beide Bedingungen woahr (true) ist, dann füahr die dritte Oonweisung aus.", - "CONTROLS_IF_MSG_IF": "wenn", - "CONTROLS_IF_MSG_ELSEIF": "orrer wenn", - "CONTROLS_IF_MSG_ELSE": "orrer", - "CONTROLS_IF_IF_TOOLTIP": "Hinzufüche, entferne orrer sortiere von Sektione", - "CONTROLS_IF_ELSEIF_TOOLTIP": "En weitre Bedingung hinzufüche.", - "CONTROLS_IF_ELSE_TOOLTIP": "En orrer Bedingung hinzufüche, füahrt en Oonweisung aus falls ken Bedingung zutrifft.", - "LOGIC_COMPARE_HELPURL": "https://hrx.wikipedia.org/wiki/Vergleich_%28Zahlen%29", - "LOGIC_COMPARE_TOOLTIP_EQ": "Ist woahr (true) wenn beide Wearte identisch sind.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Ist woahr (true) wenn beide Wearte unnerschiedlich sind.", - "LOGIC_COMPARE_TOOLTIP_LT": "Ist woahr (true) wenn der earschte Weart klener als der zwooite Weart ist.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Ist woahr (true) wenn der earscht Weart klener als orrer gleich gross wie zwooite Weart ist.", - "LOGIC_COMPARE_TOOLTIP_GT": "Ist woahr (true) wenn der erschte Weart grösser als der zwooite Weart ist.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Ist woahr (true) wenn der erschte Weart grösser als orrer gleich gross wie zwooite Weart ist.", - "LOGIC_OPERATION_TOOLTIP_AND": "Ist woahr (true) wenn beide Wearte woahr (true) sind.", - "LOGIC_OPERATION_AND": "und", - "LOGIC_OPERATION_TOOLTIP_OR": "Ist woahr (true) wenn en von der beide Wearte woahr (true) ist.", - "LOGIC_OPERATION_OR": "orrer", - "LOGIC_NEGATE_TITLE": "net %1", - "LOGIC_NEGATE_TOOLTIP": "Ist woahr (true) wenn der Ingäweweart falsch (false) ist. Ist falsch (false) wenn der Ingäweweart woahr (true) ist.", - "LOGIC_BOOLEAN_TRUE": "woahr", - "LOGIC_BOOLEAN_FALSE": "falsch", - "LOGIC_BOOLEAN_TOOLTIP": "Ist entweder woahr (true) orrer falsch (false)", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Is NULL.", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "wenn woahr", - "LOGIC_TERNARY_IF_FALSE": "wenn falsch", - "LOGIC_TERNARY_TOOLTIP": "Üwerprüft en Bedingung \"test\". Wenn die Bedingung woahr ist weerd der \"wenn woahr\" Weart zurückgeb, annerfalls der \"wenn falsch\" Weart", - "MATH_NUMBER_HELPURL": "https://hrx.wikipedia.org/wiki/Zoohl", - "MATH_NUMBER_TOOLTIP": "En Zoohl.", - "MATH_ARITHMETIC_HELPURL": "https://hrx.wikipedia.org/wiki/Grundrechenoort", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Ist die Summe zwooier Wearte.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ist die Differenz zwooier Wearte.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ist das Produkt zwooier Wearte.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ist der Quotient zwooier Wearte.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Ist der earschte Weart potenziert mit dem zoiten Weart.", - "MATH_SINGLE_HELPURL": "https://hrx.wikipedia.org/wiki/Quadratwoorzel", - "MATH_SINGLE_OP_ROOT": "Quadratwoorzel", - "MATH_SINGLE_TOOLTIP_ROOT": "Ist die Qudratwoorzel von en Weart.", - "MATH_SINGLE_OP_ABSOLUTE": "Absolutweart", - "MATH_SINGLE_TOOLTIP_ABS": "Ist der Absolutweart von en Weart.", - "MATH_SINGLE_TOOLTIP_NEG": "Negiert en Weart.", - "MATH_SINGLE_TOOLTIP_LN": "Ist der natüarliche Logarithmus von en Weart.", - "MATH_SINGLE_TOOLTIP_LOG10": "Ist der dekoodische Logarithmus von en Weart.", - "MATH_SINGLE_TOOLTIP_EXP": "Ist Weart von der Exponentialfunktion von en Weart.", - "MATH_SINGLE_TOOLTIP_POW10": "Rechnet 10 hoch Ingäbweart.", - "MATH_TRIG_HELPURL": "https://hrx.wikipedia.org/wiki/Trigonometrie", - "MATH_TRIG_TOOLTIP_SIN": "Ist der Sinus von en Winkel.", - "MATH_TRIG_TOOLTIP_COS": "Ist der Cosinus von en Winkel.", - "MATH_TRIG_TOOLTIP_TAN": "Ist der Tangens von en Winkel.", - "MATH_TRIG_TOOLTIP_ASIN": "Ist der Arcussinus von en Ingäbweart.", - "MATH_TRIG_TOOLTIP_ACOS": "Ist der Arcuscosinus von en Ingabweart.", - "MATH_TRIG_TOOLTIP_ATAN": "Ist der Arcustangens von en Ingäbweart.", - "MATH_CONSTANT_HELPURL": "https://hrx.wikipedia.org/wiki/Mathematische_Konstante", - "MATH_CONSTANT_TOOLTIP": "Mathematische Konstante wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich).", - "MATH_IS_EVEN": "ist grood", - "MATH_IS_ODD": "ist ungrood", - "MATH_IS_PRIME": "ist en Primenzoohl", - "MATH_IS_WHOLE": "ganze Zoohl", - "MATH_IS_POSITIVE": "ist positiv", - "MATH_IS_NEGATIVE": "ist negativ", - "MATH_IS_DIVISIBLE_BY": "ist telbar/kann getelt sin doorrich", - "MATH_IS_TOOLTIP": "Üwerprüft ob en Zoohl grood, ungrood, en Primenzoohl, ganzzoohlich, positiv, negativ orrer doorrich en zwooite Zoohl telbar ist. Gebt woahr (true) orrer falsch (false) zurück.", - "MATH_CHANGE_HELPURL": "https://hrx.wikipedia.org/wiki/Inkrement_und_Dekrement", - "MATH_CHANGE_TITLE": "mach höcher / erhöhe %1 um %2", - "MATH_CHANGE_TOOLTIP": "Addiert en Weart zur Variable \"%1\" hinzu.", - "MATH_ROUND_HELPURL": "https://hrx.wikipedia.org/wiki/Runden", - "MATH_ROUND_TOOLTIP": "En Zoohl uff orrer ab runde.", - "MATH_ROUND_OPERATOR_ROUND": "runde", - "MATH_ROUND_OPERATOR_ROUNDUP": "uff runde", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "ab runde", - "MATH_ONLIST_OPERATOR_SUM": "Summe von en List", - "MATH_ONLIST_TOOLTIP_SUM": "Ist die Summ aller Wearte in en List.", - "MATH_ONLIST_OPERATOR_MIN": "Minimalweart von en List", - "MATH_ONLIST_TOOLTIP_MIN": "Ist der klenste Weart in en List.", - "MATH_ONLIST_OPERATOR_MAX": "Maximalweart en List", - "MATH_ONLIST_TOOLTIP_MAX": "Ist der grösste Weart in en List.", - "MATH_ONLIST_OPERATOR_AVERAGE": "Mittelweart en List", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Ist der Doorrichschnittsweart von aller Wearte in en List.", - "MATH_ONLIST_OPERATOR_MEDIAN": "Median von en List", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Ist der Zentralweart von aller Wearte in en List.", - "MATH_ONLIST_OPERATOR_MODE": "Restweart von en List", - "MATH_ONLIST_TOOLTIP_MODE": "Findt den am häifichste voarkommend Weart in en List. Falls ken Weart öftersch voarkomme als all annre, weard die originale List zurückgeche", - "MATH_ONLIST_OPERATOR_STD_DEV": "Standart/Padrong Abweichung von en List", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Ist die standartiesierte/padronisierte Standartabweichung/Padrongabweichung von aller Wearte in der List", - "MATH_ONLIST_OPERATOR_RANDOM": "Zufallsweart von en List", - "MATH_ONLIST_TOOLTIP_RANDOM": "Geb en Zufallsweart aus der List zurück.", - "MATH_MODULO_HELPURL": "https://hrx.wikipedia.org/wiki/Modulo", - "MATH_MODULO_TITLE": "Rest von %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Der Rest noh en Division.", - "MATH_CONSTRAIN_TITLE": "begrenze %1 von %2 bis %3", - "MATH_CONSTRAIN_TOOLTIP": "Begrenzt den Weartebereich mittels von / bis Wearte. (inklusiv)", - "MATH_RANDOM_INT_HELPURL": "https://hrx.wikipedia.org/wiki/Zufallszahlen", - "MATH_RANDOM_INT_TITLE": "ganzoohlicher Zufallswearte zwischich %1 bis %2", - "MATH_RANDOM_INT_TOOLTIP": "Generier/erzeich en ganzähliche Zufallsweart zwischich zwooi Wearte (inklusiv).", - "MATH_RANDOM_FLOAT_HELPURL": "https://hex.wikipedia.org/wiki/Zufallszoohle", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Zufallszoohl (0.0 -1.0)", - "MATH_RANDOM_FLOAT_TOOLTIP": "Generier/erzeich en Zufallszoohl zwischich 0.0 (inklusiv) und 1.0 (exklusiv).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)https://hrx.wikipedia.org/wiki/Zeichenkette", - "TEXT_TEXT_TOOLTIP": "En Buchstoob, Text orrer Satz.", - "TEXT_JOIN_TITLE_CREATEWITH": "Erstell Text aus", - "TEXT_JOIN_TOOLTIP": "Erstellt en Text doorrich das verbinne von mehre Textelemente.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "verbinne", - "TEXT_CREATE_JOIN_TOOLTIP": "Hinzufüche, entfernne und sortiere von Elemente.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "En Element zum Text hinzufüche.", - "TEXT_APPEND_TO": "An", - "TEXT_APPEND_APPENDTEXT": "Text oonhänge", - "TEXT_APPEND_TOOLTIP": "Text an die Variable \"%1\" oonhänge.", - "TEXT_LENGTH_TITLE": "läng %1", - "TEXT_LENGTH_TOOLTIP": "Die Oonzoohl von Zeiche in enem Text. (inkl. Leerzeiche)", - "TEXT_ISEMPTY_TITLE": "%1 ist leer?", - "TEXT_ISEMPTY_TOOLTIP": "Ist woahr (true), wenn der Text leer ist.", - "TEXT_INDEXOF_TOOLTIP": "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer 0 zurück.", - "TEXT_INDEXOF_INPUT_INTEXT": "im Text", - "TEXT_INDEXOF_OPERATOR_FIRST": "Such der Begriff sein earstes Voarkommniss", - "TEXT_INDEXOF_OPERATOR_LAST": "Suche der Begriff sein letztes Vorkommniss.", - "TEXT_CHARAT_INPUT_INTEXT": "in Text", - "TEXT_CHARAT_FROM_START": "hol Buchstoob #", - "TEXT_CHARAT_FROM_END": "hol Buchstoob # von End", - "TEXT_CHARAT_FIRST": "hol earschte Buchstoob", - "TEXT_CHARAT_LAST": "hol letztes Wort", - "TEXT_CHARAT_RANDOM": "hol zufälliches Buchstoob", - "TEXT_CHARAT_TOOLTIP": "Extrahiear en Buchstoob von en spezifizierte Position.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Schickt en bestimmstes Tel von dem Text retuar.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in Text", - "TEXT_GET_SUBSTRING_START_FROM_START": "hol substring Buchstoob #te", - "TEXT_GET_SUBSTRING_START_FROM_END": "hol #te Buchstoob von hinne", - "TEXT_GET_SUBSTRING_START_FIRST": "earschte Buchstoob", - "TEXT_GET_SUBSTRING_END_FROM_START": "bis Buchstoob #te", - "TEXT_GET_SUBSTRING_END_FROM_END": "bis #te Buchstoob von hinne", - "TEXT_GET_SUBSTRING_END_LAST": "bis letzte Buchstoob", - "TEXT_CHANGECASE_TOOLTIP": "Wandelt Schreibweise von Texte um, in Grossbuchstoobe, Klenbuchstoobe orrer den earste Buchstoob von jedes Wort gross und die annre klen.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "umwandle in GROSSBUCHSTOOBE", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "umwandle in klenbuchstoobe", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "umwandle in Wörter", - "TEXT_TRIM_TOOLTIP": "Entfernt Leerzeiche vom Oonfang und / orrer End von en Text.", - "TEXT_TRIM_OPERATOR_BOTH": "entfern Leerzeiche von Oonfang und End Seite", - "TEXT_TRIM_OPERATOR_LEFT": "entferne Leerzeiche von Oonfang Seite", - "TEXT_TRIM_OPERATOR_RIGHT": "entferne Leerzeiche von End Seite von", - "TEXT_PRINT_TITLE": "Ausgäb %1", - "TEXT_PRINT_TOOLTIP": "Geb den Inhalt von en Variable aus.", - "TEXT_PROMPT_TYPE_TEXT": "Frocht noh Text mit Hinweis", - "TEXT_PROMPT_TYPE_NUMBER": "Frächt noh Zoohl mit Hinweis", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Frocht den Benutzer noh en Zoohl.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Frocht den Benutzer noh enem Text.", - "LISTS_CREATE_EMPTY_TITLE": "Generier/erzeich en leear List", - "LISTS_CREATE_EMPTY_TOOLTIP": "Generier/erzeich en leear List ohne Inhalt.", - "LISTS_CREATE_WITH_TOOLTIP": "Generier/erzeich en List mit konfigurierte Elemente.", - "LISTS_CREATE_WITH_INPUT_WITH": "Erzeich List mit", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "List", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Hinzufüche, entferne und sortiere von Elemente.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "En Element zur List hinzufüche.", - "LISTS_REPEAT_TOOLTIP": "Erzeicht en List mit en variable Oonzoohl von Elemente", - "LISTS_REPEAT_TITLE": "Erzich List mit Element %1 wiederhol das %2 mol", - "LISTS_LENGTH_TITLE": "länge %1", - "LISTS_LENGTH_TOOLTIP": "Die Oonzoohl von Elemente in der List.", - "LISTS_ISEMPTY_TITLE": "%1 ist leear?", - "LISTS_ISEMPTY_TOOLTIP": "Ist woahr (true), wenn die List leear ist.", - "LISTS_INLIST": "in der List", - "LISTS_INDEX_OF_FIRST": "Such earstes Voarkommniss", - "LISTS_INDEX_OF_LAST": "Such letztes Voarkommniss", - "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (index) von en Element in der List Gebt 0 zurück wenn nixs gefunn woard.", - "LISTS_GET_INDEX_GET": "Nehm", - "LISTS_GET_INDEX_GET_REMOVE": "Nehm und entfern", - "LISTS_GET_INDEX_REMOVE": "Entfern", - "LISTS_GET_INDEX_FROM_END": "#te von hinne", - "LISTS_GET_INDEX_FIRST": "earste", - "LISTS_GET_INDEX_LAST": "letzte", - "LISTS_GET_INDEX_RANDOM": "zufälliches", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Extrahiert das #1te Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Extrahiert das #1te Element der List sei End.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Extrahiert das earste Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Extrahiert das letzte Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Extrahiert en zufälliches Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Extrahiert und entfernt das #1te Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Extrahiert und entfernt das #1te Element der List sei End.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Extrahiert und entfernt das earste Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Extrahiert und entfernt das letzte Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Extrahiert und entfernt en zufälliches Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Entfernt das #1te Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Entfernt das #1te Element der List sei End.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Entfernt das earste Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Entfernt das letzte Element von der List.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Entfernt en zufälliches Element von der List.", - "LISTS_SET_INDEX_SET": "setz", - "LISTS_SET_INDEX_INSERT": "tue ren setz an", - "LISTS_SET_INDEX_INPUT_TO": "uff", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setzt das Element zu en definierte Stell in en List. #1 ist das earschte Element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setzt das Element zu en definierte Position an en List. #1 ist das letzte Element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Sets the first item in a list.Setzt das earschte Element an en list.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setzt das letzte Element an en List.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt en zufälliches Element an en List.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Tut das Element ren setze an en definierte Position an en List. #1 ist das earschte Element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Tut das Element ren setze an en definierte Position an en List. #1 ist das letzte Element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Tut das Element an en Oonfang von en List ren setze.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Oonhängt das Element zu en List sei End.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Tut das Element zufällich an en List ren setze.", - "LISTS_GET_SUBLIST_START_FROM_START": "hol Unnerlist von #", - "LISTS_GET_SUBLIST_START_FROM_END": "hol Unnerliste von # vom End", - "LISTS_GET_SUBLIST_START_FIRST": "hol Unnerliste vom Earste", - "LISTS_GET_SUBLIST_END_FROM_START": "zu #", - "LISTS_GET_SUBLIST_END_FROM_END": "zu # vom End", - "LISTS_GET_SUBLIST_END_LAST": "zum Letzte", - "LISTS_GET_SUBLIST_TOOLTIP": "Generiert en Kopie von en definierte Tel von en List.", - "VARIABLES_GET_TOOLTIP": "Gebt der Variable sein Weart zurück.", - "VARIABLES_GET_CREATE_SET": "Generier/erzeiche \"Schreibe %1\"", - "VARIABLES_SET": "Schreib %1 zu %2", - "VARIABLES_SET_TOOLTIP": "Setzt en Variable sei Weart.", - "VARIABLES_SET_CREATE_GET": "Generier/erzeich \"Lese %1\"", - "PROCEDURES_DEFNORETURN_TITLE": "zu", - "PROCEDURES_DEFNORETURN_PROCEDURE": "Funktionsblock", - "PROCEDURES_BEFORE_PARAMS": "mit:", - "PROCEDURES_CALL_BEFORE_PARAMS": "mit:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "En Funktionsblock ohne Rückgäbweart.", - "PROCEDURES_DEFRETURN_RETURN": "geb zurück", - "PROCEDURES_DEFRETURN_TOOLTIP": "En Funktionsblock mit Rückgäbweart.", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Warnung: die Funktionsblock hot doppelt Parameter.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Ruf en Funktionsblock ohne Rückgäweart uff.", - "PROCEDURES_CALLRETURN_HELPURL": "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Ruf en Funktionsblock mit Rückgäbweart uff.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "Parameter", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Variable:", - "PROCEDURES_MUTATORARG_TITLE": "Markiear Funktionsblock", - "PROCEDURES_MUTATORARG_TOOLTIP": "Generier/erzeich \"Uffruf %1\"", - "PROCEDURES_HIGHLIGHT_DEF": "Markiear Funktionsblock", - "PROCEDURES_CREATE_DO": "Generier/erzeich \"Uffruf %1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Wenn der earste Weart woahr (true) ist, Geb den zwooite Weart zurück.", - "PROCEDURES_IFRETURN_WARNING": "Warnung: Der Block därref nuar innich en Funktionsblock genutzt sin." -} diff --git a/msg/json/hu.json b/msg/json/hu.json deleted file mode 100644 index 01c400b22a..0000000000 --- a/msg/json/hu.json +++ /dev/null @@ -1,320 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Espertus", - "Takács Viktor László", - "Dj", - "Grin", - "ViDam", - "Csega", - "Fitoschido", - "Lajthabalazs", - "Tacsipacsi", - "Rodrigo" - ] - }, - "VARIABLES_DEFAULT_NAME": "változó", - "TODAY": "Ma", - "DUPLICATE_BLOCK": "Másolat", - "ADD_COMMENT": "Megjegyzés hozzáadása", - "REMOVE_COMMENT": "Megjegyzés törlése", - "EXTERNAL_INPUTS": "Külső kapcsolatok", - "INLINE_INPUTS": "Belső kapcsolatok", - "DELETE_BLOCK": "Blokk törlése", - "DELETE_X_BLOCKS": "%1 blokk törlése", - "DELETE_ALL_BLOCKS": "Az összes %1 blokk törlése?", - "CLEAN_UP": "Blokkok kiürítése", - "COLLAPSE_BLOCK": "Blokk összecsukása", - "COLLAPSE_ALL": "Blokkok összecsukása", - "EXPAND_BLOCK": "Blokk kibontása", - "EXPAND_ALL": "Blokkok kibontása", - "DISABLE_BLOCK": "Blokk letiltása", - "ENABLE_BLOCK": "Blokk engedélyezése", - "HELP": "Súgó", - "CHAT": "Ebben a mezőben tudsz a közreműködőkkel beszélgetni!", - "AUTH": "Kérjük, engedélyezd az alkalmazásnak munkád elmentését és megosztását.", - "ME": "Én", - "CHANGE_VALUE_TITLE": "Érték módosítása:", - "NEW_VARIABLE": "Új változó...", - "NEW_VARIABLE_TITLE": "Az új változó neve:", - "RENAME_VARIABLE": "Változó átnevezése...", - "RENAME_VARIABLE_TITLE": "Minden \"%1\" változó átnevezése erre:", - "COLOUR_PICKER_HELPURL": "https://hu.wikipedia.org/wiki/Szín", - "COLOUR_PICKER_TOOLTIP": "Válassz színt a palettáról.", - "COLOUR_RANDOM_TITLE": "véletlen szín", - "COLOUR_RANDOM_TOOLTIP": "Véletlenszerűen kiválasztott szín.", - "COLOUR_RGB_TITLE": "Szín", - "COLOUR_RGB_RED": "vörös", - "COLOUR_RGB_GREEN": "zöld", - "COLOUR_RGB_BLUE": "kék", - "COLOUR_RGB_TOOLTIP": "Szín előállítása a megadott vörös, zöld, és kék értékekkel. Minden értéknek 0 és 100 közé kell esnie.", - "COLOUR_BLEND_TITLE": "színkeverés", - "COLOUR_BLEND_COLOUR1": "szín 1", - "COLOUR_BLEND_COLOUR2": "szín 2", - "COLOUR_BLEND_RATIO": "arány", - "COLOUR_BLEND_TOOLTIP": "Két színt kever össze a megadott arányban (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://hu.wikipedia.org/wiki/Ciklus_(programoz%C3%A1s)#Sz.C3.A1ml.C3.A1l.C3.B3s_.28FOR.29_ciklus", - "CONTROLS_REPEAT_TITLE": "ismételd %1 alkalommal", - "CONTROLS_REPEAT_INPUT_DO": "", - "CONTROLS_REPEAT_TOOLTIP": "Megadott kódrészlet ismételt végrehajtása.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ismételd amíg", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ismételd amíg nem", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Amíg a feltétel igaz, végrehajtja az utasításokat.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Amíg a feltétel hamis, végrehajtja az utasításokat.", - "CONTROLS_FOR_TOOLTIP": "A(z) '%1' változó felveszi a kezdőérték és a végérték közötti értékeket a meghatározott lépésközzel. Eközben a meghatározott blokkokat hajtja végre.", - "CONTROLS_FOR_TITLE": "számolj %1 értékével %2 és %3 között %4 lépésközzel", - "CONTROLS_FOREACH_TITLE": "minden %1 elemre a %2 listában", - "CONTROLS_FOREACH_TOOLTIP": "A '%1' változó minden lépésben megkapja a lista adott elemének értékét, és végrehajt vele néhány utasítást.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "befejezi az ismétlést", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "folytatja a következővel", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Megszakítja az utasítást tartalmazó ciklust.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Kihagyja a ciklus további részét, és elölről kezdi a következő elemmel.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Figyelem: Ez a blokk csak cikluson belül használható.", - "CONTROLS_IF_TOOLTIP_1": "Ha a kifejezés igaz, akkor végrehajtja az utasításokat.", - "CONTROLS_IF_TOOLTIP_2": "Ha a kifejezés igaz, akkor végrehajtja az első utasításblokkot. Különben a második utasításblokk kerül végrehajtásra.", - "CONTROLS_IF_TOOLTIP_3": "Ha az első kifejezés igaz, akkor végrehajtja az első utasításblokkot. Különben, ha a második kifejezés igaz, akkor végrehajtja a második utasítás blokkot.", - "CONTROLS_IF_TOOLTIP_4": "Ha az első kifejezés igaz, akkor végrehajtjuk az első utasítás blokkot. Ha a második kifejezés igaz, akkor végrehajtjuk a második utasítás blokkot. Amennyiben egyik kifejezés sem igaz, akkor az utolsó utasítás blokk kerül végrehajtásra.", - "CONTROLS_IF_MSG_IF": "ha", - "CONTROLS_IF_MSG_ELSEIF": "különben ha", - "CONTROLS_IF_MSG_ELSE": "különben", - "CONTROLS_IF_IF_TOOLTIP": "A ha blokk testreszabásához bővítsd, töröld vagy rendezd át a részeit.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Feltétel hozzáadása a ha blokkhoz.", - "CONTROLS_IF_ELSE_TOOLTIP": "Végső feltétel hozzáadása a ha blokkhoz.", - "LOGIC_COMPARE_HELPURL": "https://hu.wikipedia.org/wiki/Egyenl%C5%91tlens%C3%A9g", - "LOGIC_COMPARE_TOOLTIP_EQ": "Igaz, ha a kifejezés két oldala egyenlő.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Igaz, ha a kifejezés két oldala nem egyenlő..", - "LOGIC_COMPARE_TOOLTIP_LT": "Igaz, ha a bal oldali kifejezés kisebb, mint a jobb oldali.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Igaz, ha a bal oldali kifejezés kisebb vagy egyenlő, mint a jobb oldali.", - "LOGIC_COMPARE_TOOLTIP_GT": "Igaz, ha a bal oldali kifejezés nagyobb, mint a jobb oldali.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Igaz, ha a bal oldali kifejezés nagyobb vagy egyenlő, mint a jobb oldali.", - "LOGIC_OPERATION_TOOLTIP_AND": "Igaz, ha mindkét kifejezés igaz.", - "LOGIC_OPERATION_AND": "és", - "LOGIC_OPERATION_TOOLTIP_OR": "Igaz, ha legalább az egyik kifejezés igaz.", - "LOGIC_OPERATION_OR": "vagy", - "LOGIC_NEGATE_TITLE": "nem %1", - "LOGIC_NEGATE_TOOLTIP": "Igaz, ha a kifejezés hamis. Hamis, ha a kifejezés igaz.", - "LOGIC_BOOLEAN_TRUE": "igaz", - "LOGIC_BOOLEAN_FALSE": "hamis", - "LOGIC_BOOLEAN_TOOLTIP": "Igaz, vagy hamis érték", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "null érték.", - "LOGIC_TERNARY_CONDITION": "vizsgáld meg:", - "LOGIC_TERNARY_IF_TRUE": "érték, ha igaz:", - "LOGIC_TERNARY_IF_FALSE": "érték, ha hamis:", - "LOGIC_TERNARY_TOOLTIP": "Kiértékeli a megvizsgálandó kifejezést. Ha a kifejezés igaz, visszatér az \"érték, ha igaz\" értékkel, különben az \"érték, ha hamis\" értékkel.", - "MATH_NUMBER_HELPURL": "https://hu.wikipedia.org/wiki/Sz%C3%A1m", - "MATH_NUMBER_TOOLTIP": "Egy szám.", - "MATH_ARITHMETIC_HELPURL": "https://hu.wikipedia.org/wiki/Matematikai_m%C5%B1velet", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Két szám összege.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Két szám különbsége.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Két szám szorzata.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Két szám hányadosa.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Az első számnak a második számmal megegyező hatványa.", - "MATH_SINGLE_HELPURL": "https://hu.wikipedia.org/wiki/Gy%C3%B6kvon%C3%A1s", - "MATH_SINGLE_OP_ROOT": "négyzetgyök", - "MATH_SINGLE_TOOLTIP_ROOT": "A szám négyzetgyöke.", - "MATH_SINGLE_OP_ABSOLUTE": "abszolútérték", - "MATH_SINGLE_TOOLTIP_ABS": "A szám abszolútértéke.", - "MATH_SINGLE_TOOLTIP_NEG": "A szám -1 szerese.", - "MATH_SINGLE_TOOLTIP_LN": "A szám természetes alapú logaritmusa.", - "MATH_SINGLE_TOOLTIP_LOG10": "A szám 10-es alapú logaritmusa.", - "MATH_SINGLE_TOOLTIP_EXP": "Az e megadott számú hatványa.", - "MATH_SINGLE_TOOLTIP_POW10": "A 10 megadott számú hatványa.", - "MATH_TRIG_HELPURL": "https://hu.wikipedia.org/wiki/Sz%C3%B6gf%C3%BCggv%C3%A9nyek", - "MATH_TRIG_TOOLTIP_SIN": "A fokban megadott szög szinusz értéke.", - "MATH_TRIG_TOOLTIP_COS": "A fokban megadott szög koszinusz értéke.", - "MATH_TRIG_TOOLTIP_TAN": "A fokban megadott szög tangens értéke.", - "MATH_TRIG_TOOLTIP_ASIN": "A fokban megadott szög arkusz szinusz értéke.", - "MATH_TRIG_TOOLTIP_ACOS": "A fokban megadott szög arkusz koszinusz értéke.", - "MATH_TRIG_TOOLTIP_ATAN": "A fokban megadott szög arkusz tangens értéke.", - "MATH_CONSTANT_HELPURL": "https://hu.wikipedia.org/wiki/Matematikai_konstans", - "MATH_CONSTANT_TOOLTIP": "Ismert matematikai konstans: π (3.141…), e (2.718…), φ (1.618…), gyök(2) (1.414…), gyök(½) (0.707…), vagy ∞ (végtelen).", - "MATH_IS_EVEN": "páros", - "MATH_IS_ODD": "páratlan", - "MATH_IS_PRIME": "prím", - "MATH_IS_WHOLE": "egész", - "MATH_IS_POSITIVE": "pozitív", - "MATH_IS_NEGATIVE": "negatív", - "MATH_IS_DIVISIBLE_BY": "-nek osztója", - "MATH_IS_TOOLTIP": "Ellenőrzi, hogy a szám páros, páratlan, prím, egész, pozitív vagy negatív-e, illetve osztható-e a másodikkal. Igaz, vagy hamis értéket ad eredményül.", - "MATH_CHANGE_HELPURL": "https://hu.wikipedia.org/wiki/JavaScript#Aritmetikai_oper.C3.A1torok", - "MATH_CHANGE_TITLE": "növeld %1 értékét %2 -vel", - "MATH_CHANGE_TOOLTIP": "A \"%1\" változó értékének növelése egy számmal.", - "MATH_ROUND_HELPURL": "https://hu.wikipedia.org/wiki/Eg%C3%A9szr%C3%A9sz#Kerek.C3.ADt.C3.A9s", - "MATH_ROUND_TOOLTIP": "Egy szám kerekítése felfelé vagy lefelé.", - "MATH_ROUND_OPERATOR_ROUND": "kerekítsd", - "MATH_ROUND_OPERATOR_ROUNDUP": "kerekítsd felfelé", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "kerekítsd lefelé", - "MATH_ONLIST_OPERATOR_SUM": "lista elemeinek összege", - "MATH_ONLIST_TOOLTIP_SUM": "A lista elemeinek összegét adja eredményül.", - "MATH_ONLIST_OPERATOR_MIN": "lista legkisebb eleme", - "MATH_ONLIST_TOOLTIP_MIN": "A lista legkisebb elemét adja vissza.", - "MATH_ONLIST_OPERATOR_MAX": "lista legnagyobb eleme", - "MATH_ONLIST_TOOLTIP_MAX": "A lista legnagyobb elemét adja vissza.", - "MATH_ONLIST_OPERATOR_AVERAGE": "lista elemeinek átlaga", - "MATH_ONLIST_TOOLTIP_AVERAGE": "A lista elemeinek átlagát adja eredményül.", - "MATH_ONLIST_OPERATOR_MEDIAN": "lista mediánja", - "MATH_ONLIST_TOOLTIP_MEDIAN": "A lista elemeinek mediánját adja eredményül.", - "MATH_ONLIST_OPERATOR_MODE": "lista módusza", - "MATH_ONLIST_TOOLTIP_MODE": "A lista elemeinek móduszát adja eredményül.", - "MATH_ONLIST_OPERATOR_STD_DEV": "lista elemeinek szórása", - "MATH_ONLIST_TOOLTIP_STD_DEV": "A lista elemeinek szórását adja eredményül.", - "MATH_ONLIST_OPERATOR_RANDOM": "lista véletlen eleme", - "MATH_ONLIST_TOOLTIP_RANDOM": "A lista egy véletlen elemét adja eredményül.", - "MATH_MODULO_HELPURL": "https://hu.wikipedia.org/wiki/Eg%C3%A9szr%C3%A9sz#Als.C3.B3_eg.C3.A9szr.C3.A9sz", - "MATH_MODULO_TITLE": "%1 ÷ %2 maradéka", - "MATH_MODULO_TOOLTIP": "Az egész osztás maradékát adja eredméynül.", - "MATH_CONSTRAIN_TITLE": "korlátozd %1 -t %2 és %3 közé", - "MATH_CONSTRAIN_TOOLTIP": "Egy változó értékének korlátozása a megadott zárt intervallumra.", - "MATH_RANDOM_INT_HELPURL": "https://hu.wikipedia.org/wiki/V%C3%A9letlen", - "MATH_RANDOM_INT_TITLE": "véletlen egész szám %1 között %2", - "MATH_RANDOM_INT_TOOLTIP": "Véletlen egész szám a megadott zárt intervallumon belül.", - "MATH_RANDOM_FLOAT_HELPURL": "https://hu.wikipedia.org/wiki/V%C3%A9letlen", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "véletlen tört", - "MATH_RANDOM_FLOAT_TOOLTIP": "Véletlen tört érték 0.0 és 1.0 között.", - "TEXT_TEXT_HELPURL": "https://hu.wikipedia.org/wiki/String", - "TEXT_TEXT_TOOLTIP": "Egy betű, szó vagy szöveg egy sora.", - "TEXT_JOIN_TITLE_CREATEWITH": "fűzd össze", - "TEXT_JOIN_TOOLTIP": "Tetszőleges számú szövegrészletet fűz össze egybefüggő szöveggé.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "fűzd össze", - "TEXT_CREATE_JOIN_TOOLTIP": "Összefűzéssel, törléssel vagy rendezéssel kapcsolato sblokkok szöveg szerkesztéséhez.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Elem hozzáfűzése a szöveghez.", - "TEXT_APPEND_TO": "A", - "TEXT_APPEND_APPENDTEXT": "szövegéhez fűzd hozzá", - "TEXT_APPEND_TOOLTIP": "Szöveget fűz a \"%1\" változó értékéhez.", - "TEXT_LENGTH_TITLE": "%1 hossza", - "TEXT_LENGTH_TOOLTIP": "A megadott szöveg karaktereinek számát adja eredményül (beleértve a szóközöket).", - "TEXT_ISEMPTY_TITLE": "%1 üres", - "TEXT_ISEMPTY_TOOLTIP": "Igaz, ha a vizsgált szöveg hossza 0.", - "TEXT_INDEXOF_TOOLTIP": "A keresett szöveg első vagy utolsó előfordulásával tér vissza. 0 esetén a szövegrészlet nem található.", - "TEXT_INDEXOF_INPUT_INTEXT": "A(z)", - "TEXT_INDEXOF_OPERATOR_FIRST": "szövegben az első előfordulásának helye", - "TEXT_INDEXOF_OPERATOR_LAST": "szövegben az utolsó előfordulásának helye", - "TEXT_INDEXOF_TAIL": "szövegnek", - "TEXT_CHARAT_INPUT_INTEXT": "A", - "TEXT_CHARAT_FROM_START": "elölről", - "TEXT_CHARAT_FROM_END": "hátulról", - "TEXT_CHARAT_FIRST": "első", - "TEXT_CHARAT_LAST": "utolsó", - "TEXT_CHARAT_RANDOM": "véletlen", - "TEXT_CHARAT_TAIL": "karaktere", - "TEXT_CHARAT_TOOLTIP": "A szöveg egy megadott karakterét adja eredményül.", - "TEXT_GET_SUBSTRING_TOOLTIP": "A megadott szövegrészletet adja eredményül.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "a", - "TEXT_GET_SUBSTRING_START_FROM_START": "szövegben válaszd ki a(z)", - "TEXT_GET_SUBSTRING_START_FROM_END": "szövegben válaszd ki a hátulról a(z)", - "TEXT_GET_SUBSTRING_START_FIRST": "szövegben válaszd ki az első", - "TEXT_GET_SUBSTRING_END_FROM_START": "betűtől a(z)", - "TEXT_GET_SUBSTRING_END_FROM_END": "betűtől a hátulról számított", - "TEXT_GET_SUBSTRING_END_LAST": "betűtől az utolsó", - "TEXT_GET_SUBSTRING_TAIL": "betűig tartó betűsort", - "TEXT_CHANGECASE_TOOLTIP": "Return a copy of the text in a different case.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "NAGYBETŰS", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "kisbetűs", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Címként Formázott", - "TEXT_TRIM_TOOLTIP": "Levágja a megadott szöveg végeiről a szóközöket.", - "TEXT_TRIM_OPERATOR_BOTH": "szóközök levágása mindkét végéről", - "TEXT_TRIM_OPERATOR_LEFT": "szóközök levágása az elejéről", - "TEXT_TRIM_OPERATOR_RIGHT": "szóközök levágása a végéről", - "TEXT_PRINT_TITLE": "Üzenet %1", - "TEXT_PRINT_TOOLTIP": "Megejelníti a megadott kaakterláncot üzenetként a képernyőn.", - "TEXT_PROMPT_TYPE_TEXT": "Kérj be szöveget", - "TEXT_PROMPT_TYPE_NUMBER": "Kérj be számot", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Számot kér be a felhasználótól.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Szöveget kér be a felhasználótól.", - "LISTS_CREATE_EMPTY_TITLE": "üres lista", - "LISTS_CREATE_EMPTY_TOOLTIP": "Elemeket nem tartalmazó üres listát ad eredményül", - "LISTS_CREATE_WITH_TOOLTIP": "Listát készít a megadott elemekből.", - "LISTS_CREATE_WITH_INPUT_WITH": "Lista készítés, elemek:", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Add, remove, or reorder sections to reconfigure this list block.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Elem hozzáadása listához.", - "LISTS_REPEAT_TOOLTIP": "A megadtott elem felhasználásával n elemű listát készít", - "LISTS_REPEAT_TITLE": "Lista készítése %1 elemet %2 alkalommal hozzáadva", - "LISTS_LENGTH_TITLE": "%1 lista hossza", - "LISTS_LENGTH_TOOLTIP": "A lista elemszámát adja eredményül.", - "LISTS_ISEMPTY_TITLE": "%1 üres lista?", - "LISTS_ISEMPTY_TOOLTIP": "Az eredmény igaz, ha a lista nem tartalmaz elemeket.", - "LISTS_INLIST": "A(z)", - "LISTS_INDEX_OF_FIRST": "listában első előfordulásaː", - "LISTS_INDEX_OF_LAST": "listában utolsó előfordulásaː", - "LISTS_INDEX_OF_TOOLTIP": "A megadott elem első vagy utolsó előfordulásával tér vissza. 0-val tér vissza, ha nem talál ilyen elemet.", - "LISTS_GET_INDEX_GET": "listából értéke", - "LISTS_GET_INDEX_GET_REMOVE": "listából kivétele", - "LISTS_GET_INDEX_REMOVE": "listából törlése", - "LISTS_GET_INDEX_FROM_START": "az elejétől számított", - "LISTS_GET_INDEX_FROM_END": "a végétől számított", - "LISTS_GET_INDEX_FIRST": "az első", - "LISTS_GET_INDEX_LAST": "az utolsó", - "LISTS_GET_INDEX_RANDOM": "bármely", - "LISTS_GET_INDEX_TAIL": "elemnek", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "A lista megadott sorszámú elemét adja eredményül. 1 az első elemet jelenti.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "A lista megadott sorszámú elemét adja eredményül. 1 az utolsó elemet jelenti.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "A lista első elemét adja eredményül.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "A lista utolsó elemét adja eredményül.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "A lista véletlenszerűen választott elemét adja eredményül.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "A megadott sorszámú elem kivétele a listából 1 az első elemet jelenti.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "A megadott sorszámú elem kivétele a listából 1 az utolsó elemet jelenti.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Az első elem kivétele a listából.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Az utolsó elem kivétele a listából.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Véletlenszerűen választott elem kivétele a listából.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "A megadott sorszámú elem törlése a listából 1 az első elemet jelenti.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "A megadott sorszámú elem törlése a listából 1 az utolsó elemet jelenti.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Az első elem törlése a listából.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Az utolsó elem törlése a listából.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Véletlenszerűen választott elem törlése a listából.", - "LISTS_SET_INDEX_SET": "listába állítsd be", - "LISTS_SET_INDEX_INSERT": "listába szúrd be", - "LISTS_SET_INDEX_INPUT_TO": "elemkéntː", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "A megadott sorszámú elem cseréje a listában. 1 az első elemet jelenti.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "A megadott sorszámú elem cseréje a listában. 1 az utolsó elemet jelenti.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Az első elem cseréje a listában.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Az utolsó elem cseréje a listában.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Véletlenszerűen választott elem cseréje a listában.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Beszúrás a megadott sorszámú elem elé a listában. 1 az első elemet jelenti.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Beszúrás a megadott sorszámú elem elé a listában. 1 az utolsó elemet jelenti.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Beszúrás a lista elejére.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Beszúrás a lista végére.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Beszúrás véletlenszerűen választott elem elé a listában.", - "LISTS_GET_SUBLIST_START_FROM_START": "részlistája az elejétől számított", - "LISTS_GET_SUBLIST_START_FROM_END": "részlistája a végétől számított", - "LISTS_GET_SUBLIST_START_FIRST": "részlistája az első", - "LISTS_GET_SUBLIST_END_FROM_START": "és az elejétől számított", - "LISTS_GET_SUBLIST_END_FROM_END": "és a végétől számított", - "LISTS_GET_SUBLIST_END_LAST": "és az utolsó", - "LISTS_GET_SUBLIST_TAIL": "elem között", - "LISTS_GET_SUBLIST_TOOLTIP": "A lista adott részéről másolat.", - "LISTS_SPLIT_LIST_FROM_TEXT": "lista készítése szövegből", - "LISTS_SPLIT_TEXT_FROM_LIST": "sztring készítése listából", - "LISTS_SPLIT_WITH_DELIMITER": "határoló karakter", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Listát készít a határoló karaktereknél törve a szöveget.", - "LISTS_SPLIT_TOOLTIP_JOIN": "A lista elemeit összefűzi szöveggé a határoló karaktereket is felhasználva.", - "ORDINAL_NUMBER_SUFFIX": ".", - "VARIABLES_GET_TOOLTIP": "A változó értékét adja eredményül.", - "VARIABLES_GET_CREATE_SET": "Készíts \"%1=\"", - "VARIABLES_SET": "%1 %2", - "VARIABLES_SET_TOOLTIP": "A változónak adhatunk értéket.", - "VARIABLES_SET_CREATE_GET": "Készíts \"%1\"", - "PROCEDURES_DEFNORETURN_TITLE": "Eljárás", - "PROCEDURES_DEFNORETURN_PROCEDURE": "név", - "PROCEDURES_BEFORE_PARAMS": "paraméterlistaː", - "PROCEDURES_CALL_BEFORE_PARAMS": "paraméterlistaː", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Eljárás (nem ad vissza eredményt).", - "PROCEDURES_DEFRETURN_RETURN": "eredménye", - "PROCEDURES_DEFRETURN_TOOLTIP": "Függvény eredménnyel.", - "PROCEDURES_ALLOW_STATEMENTS": "utasítások engedélyezése", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Figyelem: Az eljárásban azonos elnevezésű paramétert adtál meg.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Végrehajtja az eljárást.", - "PROCEDURES_CALLRETURN_HELPURL": "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)", - "PROCEDURES_CALLRETURN_TOOLTIP": "Meghívja a függvényt.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "paraméterek", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Bemenetek hozzáadása, eltávolítása vagy átrendezése ehhez a függvényhez.", - "PROCEDURES_MUTATORARG_TITLE": "változó:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Bemenet hozzáadása a függvényhez.", - "PROCEDURES_HIGHLIGHT_DEF": "Függvénydefiníció kiemelése", - "PROCEDURES_CREATE_DO": "Create \"do %1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Ha az érték igaz, akkor visszatér a függvény értékével.", - "PROCEDURES_IFRETURN_WARNING": "Figyelem: Ez a blokk csak függvénydefiníción belül használható." -} diff --git a/msg/json/ia.json b/msg/json/ia.json deleted file mode 100644 index a3ac2ad6f9..0000000000 --- a/msg/json/ia.json +++ /dev/null @@ -1,292 +0,0 @@ -{ - "@metadata": { - "authors": [ - "McDutchie", - "Karmwiki" - ] - }, - "VARIABLES_DEFAULT_NAME": "cosa", - "TODAY": "Hodie", - "DUPLICATE_BLOCK": "Duplicar", - "ADD_COMMENT": "Adder commento", - "REMOVE_COMMENT": "Remover commento", - "EXTERNAL_INPUTS": "Entrata externe", - "INLINE_INPUTS": "Entrata interne", - "DELETE_BLOCK": "Deler bloco", - "DELETE_X_BLOCKS": "Deler %1 blocos", - "DELETE_ALL_BLOCKS": "Deler tote le %1 blocos?", - "CLEAN_UP": "Clarar le blocos", - "COLLAPSE_BLOCK": "Plicar bloco", - "COLLAPSE_ALL": "Plicar blocos", - "EXPAND_BLOCK": "Displicar bloco", - "EXPAND_ALL": "Displicar blocos", - "DISABLE_BLOCK": "Disactivar bloco", - "ENABLE_BLOCK": "Activar bloco", - "HELP": "Adjuta", - "CHAT": "Conversa con tu collaborator scribente in iste quadro!", - "AUTH": "Per favor autorisa iste application pro permitter de salveguardar tu travalio e pro permitter que tu lo divide con alteres.", - "ME": "Io", - "CHANGE_VALUE_TITLE": "Cambiar valor:", - "NEW_VARIABLE": "Nove variabile...", - "NEW_VARIABLE_TITLE": "Nomine del nove variabile:", - "RENAME_VARIABLE": "Renominar variabile...", - "RENAME_VARIABLE_TITLE": "Renominar tote le variabiles '%1' a:", - "COLOUR_PICKER_HELPURL": "https://ia.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Elige un color del paletta.", - "COLOUR_RANDOM_TITLE": "color aleatori", - "COLOUR_RANDOM_TOOLTIP": "Eliger un color al hasardo.", - "COLOUR_RGB_TITLE": "colorar con", - "COLOUR_RGB_RED": "rubie", - "COLOUR_RGB_GREEN": "verde", - "COLOUR_RGB_BLUE": "blau", - "COLOUR_RGB_TOOLTIP": "Crear un color con le quantitate specificate de rubie, verde e blau. Tote le valores debe esser inter 0 e 100.", - "COLOUR_BLEND_TITLE": "miscer", - "COLOUR_BLEND_COLOUR1": "color 1", - "COLOUR_BLEND_COLOUR2": "color 2", - "COLOUR_BLEND_RATIO": "ration", - "COLOUR_BLEND_TOOLTIP": "Misce duo colores con un ration specificate (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "repeter %1 vices", - "CONTROLS_REPEAT_INPUT_DO": "face", - "CONTROLS_REPEAT_TOOLTIP": "Exequer certe instructiones plure vices.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repeter durante que", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repeter usque a", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Durante que un valor es ver, exequer certe instructiones.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Durante que un valor es false, exequer certe instructiones.", - "CONTROLS_FOR_TOOLTIP": "Mitter in le variabile \"%1\" le valores ab le numero initial usque al numero final, con passos secundo le intervallo specificate, e exequer le blocos specificate.", - "CONTROLS_FOR_TITLE": "contar con %1 de %2 a %3 per %4", - "CONTROLS_FOREACH_TITLE": "pro cata elemento %1 in lista %2", - "CONTROLS_FOREACH_TOOLTIP": "Pro cata elemento in un lista, mitter lo in le variabile '%1' e exequer certe instructiones.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "escappar del bucla", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continuar con le proxime iteration del bucla", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Escappar del bucla continente.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Saltar le resto de iste bucla e continuar con le proxime iteration.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Attention: Iste bloco pote solmente esser usate in un bucla.", - "CONTROLS_IF_TOOLTIP_1": "Si un valor es ver, exequer certe instructiones.", - "CONTROLS_IF_TOOLTIP_2": "Si un valor es ver, exequer le prime bloco de instructiones. Si non, exequer le secunde bloco de instructiones.", - "CONTROLS_IF_TOOLTIP_3": "Si le prime valor es ver, exequer le prime bloco de instructiones. Si non, si le secunde valor es ver, exequer le secunde bloco de instructiones.", - "CONTROLS_IF_TOOLTIP_4": "Si le prime valor es ver, exequer le prime bloco de instructiones. Si non, si le secunde valor es ver, exequer le secunde bloco de instructiones. Si necun del valores es ver, exequer le ultime bloco de instructiones.", - "CONTROLS_IF_MSG_IF": "si", - "CONTROLS_IF_MSG_ELSEIF": "si non si", - "CONTROLS_IF_MSG_ELSE": "si non", - "CONTROLS_IF_IF_TOOLTIP": "Adde, remove o reordina sectiones pro reconfigurar iste bloco \"si\".", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Adder un condition al bloco \"si\".", - "CONTROLS_IF_ELSE_TOOLTIP": "Adder un condition final de reserva al bloco \"si\".", - "LOGIC_COMPARE_TOOLTIP_EQ": "Retornar ver si le duo entratas es equal.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Retornar ver si le duo entratas non es equal.", - "LOGIC_COMPARE_TOOLTIP_LT": "Retornar ver si le prime entrata es minor que le secunde.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Retornar ver si le prime entrata es minor que o equal al secunde.", - "LOGIC_COMPARE_TOOLTIP_GT": "Retornar ver si le prime entrata es major que le secunde.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Retornar ver si le prime entrata es major que o equal al secunde.", - "LOGIC_OPERATION_TOOLTIP_AND": "Retornar ver si ambe entratas es ver.", - "LOGIC_OPERATION_AND": "e", - "LOGIC_OPERATION_TOOLTIP_OR": "Retornar ver si al minus un del entratas es ver.", - "LOGIC_OPERATION_OR": "o", - "LOGIC_NEGATE_TITLE": "non %1", - "LOGIC_NEGATE_TOOLTIP": "Retornar ver si le entrata es false. Retornar false si le entrata es ver.", - "LOGIC_BOOLEAN_TRUE": "ver", - "LOGIC_BOOLEAN_FALSE": "false", - "LOGIC_BOOLEAN_TOOLTIP": "Retorna o ver o false.", - "LOGIC_NULL": "nulle", - "LOGIC_NULL_TOOLTIP": "Retorna nulle.", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "si ver", - "LOGIC_TERNARY_IF_FALSE": "si false", - "LOGIC_TERNARY_TOOLTIP": "Verificar le condition in 'test'. Si le condition es ver, retorna le valor de 'si ver'; si non, retorna le valor de 'si false'.", - "MATH_NUMBER_HELPURL": "https://ia.wikipedia.org/wiki/Numero", - "MATH_NUMBER_TOOLTIP": "Un numero.", - "MATH_ARITHMETIC_HELPURL": "https://ia.wikipedia.org/wiki/Arithmetica", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Retornar le summa del duo numeros.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Retornar le differentia del duo numeros.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Retornar le producto del duo numeros.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Retornar le quotiente del duo numeros.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Retornar le prime numero elevate al potentia del secunde numero.", - "MATH_SINGLE_HELPURL": "https://ia.wikipedia.org/wiki/Radice_quadrate", - "MATH_SINGLE_OP_ROOT": "radice quadrate", - "MATH_SINGLE_TOOLTIP_ROOT": "Retornar le radice quadrate de un numero.", - "MATH_SINGLE_OP_ABSOLUTE": "absolute", - "MATH_SINGLE_TOOLTIP_ABS": "Retornar le valor absolute de un numero.", - "MATH_SINGLE_TOOLTIP_NEG": "Retornar le negation de un numero.", - "MATH_SINGLE_TOOLTIP_LN": "Retornar le logarithmo natural de un numero.", - "MATH_SINGLE_TOOLTIP_LOG10": "Retornar le logarithmo in base 10 del numero.", - "MATH_SINGLE_TOOLTIP_EXP": "Retornar e elevate al potentia del numero.", - "MATH_SINGLE_TOOLTIP_POW10": "Retornar 10 elevate al potentia de un numero.", - "MATH_TRIG_TOOLTIP_SIN": "Retornar le sino de un grado (non radiano).", - "MATH_TRIG_TOOLTIP_COS": "Retornar le cosino de un grado (non radiano).", - "MATH_TRIG_TOOLTIP_TAN": "Retornar le tangente de un grado (non radiano).", - "MATH_TRIG_TOOLTIP_ASIN": "Retornar le arcosino de un numero.", - "MATH_TRIG_TOOLTIP_ACOS": "Retornar le arcocosino de un numero.", - "MATH_TRIG_TOOLTIP_ATAN": "Retornar le arcotangente de un numero.", - "MATH_CONSTANT_TOOLTIP": "Retornar un del constantes commun: π (3,141…), e (2,718…), φ (1,618…), sqrt(2) (1,414…), sqrt(½) (0,707…) o ∞ (infinite).", - "MATH_IS_EVEN": "es par", - "MATH_IS_ODD": "es impare", - "MATH_IS_PRIME": "es prime", - "MATH_IS_WHOLE": "es integre", - "MATH_IS_POSITIVE": "es positive", - "MATH_IS_NEGATIVE": "es negative", - "MATH_IS_DIVISIBLE_BY": "es divisibile per", - "MATH_IS_TOOLTIP": "Verificar si un numero es par, impare, prime, integre, positive, negative, o divisibile per un certe numero. Retorna ver o false.", - "MATH_CHANGE_TITLE": "cambiar %1 per %2", - "MATH_CHANGE_TOOLTIP": "Adder un numero al variabile '%1'.", - "MATH_ROUND_HELPURL": "https://ia.wikipedia.org/wiki/Rotundamento", - "MATH_ROUND_TOOLTIP": "Arrotundar un numero a supra o a infra.", - "MATH_ROUND_OPERATOR_ROUND": "arrotundar", - "MATH_ROUND_OPERATOR_ROUNDUP": "arrotundar a supra", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "arrotundar a infra", - "MATH_ONLIST_OPERATOR_SUM": "summa del lista", - "MATH_ONLIST_TOOLTIP_SUM": "Retornar le summa de tote le numeros in le lista.", - "MATH_ONLIST_OPERATOR_MIN": "minimo del lista", - "MATH_ONLIST_TOOLTIP_MIN": "Retornar le numero le plus parve in le lista.", - "MATH_ONLIST_OPERATOR_MAX": "maximo del lista", - "MATH_ONLIST_TOOLTIP_MAX": "Retornar le numero le plus grande in le lista.", - "MATH_ONLIST_OPERATOR_AVERAGE": "media del lista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Retornar le media arithmetic del valores numeric in le lista.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana del lista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Retornar le numero median del lista.", - "MATH_ONLIST_OPERATOR_MODE": "modas del lista", - "MATH_ONLIST_TOOLTIP_MODE": "Retornar un lista del elemento(s) le plus commun in le lista.", - "MATH_ONLIST_OPERATOR_STD_DEV": "deviation standard del lista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Retornar le deviation standard del lista.", - "MATH_ONLIST_OPERATOR_RANDOM": "elemento aleatori del lista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Retornar un elemento aleatori del lista.", - "MATH_MODULO_TITLE": "resto de %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Retornar le resto del division del duo numeros.", - "MATH_CONSTRAIN_TITLE": "limitar %1 inter %2 e %3", - "MATH_CONSTRAIN_TOOLTIP": "Limitar un numero a esser inter le limites specificate (incluse).", - "MATH_RANDOM_INT_TITLE": "numero integre aleatori inter %1 e %2", - "MATH_RANDOM_INT_TOOLTIP": "Retornar un numero integre aleatori inter le duo limites specificate, incluse.", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fraction aleatori", - "MATH_RANDOM_FLOAT_TOOLTIP": "Retornar un fraction aleatori inter 0.0 (incluse) e 1.0 (excluse).", - "TEXT_TEXT_TOOLTIP": "Un littera, parola o linea de texto.", - "TEXT_JOIN_TITLE_CREATEWITH": "crear texto con", - "TEXT_JOIN_TOOLTIP": "Crear un pecia de texto uniente un certe numero de elementos.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "unir", - "TEXT_CREATE_JOIN_TOOLTIP": "Adde, remove o reordina sectiones pro reconfigurar iste bloco de texto.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Adder un elemento al texto.", - "TEXT_APPEND_TO": "a", - "TEXT_APPEND_APPENDTEXT": "adjunger texto", - "TEXT_APPEND_TOOLTIP": "Adjunger un texto al variabile '%1'.", - "TEXT_LENGTH_TITLE": "longitude de %1", - "TEXT_LENGTH_TOOLTIP": "Retorna le numero de litteras (incluse spatios) in le texto fornite.", - "TEXT_ISEMPTY_TITLE": "%1 es vacue", - "TEXT_ISEMPTY_TOOLTIP": "Retorna ver si le texto fornite es vacue.", - "TEXT_INDEXOF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna 0 si le texto non es trovate.", - "TEXT_INDEXOF_INPUT_INTEXT": "in le texto", - "TEXT_INDEXOF_OPERATOR_FIRST": "cercar le prime occurrentia del texto", - "TEXT_INDEXOF_OPERATOR_LAST": "cercar le ultime occurrentia del texto", - "TEXT_CHARAT_INPUT_INTEXT": "in le texto", - "TEXT_CHARAT_FROM_START": "prender le littera №", - "TEXT_CHARAT_FROM_END": "prender ab le fin le littera №", - "TEXT_CHARAT_FIRST": "prender le prime littera", - "TEXT_CHARAT_LAST": "prender le ultime littera", - "TEXT_CHARAT_RANDOM": "prender un littera aleatori", - "TEXT_CHARAT_TOOLTIP": "Retorna le littera presente al position specificate.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Retorna le parte specificate del texto.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in le texto", - "TEXT_GET_SUBSTRING_START_FROM_START": "prender subcatena ab le littera №", - "TEXT_GET_SUBSTRING_START_FROM_END": "prender subcatena ab le fin ab le littera №", - "TEXT_GET_SUBSTRING_START_FIRST": "prender subcatena ab le prime littera", - "TEXT_GET_SUBSTRING_END_FROM_START": "usque al littera №", - "TEXT_GET_SUBSTRING_END_FROM_END": "ab le fin usque al littera №", - "TEXT_GET_SUBSTRING_END_LAST": "usque al ultime littera", - "TEXT_CHANGECASE_TOOLTIP": "Retornar un copia del texto con differente majusculas/minusculas.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "in MAJUSCULAS", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "in minusculas", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "con Initiales Majuscule", - "TEXT_TRIM_TOOLTIP": "Retornar un copia del texto con spatios eliminate de un extremitate o ambes.", - "TEXT_TRIM_OPERATOR_BOTH": "remover spatios de ambe lateres de", - "TEXT_TRIM_OPERATOR_LEFT": "remover spatios del sinistre latere de", - "TEXT_TRIM_OPERATOR_RIGHT": "remover spatios del dextre latere de", - "TEXT_PRINT_TITLE": "scriber %1", - "TEXT_PRINT_TOOLTIP": "Scriber le texto, numero o altere valor specificate.", - "TEXT_PROMPT_TYPE_TEXT": "peter un texto con le message", - "TEXT_PROMPT_TYPE_NUMBER": "peter un numero con le message", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Peter un numero al usator.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Peter un texto al usator.", - "LISTS_CREATE_EMPTY_TITLE": "crear un lista vacue", - "LISTS_CREATE_EMPTY_TOOLTIP": "Retorna un lista, de longitude 0, sin datos.", - "LISTS_CREATE_WITH_TOOLTIP": "Crear un lista con un numero qualcunque de elementos.", - "LISTS_CREATE_WITH_INPUT_WITH": "crear lista con", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Adde, remove o reordina sectiones pro reconfigurar iste bloco de listas.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Adder un elemento al lista.", - "LISTS_REPEAT_TOOLTIP": "Crea un lista que contine le valor fornite, repetite le numero specificate de vices.", - "LISTS_REPEAT_TITLE": "crear lista con elemento %1 repetite %2 vices", - "LISTS_LENGTH_TITLE": "longitude de %1", - "LISTS_LENGTH_TOOLTIP": "Retorna le longitude de un lista.", - "LISTS_ISEMPTY_TITLE": "%1 es vacue", - "LISTS_ISEMPTY_TOOLTIP": "Retorna ver si le lista es vacue.", - "LISTS_INLIST": "in lista", - "LISTS_INDEX_OF_FIRST": "cercar le prime occurrentia del elemento", - "LISTS_INDEX_OF_LAST": "cercar le ultime occurrentia del elemento", - "LISTS_INDEX_OF_TOOLTIP": "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna 0 si le texto non es trovate.", - "LISTS_GET_INDEX_GET": "prender", - "LISTS_GET_INDEX_GET_REMOVE": "prender e remover", - "LISTS_GET_INDEX_REMOVE": "remover", - "LISTS_GET_INDEX_FROM_END": "№ ab fin", - "LISTS_GET_INDEX_FIRST": "prime", - "LISTS_GET_INDEX_LAST": "ultime", - "LISTS_GET_INDEX_RANDOM": "aleatori", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Retorna le elemento presente al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Retorna le elemento presente al position specificate in un lista. № 1 es le ultime elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Retorna le prime elemento in un lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Retorna le ultime elemento in un lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Retorna un elemento aleatori in un lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Remove e retorna le elemento presente al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Remove e retorna le elemento presente al position specificate in un lista. № 1 es le ultime elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Remove e retorna le prime elemento in un lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Remove e retorna le ultime elemento in un lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Remove e retorna un elemento aleatori in un lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Remove le elemento presente al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Remove le elemento presente al position specificate in un lista. № 1 es le ultime elemento.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Remove le prime elemento in un lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Remove le ultime elemento in un lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Remove un elemento aleatori in un lista.", - "LISTS_SET_INDEX_SET": "mitter", - "LISTS_SET_INDEX_INSERT": "inserer in", - "LISTS_SET_INDEX_INPUT_TO": "a", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Defini le valor del elemento al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Defini le valor del elemento al position specificate in un lista. № 1 es le ultime elemento.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Defini le valor del prime elemento in un lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Defini le valor del ultime elemento in un lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Defini le valor de un elemento aleatori in un lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insere le elemento al position specificate in un lista. № 1 es le prime elemento.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insere le elemento al position specificate in un lista. № 1 es le ultime elemento.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insere le elemento al initio de un lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Adjunge le elemento al fin de un lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insere le elemento a un position aleatori in un lista.", - "LISTS_GET_SUBLIST_START_FROM_START": "prender sublista ab №", - "LISTS_GET_SUBLIST_START_FROM_END": "prender sublista ab le fin ab №", - "LISTS_GET_SUBLIST_START_FIRST": "prender sublista ab initio", - "LISTS_GET_SUBLIST_END_FROM_START": "usque al №", - "LISTS_GET_SUBLIST_END_FROM_END": "usque al № ab fin", - "LISTS_GET_SUBLIST_END_LAST": "usque al ultime", - "LISTS_GET_SUBLIST_TOOLTIP": "Crea un copia del parte specificate de un lista.", - "LISTS_SPLIT_LIST_FROM_TEXT": "Crear un lista per un texto", - "LISTS_SPLIT_TEXT_FROM_LIST": "crear un texto per un lista", - "LISTS_SPLIT_WITH_DELIMITER": "con delimitator", - "VARIABLES_GET_TOOLTIP": "Retorna le valor de iste variabile.", - "VARIABLES_GET_CREATE_SET": "Crea 'mitter %1'", - "VARIABLES_SET": "mitter %1 a %2", - "VARIABLES_SET_TOOLTIP": "Mitte iste variabile al valor del entrata.", - "VARIABLES_SET_CREATE_GET": "Crear 'prender %1'", - "PROCEDURES_DEFNORETURN_TITLE": "pro", - "PROCEDURES_DEFNORETURN_PROCEDURE": "facer qualcosa", - "PROCEDURES_BEFORE_PARAMS": "con:", - "PROCEDURES_CALL_BEFORE_PARAMS": "con:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Crea un function que non retorna un valor.", - "PROCEDURES_DEFRETURN_RETURN": "retornar", - "PROCEDURES_DEFRETURN_TOOLTIP": "Crea un function que retorna un valor.", - "PROCEDURES_ALLOW_STATEMENTS": "permitter declarationes", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Attention: Iste function ha parametros duplicate.", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Executar le function '%1' definite per le usator.", - "PROCEDURES_CALLRETURN_TOOLTIP": "Executar le function '%1' definite per le usator e usar su resultato.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "entratas", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Adder, remover o reordinar le entratas pro iste function.", - "PROCEDURES_MUTATORARG_TITLE": "nomine del entrata:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Adder un entrata al function.", - "PROCEDURES_HIGHLIGHT_DEF": "Accentuar le definition del function", - "PROCEDURES_CREATE_DO": "Crear '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Si un valor es ver, alora retornar un secunde valor.", - "PROCEDURES_IFRETURN_WARNING": "Attention: Iste bloco pote solmente esser usate in le definition de un function." -} diff --git a/msg/json/id.json b/msg/json/id.json deleted file mode 100644 index 998b0b9a8a..0000000000 --- a/msg/json/id.json +++ /dev/null @@ -1,323 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Kenrick95", - "아라", - "Mirws", - "Marwan Mohamad" - ] - }, - "VARIABLES_DEFAULT_NAME": "item", - "TODAY": "Hari ini", - "DUPLICATE_BLOCK": "Duplikat", - "ADD_COMMENT": "Tambahkan sebuah comment", - "REMOVE_COMMENT": "Hapus komentar", - "EXTERNAL_INPUTS": "Input-input eksternal", - "INLINE_INPUTS": "Input inline", - "DELETE_BLOCK": "Hapus Blok", - "DELETE_X_BLOCKS": "Hapus %1 Blok", - "COLLAPSE_BLOCK": "Ciutkan Blok", - "COLLAPSE_ALL": "Ciutkan Blok", - "EXPAND_BLOCK": "Kembangkan Blok", - "EXPAND_ALL": "Kembangkan blok-blok", - "DISABLE_BLOCK": "Nonaktifkan Blok", - "ENABLE_BLOCK": "Aktifkan Blok", - "HELP": "Bantuan", - "CHAT": "Chatting dengan kolaborator anda dengan mengetikkan di kotak ini!", - "AUTH": "Silakan mengotorisasi aplikasi ini untuk memungkinkan pekerjaan Anda dapat disimpan dan digunakan bersama.", - "ME": "Saya", - "CHANGE_VALUE_TITLE": "Ubah nilai:", - "NEW_VARIABLE": "Pembolehubah baru...", - "NEW_VARIABLE_TITLE": "Nama pembolehubah baru:", - "RENAME_VARIABLE": "namai ulang variabel...", - "RENAME_VARIABLE_TITLE": "Ubah nama semua variabel '%1' menjadi:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Pilih warna dari daftar warna.", - "COLOUR_RANDOM_TITLE": "Warna acak", - "COLOUR_RANDOM_TOOLTIP": "Pilih warna secara acak.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "Dengan warna", - "COLOUR_RGB_RED": "merah", - "COLOUR_RGB_GREEN": "hijau", - "COLOUR_RGB_BLUE": "biru", - "COLOUR_RGB_TOOLTIP": "Buatlah warna dengan jumlah yang ditentukan dari merah, hijau dan biru. Semua nilai harus antarai 0 sampai 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "Tertutup", - "COLOUR_BLEND_COLOUR1": "Warna 1", - "COLOUR_BLEND_COLOUR2": "Warna 2", - "COLOUR_BLEND_RATIO": "rasio", - "COLOUR_BLEND_TOOLTIP": "mencampur dua warna secara bersamaan dengan perbandingan (0.0-1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "ulangi %1 kali", - "CONTROLS_REPEAT_INPUT_DO": "kerjakan", - "CONTROLS_REPEAT_TOOLTIP": "Lakukan beberapa perintah beberapa kali.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Ulangi jika", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "Ulangi sampai", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Jika sementara nilai benar (true), maka lakukan beberapa perintah.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Jika sementara nilai tidak benar (false), maka lakukan beberapa perintah.", - "CONTROLS_FOR_TOOLTIP": "Menggunakan variabel \"%1\" dengan mengambil nilai dari batas awal hingga ke batas akhir, dengan interval tertentu, dan mengerjakan block tertentu.", - "CONTROLS_FOR_TITLE": "Cacah dengan %1 dari %2 ke %3 dengan step / penambahan %4", - "CONTROLS_FOREACH_TITLE": "untuk setiap item %1 di dalam list %2", - "CONTROLS_FOREACH_TOOLTIP": "Untuk tiap-tiap item di dalam list, tetapkan variabel '%1' ke dalam item, selanjutnya kerjakan beberapa statement.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Keluar dari perulangan", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "Lanjutkan dengan langkah penggulangan berikutnya", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Keluar sementara dari perulanggan.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Abaikan sisa dari loop ini, dan lanjutkan dengan iterasi berikutnya.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Peringatan: Blok ini hanya dapat digunakan dalam loop.", - "CONTROLS_IF_TOOLTIP_1": "jika nilainya benar maka kerjakan perintah berikutnya.", - "CONTROLS_IF_TOOLTIP_2": "jika nilainya benar, maka kerjakan blok perintah yang pertama. Jika tidak, kerjakan blok perintah yang kedua.", - "CONTROLS_IF_TOOLTIP_3": "Jika nilai pertama adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok pertama. Jika nilai kedua adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok kedua.", - "CONTROLS_IF_TOOLTIP_4": "Jika blok pertama adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok pertama. Atau jika blok kedua adalah benar (true), maka lakukan perintah-perintah yang berada didalam blok kedua.", - "CONTROLS_IF_MSG_IF": "Jika", - "CONTROLS_IF_MSG_ELSEIF": "else if", - "CONTROLS_IF_MSG_ELSE": "else", - "CONTROLS_IF_IF_TOOLTIP": "Menambahkan, menghapus, atau menyusun kembali bagian untuk mengkonfigurasi blok IF ini.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "tambahkan prasyarat ke dalam blok IF.", - "CONTROLS_IF_ELSE_TOOLTIP": "Terakhir, tambahkan tangkap-semua kondisi kedalam blok jika (if).", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Mengembalikan betul jika input kedua-duanya sama dengan satu sama lain.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Mengembalikan nilai benar (true) jika kedua input tidak sama satu dengan yang lain.", - "LOGIC_COMPARE_TOOLTIP_LT": "Mengembalikan nilai benar (true) jika input yang pertama lebih kecil dari input yang kedua.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Mengembalikan nilai benar (true) jika input yang pertama lebih kecil atau sama dengan input yang kedua .", - "LOGIC_COMPARE_TOOLTIP_GT": "Mengembalikan nilai benar (true) jika input yang pertama lebih besar dari input yang kedua.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Mengembalikan nilai benar (true) jika input yang pertama lebih besar dari atau sama dengan input yang kedua.", - "LOGIC_OPERATION_TOOLTIP_AND": "Kembalikan betul jika kedua-dua input adalah betul.", - "LOGIC_OPERATION_AND": "dan", - "LOGIC_OPERATION_TOOLTIP_OR": "Mengembalikan nilai benar (true) jika setidaknya salah satu masukan nilainya benar (true).", - "LOGIC_OPERATION_OR": "atau", - "LOGIC_NEGATE_TITLE": "bukan (not) %1", - "LOGIC_NEGATE_TOOLTIP": "Mengembalikan nilai benar (true) jika input false. Mengembalikan nilai salah (false) jika input true.", - "LOGIC_BOOLEAN_TRUE": "Benar", - "LOGIC_BOOLEAN_FALSE": "Salah", - "LOGIC_BOOLEAN_TOOLTIP": "Mengembalikan betul (true) atau salah (false).", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "mengembalikan kosong.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "jika benar (true)", - "LOGIC_TERNARY_IF_FALSE": "jika tidak benar (false)", - "LOGIC_TERNARY_TOOLTIP": "Periksa kondisi di \"test\". Jika kondisi benar (true), mengembalikan nilai \"jika benar\" ; Jik sebaliknya akan mengembalikan nilai \"jika salah\".", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Suatu angka.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://id.wikipedia.org/wiki/Aritmetika", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Kembalikan jumlah dari kedua angka.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Kembalikan selisih dari kedua angka.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Kembalikan perkalian dari kedua angka.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Kembalikan hasil bagi dari kedua angka.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Kembalikan angka pertama pangkat angka kedua.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "akar", - "MATH_SINGLE_TOOLTIP_ROOT": "Kembalikan akar dari angka.", - "MATH_SINGLE_OP_ABSOLUTE": "mutlak", - "MATH_SINGLE_TOOLTIP_ABS": "Kembalikan nilai absolut angka.", - "MATH_SINGLE_TOOLTIP_NEG": "Kembalikan penyangkalan terhadap angka.", - "MATH_SINGLE_TOOLTIP_LN": "Kembalikan logaritma natural dari angka.", - "MATH_SINGLE_TOOLTIP_LOG10": "Kembalikan dasar logaritma 10 dari angka.", - "MATH_SINGLE_TOOLTIP_EXP": "Kembalikan 10 pangkat angka.", - "MATH_SINGLE_TOOLTIP_POW10": "Kembalikan 10 pangkat angka.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Kembalikan sinus dari derajat (bukan radian).", - "MATH_TRIG_TOOLTIP_COS": "Kembalikan cos dari derajat (bukan radian).", - "MATH_TRIG_TOOLTIP_TAN": "Kembalikan tangen dari derajat (tidak radian).", - "MATH_TRIG_TOOLTIP_ASIN": "Kembalikan asin dari angka.", - "MATH_TRIG_TOOLTIP_ACOS": "Kembalikan acosine dari angka.", - "MATH_TRIG_TOOLTIP_ATAN": "Kembalikan atan dari angka.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Kembalikan salah satu konstanta: π (3,141…), e (2,718…), φ (1,618…), akar(2) (1,414…), akar(½) (0.707…), atau ∞ (tak terhingga).", - "MATH_IS_EVEN": "adalah bilangan genap", - "MATH_IS_ODD": "adalah bilangan ganjil", - "MATH_IS_PRIME": "adalah bilangan pokok", - "MATH_IS_WHOLE": "adalah bilangan bulat", - "MATH_IS_POSITIVE": "adalah bilangan positif", - "MATH_IS_NEGATIVE": "adalah bilangan negatif", - "MATH_IS_DIVISIBLE_BY": "dibagi oleh", - "MATH_IS_TOOLTIP": "Periksa apakah angka adalah bilangan genap, bilangan pokok, bilangan bulat, bilangan positif, bilangan negatif, atau apakan bisa dibagi oleh angka tertentu. Mengembalikan benar (true) atau salah (false).", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "ubah %1 oleh %2", - "MATH_CHANGE_TOOLTIP": "Tambahkan angka kedalam variabel '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Bulatkan suatu bilangan naik atau turun.", - "MATH_ROUND_OPERATOR_ROUND": "membulatkan", - "MATH_ROUND_OPERATOR_ROUNDUP": "mengumpulkan", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "membulatkan kebawah", - "MATH_ONLIST_OPERATOR_SUM": "jumlah dari list (daftar)", - "MATH_ONLIST_TOOLTIP_SUM": "Kembalikan jumlah dari seluruh bilangan dari list.", - "MATH_ONLIST_OPERATOR_MIN": "minimum dari list (daftar)", - "MATH_ONLIST_TOOLTIP_MIN": "Kembalikan angka terkecil dari list.", - "MATH_ONLIST_OPERATOR_MAX": "maximum dari list (daftar)", - "MATH_ONLIST_TOOLTIP_MAX": "Kembalikan angka terbesar dari list.", - "MATH_ONLIST_OPERATOR_AVERAGE": "rata-rata dari list (daftar)", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Kembalikan rata-rata (mean aritmetik) dari nilai numerik dari list (daftar).", - "MATH_ONLIST_OPERATOR_MEDIAN": "median dari list (daftar)", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Kembalikan median dari list.", - "MATH_ONLIST_OPERATOR_MODE": "mode-mode dari list (daftar)", - "MATH_ONLIST_TOOLTIP_MODE": "Kembalikan list berisi item-item yang paling umum dari dalam list.", - "MATH_ONLIST_OPERATOR_STD_DEV": "deviasi standar dari list (daftar)", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Kembalikan standard deviasi dari list.", - "MATH_ONLIST_OPERATOR_RANDOM": "item acak dari list (daftar)", - "MATH_ONLIST_TOOLTIP_RANDOM": "Kembalikan element acak dari list.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "sisa %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Kembalikan sisa dari pembagian ke dua angka.", - "MATH_CONSTRAIN_TITLE": "Batasi %1 rendah %2 tinggi %3", - "MATH_CONSTRAIN_TOOLTIP": "Batasi angka antara batas yang ditentukan (inklusif).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "acak bulat dari %1 sampai %2", - "MATH_RANDOM_INT_TOOLTIP": "Mengembalikan bilangan acak antara dua batas yang ditentukan, inklusif.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Nilai pecahan acak", - "MATH_RANDOM_FLOAT_TOOLTIP": "Mengembalikan nilai acak pecahan antara 0.0 (inklusif) dan 1.0 (ekslusif).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Huruf, kata atau baris teks.", - "TEXT_JOIN_TITLE_CREATEWITH": "Buat teks dengan", - "TEXT_JOIN_TOOLTIP": "Buat teks dengan cara gabungkan sejumlah item.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "join", - "TEXT_CREATE_JOIN_TOOLTIP": "Tambah, ambil, atau susun ulang teks blok.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Tambahkan suatu item ke dalam teks.", - "TEXT_APPEND_TO": "untuk", - "TEXT_APPEND_APPENDTEXT": "tambahkan teks", - "TEXT_APPEND_TOOLTIP": "Tambahkan beberapa teks ke variabel '%1'.", - "TEXT_LENGTH_TITLE": "panjang dari %1", - "TEXT_LENGTH_TOOLTIP": "Kembalikan sejumlah huruf (termasuk spasi) dari teks yang disediakan.", - "TEXT_ISEMPTY_TITLE": "%1 kosong", - "TEXT_ISEMPTY_TOOLTIP": "Kembalikan benar (true) jika teks yang disediakan kosong.", - "TEXT_INDEXOF_TOOLTIP": "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan 0 jika teks tidak ditemukan.", - "TEXT_INDEXOF_INPUT_INTEXT": "dalam teks", - "TEXT_INDEXOF_OPERATOR_FIRST": "temukan kejadian pertama dalam teks", - "TEXT_INDEXOF_OPERATOR_LAST": "temukan kejadian terakhir dalam teks", - "TEXT_CHARAT_INPUT_INTEXT": "dalam teks", - "TEXT_CHARAT_FROM_START": "ambil huruf ke #", - "TEXT_CHARAT_FROM_END": "ambil huruf nomor # dari belakang", - "TEXT_CHARAT_FIRST": "ambil huruf pertama", - "TEXT_CHARAT_LAST": "ambil huruf terakhir", - "TEXT_CHARAT_RANDOM": "ambil huruf secara acak", - "TEXT_CHARAT_TOOLTIP": "Kembalikan karakter dari posisi tertentu.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Mengembalikan spesifik bagian dari teks.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in teks", - "TEXT_GET_SUBSTRING_START_FROM_START": "ambil bagian teks (substring) dari huruf no #", - "TEXT_GET_SUBSTRING_START_FROM_END": "ambil bagian teks (substring) dari huruf ke # dari terakhir", - "TEXT_GET_SUBSTRING_START_FIRST": "ambil bagian teks (substring) dari huruf pertama", - "TEXT_GET_SUBSTRING_END_FROM_START": "pada huruf #", - "TEXT_GET_SUBSTRING_END_FROM_END": "pada huruf nomer # dari terakhir", - "TEXT_GET_SUBSTRING_END_LAST": "pada huruf terakhir", - "TEXT_CHANGECASE_TOOLTIP": "Kembalikan kopi dari text dengan kapitalisasi yang berbeda.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "menjadi huruf kapital", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "menjadi huruf kecil", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "menjadi huruf pertama kapital", - "TEXT_TRIM_TOOLTIP": "Kembali salinan teks dengan spasi dihapus dari satu atau kedua ujungnya.", - "TEXT_TRIM_OPERATOR_BOTH": "pangkas ruang dari kedua belah sisi", - "TEXT_TRIM_OPERATOR_LEFT": "pangkas ruang dari sisi kiri", - "TEXT_TRIM_OPERATOR_RIGHT": "pangkas ruang dari sisi kanan", - "TEXT_PRINT_TITLE": "cetak %1", - "TEXT_PRINT_TOOLTIP": "Cetak teks yant ditentukan, angka atau ninlai lainnya.", - "TEXT_PROMPT_TYPE_TEXT": "meminta teks dengan pesan", - "TEXT_PROMPT_TYPE_NUMBER": "Meminta angka dengan pesan", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Meminta pengguna untuk memberi sebuah angka.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Meminta pengguna untuk memberi beberapa teks.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "buat list kosong", - "LISTS_CREATE_EMPTY_TOOLTIP": "Mengembalikan daftar, dengan panjang 0, tidak berisi data", - "LISTS_CREATE_WITH_TOOLTIP": "Buat sebuah daftar (list) dengan sejumlah item.", - "LISTS_CREATE_WITH_INPUT_WITH": "buat daftar (list) dengan", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "list", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Tambahkan, hapus, atau susun ulang bagian untuk mengkonfigurasi blok LIST (daftar) ini.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Tambahkan sebuah item ke daftar (list).", - "LISTS_REPEAT_TOOLTIP": "Ciptakan daftar yang terdiri dari nilai yang diberikan diulang jumlah waktu yang ditentukan.", - "LISTS_REPEAT_TITLE": "membuat daftar dengan item %1 diulang %2 kali", - "LISTS_LENGTH_TITLE": "panjang dari %1", - "LISTS_LENGTH_TOOLTIP": "Mengembalikan panjang daftar.", - "LISTS_ISEMPTY_TITLE": "%1 kosong", - "LISTS_ISEMPTY_TOOLTIP": "Mengembalikan nilai benar (true) jika list kosong.", - "LISTS_INLIST": "dalam daftar", - "LISTS_INDEX_OF_FIRST": "cari kejadian pertama item", - "LISTS_INDEX_OF_LAST": "Cari kejadian terakhir item", - "LISTS_INDEX_OF_TOOLTIP": "Mengembalikan indeks dari kejadian pertama/terakhir item dalam daftar. Menghasilkan 0 jika teks tidak ditemukan.", - "LISTS_GET_INDEX_GET": "dapatkan", - "LISTS_GET_INDEX_GET_REMOVE": "dapatkan dan hapus", - "LISTS_GET_INDEX_REMOVE": "Hapus", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# dari akhir", - "LISTS_GET_INDEX_FIRST": "pertama", - "LISTS_GET_INDEX_LAST": "terakhir", - "LISTS_GET_INDEX_RANDOM": "acak", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Sisipkan item ke dalam posisi yang telah ditentukan didalam list (daftar). Item pertama adalah item terakhir (yg paling akhir).", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Sisipkan item ke dalam posisi yang telah ditentukan didalam list (daftar). Item pertama adalah item yang terakhir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Kembalikan item pertama dalam daftar (list).", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Mengembalikan item pertama dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Mengembalikan item acak dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Menghilangkan dan mengembalikan barang di posisi tertentu dalam list (daftar). #1 adalah item pertama.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Menghilangkan dan mengembalikan barang di posisi tertentu dalam list (daftar). #1 adalah item terakhir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Menghilangkan dan mengembalikan item pertama dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Menghilangkan dan mengembalikan item terakhir dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Menghilangkan dan mengembalikan barang dengan acak dalam list (daftar).", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Menghapus item dengan posisi tertentu dalam daftar. Item pertama adalah item yang terakhir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Menghapus item dengan posisi tertentu dalam daftar. Item pertama adalah item yang terakhir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Menghapus item pertama dalam daftar.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Menghapus item terakhir dalam daftar.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Menghapus sebuah item secara acak dalam list.", - "LISTS_SET_INDEX_SET": "tetapkan", - "LISTS_SET_INDEX_INSERT": "sisipkan di", - "LISTS_SET_INDEX_INPUT_TO": "sebagai", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang pertama.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang terakhir.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Tetapkan item pertama di dalam list.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Menetapkan item terakhir dalam list.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Tetapkan secara acak sebuah item dalam list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang pertama.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list. #1 adalah item yang terakhir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Sisipkan item di bagian awal dari list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Tambahkan item ke bagian akhir list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Sisipkan item secara acak ke dalam list.", - "LISTS_GET_SUBLIST_START_FROM_START": "Dapatkan bagian daftar dari #", - "LISTS_GET_SUBLIST_START_FROM_END": "Dapatkan bagian list nomor # dari akhir", - "LISTS_GET_SUBLIST_START_FIRST": "Dapatkan bagian pertama dari list", - "LISTS_GET_SUBLIST_END_FROM_START": "ke #", - "LISTS_GET_SUBLIST_END_FROM_END": "ke # dari akhir", - "LISTS_GET_SUBLIST_END_LAST": "ke yang paling akhir", - "LISTS_GET_SUBLIST_TOOLTIP": "Membuat salinan dari bagian tertentu dari list.", - "LISTS_SPLIT_LIST_FROM_TEXT": "membuat daftar dari teks", - "LISTS_SPLIT_TEXT_FROM_LIST": "buat teks dari daftar", - "LISTS_SPLIT_WITH_DELIMITER": "dengan pembatas", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Membagi teks ke dalam daftar teks, pisahkan pada setiap pembatas.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Gabung daftar teks menjadi satu teks, yang dipisahkan oleh pembatas.", - "VARIABLES_GET_TOOLTIP": "Mengembalikan nilai variabel ini.", - "VARIABLES_GET_CREATE_SET": "Membuat 'tetapkan %1'", - "VARIABLES_SET": "tetapkan %1 untuk %2", - "VARIABLES_SET_TOOLTIP": "tetapkan variabel ini dengan input yang sama.", - "VARIABLES_SET_CREATE_GET": "Membuat 'dapatkan %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "untuk", - "PROCEDURES_DEFNORETURN_PROCEDURE": "buat sesuatu", - "PROCEDURES_BEFORE_PARAMS": "dengan:", - "PROCEDURES_CALL_BEFORE_PARAMS": "dengan:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Menciptakan sebuah fungsi dengan tiada output.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "kembali", - "PROCEDURES_DEFRETURN_TOOLTIP": "Menciptakan sebuah fungsi dengan satu output.", - "PROCEDURES_ALLOW_STATEMENTS": "memungkinkan pernyataan", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Peringatan: Fungsi ini memiliki parameter duplikat.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Menjalankan fungsi '%1' yang ditetapkan pengguna.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Menjalankan fungsi '%1' yang ditetapkan pengguna dan menggunakan outputnya.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "input", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Menambah, menghapus, atau menyusun ulang masukan untuk fungsi ini.", - "PROCEDURES_MUTATORARG_TITLE": "masukan Nama:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Tambahkan masukan ke fungsi.", - "PROCEDURES_HIGHLIGHT_DEF": "Sorot definisi fungsi", - "PROCEDURES_CREATE_DO": "Buat '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Jika nilai yang benar, kemudian kembalikan nilai kedua.", - "PROCEDURES_IFRETURN_WARNING": "Peringatan: Blok ini dapat digunakan hanya dalam definisi fungsi." -} diff --git a/msg/json/is.json b/msg/json/is.json deleted file mode 100644 index 9d67725af8..0000000000 --- a/msg/json/is.json +++ /dev/null @@ -1,348 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Jonbg", - "아라", - "Gaddi00" - ] - }, - "VARIABLES_DEFAULT_NAME": "atriði", - "TODAY": "Í dag", - "DUPLICATE_BLOCK": "Afrita", - "ADD_COMMENT": "Skrifa skýringu", - "REMOVE_COMMENT": "Fjarlægja skýringu", - "EXTERNAL_INPUTS": "Ytri inntök", - "INLINE_INPUTS": "Innri inntök", - "DELETE_BLOCK": "Eyða kubbi", - "DELETE_X_BLOCKS": "Eyða %1 kubbum", - "DELETE_ALL_BLOCKS": "Eyða öllum %1 kubbunum?", - "COLLAPSE_BLOCK": "Loka kubbi", - "COLLAPSE_ALL": "Loka kubbum", - "EXPAND_BLOCK": "Opna kubb", - "EXPAND_ALL": "Opna kubba", - "DISABLE_BLOCK": "Óvirkja kubb", - "ENABLE_BLOCK": "Virkja kubb", - "HELP": "Hjálp", - "CHAT": "Spjallaðu við félaga með því að skrifa í þennan reit!", - "AUTH": "Vinsamlegast heimilaðu þetta forrit svo að hægt sé að vista verk þitt og svo að þú megir deila því", - "ME": "Mig", - "CHANGE_VALUE_TITLE": "Breyta gildi:", - "NEW_VARIABLE": "Ný breyta...", - "NEW_VARIABLE_TITLE": "Heiti nýrrar breytu:", - "RENAME_VARIABLE": "Endurnefna breytu...", - "RENAME_VARIABLE_TITLE": "Endurnefna allar '%1' breyturnar:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Velja lit úr litakorti.", - "COLOUR_RANDOM_TITLE": "einhver litur", - "COLOUR_RANDOM_TOOLTIP": "Velja einhvern lit af handahófi.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "litur", - "COLOUR_RGB_RED": "rauður", - "COLOUR_RGB_GREEN": "grænt", - "COLOUR_RGB_BLUE": "blátt", - "COLOUR_RGB_TOOLTIP": "Búa til lit úr tilteknu magni af rauðu, grænu og bláu. Allar tölurnar verða að vera á bilinu 0 til 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "blöndun", - "COLOUR_BLEND_COLOUR1": "litur 1", - "COLOUR_BLEND_COLOUR2": "litur 2", - "COLOUR_BLEND_RATIO": "hlutfall", - "COLOUR_BLEND_TOOLTIP": "Blandar tveimur litum í gefnu hlutfalli (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "endurtaka %1 sinnum", - "CONTROLS_REPEAT_INPUT_DO": "gera", - "CONTROLS_REPEAT_TOOLTIP": "Gera eitthvað aftur og aftur.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "endurtaka á meðan", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "endurtaka þar til", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Endurtaka eitthvað á meðan gildi er satt.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Endurtaka eitthvað á meðan gildi er ósatt.", - "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", - "CONTROLS_FOR_TOOLTIP": "Láta breytuna \"%1\" taka inn gildi frá fyrstu tölu til síðustu tölu hlaupandi á bilinu og endurtaka kubbana fyrir hverja tölu.", - "CONTROLS_FOR_TITLE": "telja með %1 frá %2 til %3 um %4", - "CONTROLS_FOREACH_TITLE": "fyrir hvert %1 í lista %2", - "CONTROLS_FOREACH_TOOLTIP": "Fyrir hvert atriði í lista er breyta '%1' stillt á atriðið og skipanir gerðar.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "fara út úr lykkju", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "fara beint í næstu umferð lykkjunnar", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Fara út úr umlykjandi lykkju.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sleppa afganginum af lykkjunni og fara beint í næstu umferð hennar.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Aðvörun: Þennan kubb má aðeins nota innan lykkju.", - "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", - "CONTROLS_IF_TOOLTIP_1": "Ef gildi er satt skal gera einhverjar skipanir.", - "CONTROLS_IF_TOOLTIP_2": "Ef gildi er satt skal gera skipanir í fyrri kubbnum. Annars skal gera skipanir í seinni kubbnum.", - "CONTROLS_IF_TOOLTIP_3": "Ef fyrra gildið er satt skal gera skipanir í fyrri kubbnum. Annars, ef seinna gildið er satt, þá skal gera skipanir í seinni kubbnum.", - "CONTROLS_IF_TOOLTIP_4": "Ef fyrra gildið er satt skal gera skipanir í fyrri kubbnum. Annars, ef seinna gildið er satt, skal gera skipanir í seinni kubbnum. Ef hvorugt gildið er satt, skal gera skipanir í síðasta kubbnum.", - "CONTROLS_IF_MSG_IF": "ef", - "CONTROLS_IF_MSG_ELSEIF": "annars ef", - "CONTROLS_IF_MSG_ELSE": "annars", - "CONTROLS_IF_IF_TOOLTIP": "Bæta við, fjarlægja eða umraða til að breyta skipan þessa EF kubbs.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Bæta skilyrði við EF kubbinn.", - "CONTROLS_IF_ELSE_TOOLTIP": "Bæta við hluta EF kubbs sem grípur öll tilfelli sem uppfylla ekki hin skilyrðin.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Skila sönnu ef inntökin eru jöfn.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Skila sönnu ef inntökin eru ekki jöfn.", - "LOGIC_COMPARE_TOOLTIP_LT": "Skila sönnu ef fyrra inntakið er minna en seinna inntakið.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Skila sönnu ef fyrra inntakið er minna en eða jafnt og seinna inntakið.", - "LOGIC_COMPARE_TOOLTIP_GT": "Skila sönnu ef fyrra inntakið er stærra en seinna inntakið.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Skila sönnu ef fyrra inntakið er stærra en eða jafnt og seinna inntakið.", - "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", - "LOGIC_OPERATION_TOOLTIP_AND": "Skila sönnu ef bæði inntökin eru sönn.", - "LOGIC_OPERATION_AND": "og", - "LOGIC_OPERATION_TOOLTIP_OR": "Skila sönnu ef að minnsta kosti eitt inntak er satt.", - "LOGIC_OPERATION_OR": "eða", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", - "LOGIC_NEGATE_TITLE": "ekki %1", - "LOGIC_NEGATE_TOOLTIP": "Skilar sönnu ef inntakið er ósatt. Skilar ósönnu ef inntakið er satt.", - "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", - "LOGIC_BOOLEAN_TRUE": "satt", - "LOGIC_BOOLEAN_FALSE": "ósatt", - "LOGIC_BOOLEAN_TOOLTIP": "Skilar annað hvort sönnu eða ósönnu.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "tómagildi", - "LOGIC_NULL_TOOLTIP": "Skilar tómagildi.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "prófun", - "LOGIC_TERNARY_IF_TRUE": "ef satt", - "LOGIC_TERNARY_IF_FALSE": "ef ósatt", - "LOGIC_TERNARY_TOOLTIP": "Kanna skilyrðið í 'prófun'. Skilar 'ef satt' gildinu ef skilyrðið er satt, en skilar annars 'ef ósatt' gildinu.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Tala.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Skila summu talnanna tveggja.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Skila mismun talnanna.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Skila margfeldi talnanna.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Skila deilingu talnanna.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Skila fyrri tölunni í veldinu seinni talan.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "kvaðratrót", - "MATH_SINGLE_TOOLTIP_ROOT": "Skila kvaðratrót tölu.", - "MATH_SINGLE_OP_ABSOLUTE": "algildi", - "MATH_SINGLE_TOOLTIP_ABS": "Skila algildi tölu.", - "MATH_SINGLE_TOOLTIP_NEG": "Skila neitun tölu (tölunni með öfugu formerki).", - "MATH_SINGLE_TOOLTIP_LN": "Skila náttúrlegum lógaritma tölu.", - "MATH_SINGLE_TOOLTIP_LOG10": "Skila tugalógaritma tölu.", - "MATH_SINGLE_TOOLTIP_EXP": "Skila e í veldi tölu.", - "MATH_SINGLE_TOOLTIP_POW10": "Skila 10 í veldi tölu.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Skila sínusi horns gefnu í gráðum.", - "MATH_TRIG_TOOLTIP_COS": "Skila kósínusi horns gefnu í gráðum.", - "MATH_TRIG_TOOLTIP_TAN": "Skila tangensi horns gefnu í gráðum.", - "MATH_TRIG_TOOLTIP_ASIN": "Skila arkarsínusi tölu.", - "MATH_TRIG_TOOLTIP_ACOS": "Skila arkarkósínusi tölu.", - "MATH_TRIG_TOOLTIP_ATAN": "Skila arkartangensi tölu.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Skila algengum fasta: π (3.141…), e (2.718…), φ (1.618…), kvrót(2) (1.414…), kvrót(½) (0.707…) eða ∞ (óendanleika).", - "MATH_IS_EVEN": "er\\u00A0jöfn tala", - "MATH_IS_ODD": "er oddatala", - "MATH_IS_PRIME": "er prímtala", - "MATH_IS_WHOLE": "er heiltala", - "MATH_IS_POSITIVE": "er jákvæð", - "MATH_IS_NEGATIVE": "er neikvæð", - "MATH_IS_DIVISIBLE_BY": "er\\u00A0deilanleg með", - "MATH_IS_TOOLTIP": "Kanna hvort tala sé jöfn tala, oddatala, jákvæð, neikvæð eða deilanleg með tiltekinni tölu. Skilar sönnu eða ósönnu.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "breyta %1 um %2", - "MATH_CHANGE_TOOLTIP": "Bæta tölu við breytu '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Námunda tölu upp eða niður.", - "MATH_ROUND_OPERATOR_ROUND": "námunda", - "MATH_ROUND_OPERATOR_ROUNDUP": "námunda upp", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "námunda niður", - "MATH_ONLIST_OPERATOR_SUM": "summa lista", - "MATH_ONLIST_TOOLTIP_SUM": "Skila summu allra talna í listanum.", - "MATH_ONLIST_OPERATOR_MIN": "minnst í lista", - "MATH_ONLIST_TOOLTIP_MIN": "Skila minnstu tölu í listanum.", - "MATH_ONLIST_OPERATOR_MAX": "stærst í lista", - "MATH_ONLIST_TOOLTIP_MAX": "Skila stærstu tölu í listanum.", - "MATH_ONLIST_OPERATOR_AVERAGE": "meðaltal lista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Skila meðaltali talna í listanum.", - "MATH_ONLIST_OPERATOR_MEDIAN": "miðgildi lista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Skila miðgildi listans.", - "MATH_ONLIST_OPERATOR_MODE": "tíðast í lista", - "MATH_ONLIST_TOOLTIP_MODE": "Skila lista yfir tíðustu gildin í listanum.", - "MATH_ONLIST_OPERATOR_STD_DEV": "staðalfrávik lista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Skila staðalfráviki lista.", - "MATH_ONLIST_OPERATOR_RANDOM": "eitthvað úr lista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Skila einhverju atriði úr listanum.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "afgangur af %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Skila afgangi deilingar með tölunum.", - "MATH_CONSTRAIN_TITLE": "þröngva %1 lægst %2 hæst %3", - "MATH_CONSTRAIN_TOOLTIP": "Þröngva tölu til að vera innan hinna tilgreindu marka (að báðum meðtöldum).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "slembitala frá %1 til %2", - "MATH_RANDOM_INT_TOOLTIP": "Skila heiltölu sem valin er af handahófi og er innan tilgreindra marka, að báðum meðtöldum.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "slembibrot", - "MATH_RANDOM_FLOAT_TOOLTIP": "Skila broti sem er valið af handahófi úr tölum á bilinu frá og með 0.0 til (en ekki með) 1.0.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Stafur, orð eða textalína.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", - "TEXT_JOIN_TITLE_CREATEWITH": "búa til texta með", - "TEXT_JOIN_TOOLTIP": "Búa til texta með því að tengja saman einhvern fjölda atriða.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "tengja", - "TEXT_CREATE_JOIN_TOOLTIP": "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa textakubbs.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Bæta atriði við textann.", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", - "TEXT_APPEND_TO": "við", - "TEXT_APPEND_APPENDTEXT": "bæta texta", - "TEXT_APPEND_TOOLTIP": "Bæta texta við breytuna '%1'.", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", - "TEXT_LENGTH_TITLE": "lengd %1", - "TEXT_LENGTH_TOOLTIP": "Skilar fjölda stafa (með bilum) í gefna textanum.", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", - "TEXT_ISEMPTY_TITLE": "%1 er tómur", - "TEXT_ISEMPTY_TOOLTIP": "Skilar sönnu ef gefni textinn er tómur.", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", - "TEXT_INDEXOF_TOOLTIP": "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar 0 ef textinn finnst ekki.", - "TEXT_INDEXOF_INPUT_INTEXT": "í texta", - "TEXT_INDEXOF_OPERATOR_FIRST": "finna fyrsta tilfelli texta", - "TEXT_INDEXOF_OPERATOR_LAST": "finna síðasta tilfelli texta", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", - "TEXT_CHARAT_INPUT_INTEXT": "í texta", - "TEXT_CHARAT_FROM_START": "sækja staf #", - "TEXT_CHARAT_FROM_END": "sækja staf # frá enda", - "TEXT_CHARAT_FIRST": "sækja fyrsta staf", - "TEXT_CHARAT_LAST": "sækja síðasta staf", - "TEXT_CHARAT_RANDOM": "sækja einhvern staf", - "TEXT_CHARAT_TOOLTIP": "Skila staf á tilteknum stað.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Skilar tilteknum hluta textans.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "í texta", - "TEXT_GET_SUBSTRING_START_FROM_START": "sækja textabút frá staf #", - "TEXT_GET_SUBSTRING_START_FROM_END": "sækja textabút frá staf # frá enda", - "TEXT_GET_SUBSTRING_START_FIRST": "sækja textabút frá fyrsta staf", - "TEXT_GET_SUBSTRING_END_FROM_START": "að staf #", - "TEXT_GET_SUBSTRING_END_FROM_END": "að staf # frá enda", - "TEXT_GET_SUBSTRING_END_LAST": "að síðasta staf", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", - "TEXT_CHANGECASE_TOOLTIP": "Skila afriti af textanum með annarri stafastöðu.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "í HÁSTAFI", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "í lágstafi", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "í Upphafstafi", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", - "TEXT_TRIM_TOOLTIP": "Skila afriti af textanum þar sem möguleg bil við báða enda hafa verið fjarlægð.", - "TEXT_TRIM_OPERATOR_BOTH": "eyða bilum báðum megin við", - "TEXT_TRIM_OPERATOR_LEFT": "eyða bilum vinstra megin við", - "TEXT_TRIM_OPERATOR_RIGHT": "eyða bilum hægra megin við", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", - "TEXT_PRINT_TITLE": "prenta %1", - "TEXT_PRINT_TOOLTIP": "Prenta tiltekinn texta, tölu eða annað gildi.", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", - "TEXT_PROMPT_TYPE_TEXT": "biðja um texta með skilaboðum", - "TEXT_PROMPT_TYPE_NUMBER": "biðja um tölu með skilaboðum", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Biðja notandann um tölu.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Biðja notandann um texta.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "búa til tóman lista", - "LISTS_CREATE_EMPTY_TOOLTIP": "Skilar lista með lengdina 0 án gagna", - "LISTS_CREATE_WITH_TOOLTIP": "Búa til lista með einhverjum fjölda atriða.", - "LISTS_CREATE_WITH_INPUT_WITH": "búa til lista með", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "listi", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa listakubbs.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Bæta atriði við listann.", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_REPEAT_TOOLTIP": "Býr til lista sem inniheldur tiltekna gildið endurtekið tiltekið oft.", - "LISTS_REPEAT_TITLE": "búa til lista með atriði %1 endurtekið %2 sinnum", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", - "LISTS_LENGTH_TITLE": "lengd %1", - "LISTS_LENGTH_TOOLTIP": "Skilar lengd lista.", - "LISTS_ISEMPTY_TITLE": "%1 er tómur", - "LISTS_ISEMPTY_TOOLTIP": "Skilar sönnu ef listinn er tómur.", - "LISTS_INLIST": "í lista", - "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", - "LISTS_INDEX_OF_FIRST": "finna fyrsta tilfelli atriðis", - "LISTS_INDEX_OF_LAST": "finna síðasta tilfelli atriðis", - "LISTS_INDEX_OF_TOOLTIP": "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar 0 ef textinn finnst ekki.", - "LISTS_GET_INDEX_GET": "sækja", - "LISTS_GET_INDEX_GET_REMOVE": "sækja og fjarlægja", - "LISTS_GET_INDEX_REMOVE": "fjarlægja", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# frá enda", - "LISTS_GET_INDEX_FIRST": "fyrsta", - "LISTS_GET_INDEX_LAST": "síðasta", - "LISTS_GET_INDEX_RANDOM": "eitthvert", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Skilar atriðinu í hinum tiltekna stað í lista. #1 er fyrsta atriðið.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Skilar atriðinu á hinum tiltekna stað í lista. #1 er síðasta atriðið.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Skilar fyrsta atriði í lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Skilar síðasta atriði í lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Skilar einhverju atriði úr lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista. #1 er fyrsta atriðið.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista. #1 er síðasta atriðið.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fjarlægir og skilar fyrsta atriðinu í lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fjarlægir og skilar síðasta atriðinu í lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fjarlægir og skilar einhverju atriði úr lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fjarlægir atriðið á hinum tiltekna stað í lista. #1 er fyrsta atriðið.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fjarlægir atriðið á hinum tiltekna stað í lista. #1 er síðasta atriðið.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fjarlægir fyrsta atriðið í lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fjarlægir síðasta atriðið í lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Fjarlægir eitthvert atriði úr lista.", - "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", - "LISTS_SET_INDEX_SET": "setja í", - "LISTS_SET_INDEX_INSERT": "bæta við", - "LISTS_SET_INDEX_INPUT_TO": "sem", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setur atriðið í tiltekna sætið í listanum. #1 er fyrsta atriðið.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setur atriðið í tiltekna sætið í listanum. #1 er síðasta atriðið.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setur atriðið í fyrsta sæti lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setur atriðið í síðasta sæti lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setur atriðið í eitthvert sæti lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Bætir atriðinu í listann á tilteknum stað. #1 er fyrsta atriðið.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Bætir atriðinu í listann á tilteknum stað. #1 er síðasta atriðið.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Bætir atriðinu fremst í listann.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Bætir atriðinu aftan við listann.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Bætir atriðinu einhversstaðar við listann.", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", - "LISTS_GET_SUBLIST_START_FROM_START": "sækja undirlista frá #", - "LISTS_GET_SUBLIST_START_FROM_END": "sækja undirlista frá # frá enda", - "LISTS_GET_SUBLIST_START_FIRST": "sækja undirlista frá fyrsta", - "LISTS_GET_SUBLIST_END_FROM_START": "til #", - "LISTS_GET_SUBLIST_END_FROM_END": "til # frá enda", - "LISTS_GET_SUBLIST_END_LAST": "til síðasta", - "LISTS_GET_SUBLIST_TOOLTIP": "Býr til afrit af tilteknum hluta lista.", - "LISTS_SPLIT_LIST_FROM_TEXT": "gera lista úr texta", - "LISTS_SPLIT_TEXT_FROM_LIST": "gera texta úr lista", - "LISTS_SPLIT_WITH_DELIMITER": "með skiltákni", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Skiptir texta í lista af textum, með skil við hvert skiltákn.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Sameinar lista af textum í einn texta, með skiltákn á milli.", - "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", - "VARIABLES_GET_TOOLTIP": "Skilar gildi þessarar breytu.", - "VARIABLES_GET_CREATE_SET": "Búa til 'stilla %1'", - "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", - "VARIABLES_SET": "stilla %1 á %2", - "VARIABLES_SET_TOOLTIP": "Stillir þessa breytu á innihald inntaksins.", - "VARIABLES_SET_CREATE_GET": "Búa til 'sækja %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "til að", - "PROCEDURES_DEFNORETURN_PROCEDURE": "gera eitthvað", - "PROCEDURES_BEFORE_PARAMS": "með:", - "PROCEDURES_CALL_BEFORE_PARAMS": "með:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Býr til fall sem skilar engu.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "skila", - "PROCEDURES_DEFRETURN_TOOLTIP": "Býr til fall sem skilar úttaki.", - "PROCEDURES_ALLOW_STATEMENTS": "leyfa setningar", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Aðvörun: Þetta fall er með tvítekna stika.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Keyra heimatilbúna fallið '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Keyra heimatilbúna fallið '%1' og nota úttak þess.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "inntök", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Bæta við, fjarlægja eða umraða inntökum fyrir þetta fall.", - "PROCEDURES_MUTATORARG_TITLE": "heiti inntaks:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Bæta inntaki við fallið.", - "PROCEDURES_HIGHLIGHT_DEF": "Sýna skilgreiningu falls", - "PROCEDURES_CREATE_DO": "Búa til '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Ef gildi er satt, skal skila öðru gildi.", - "PROCEDURES_IFRETURN_WARNING": "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls." -} diff --git a/msg/json/it.json b/msg/json/it.json deleted file mode 100644 index 2fa1238c45..0000000000 --- a/msg/json/it.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Beta16", - "Espertus", - "Nerimic", - "Gbonanome", - "Gianfranco", - "Federico Mugnaini" - ] - }, - "VARIABLES_DEFAULT_NAME": "elemento", - "TODAY": "Oggi", - "DUPLICATE_BLOCK": "Duplica", - "ADD_COMMENT": "Aggiungi commento", - "REMOVE_COMMENT": "Rimuovi commento", - "EXTERNAL_INPUTS": "Ingressi esterni", - "INLINE_INPUTS": "Ingressi in linea", - "DELETE_BLOCK": "Cancella blocco", - "DELETE_X_BLOCKS": "Cancella %1 blocchi", - "DELETE_ALL_BLOCKS": "Cancellare tutti i %1 blocchi?", - "CLEAN_UP": "Pulisci i blocchi", - "COLLAPSE_BLOCK": "Comprimi blocco", - "COLLAPSE_ALL": "Comprimi blocchi", - "EXPAND_BLOCK": "Espandi blocco", - "EXPAND_ALL": "Espandi blocchi", - "DISABLE_BLOCK": "Disattiva blocco", - "ENABLE_BLOCK": "Attiva blocco", - "HELP": "Aiuto", - "CHAT": "Chatta con il tuo collaboratore scrivendo in questo box!", - "AUTH": "Autorizza questa applicazione per consentire di salvare il tuo lavoro e per essere condiviso.", - "ME": "Me", - "CHANGE_VALUE_TITLE": "Modifica valore:", - "NEW_VARIABLE": "Nuova variabile...", - "NEW_VARIABLE_TITLE": "Nome della nuova variabile:", - "RENAME_VARIABLE": "Rinomina variabile...", - "RENAME_VARIABLE_TITLE": "Rinomina tutte le variabili '%1' in:", - "COLOUR_PICKER_HELPURL": "https://it.wikipedia.org/wiki/Colore", - "COLOUR_PICKER_TOOLTIP": "Scegli un colore dalla tavolozza.", - "COLOUR_RANDOM_TITLE": "colore casuale", - "COLOUR_RANDOM_TOOLTIP": "Scegli un colore a caso.", - "COLOUR_RGB_TITLE": "colora con", - "COLOUR_RGB_RED": "rosso", - "COLOUR_RGB_GREEN": "verde", - "COLOUR_RGB_BLUE": "blu", - "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.", - "COLOUR_BLEND_TITLE": "miscela", - "COLOUR_BLEND_COLOUR1": "colore 1", - "COLOUR_BLEND_COLOUR2": "colore 2", - "COLOUR_BLEND_RATIO": "rapporto", - "COLOUR_BLEND_TOOLTIP": "Mescola due colori insieme con un determinato rapporto (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://it.wikipedia.org/wiki/Ciclo_for", - "CONTROLS_REPEAT_TITLE": "ripeti %1 volte", - "CONTROLS_REPEAT_INPUT_DO": "fai", - "CONTROLS_REPEAT_TOOLTIP": "Esegue alcune istruzione diverse volte.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ripeti mentre", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ripeti fino a che", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Finché un valore è vero, esegue alcune istruzioni.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Finché un valore è falso, esegue alcune istruzioni.", - "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.", - "CONTROLS_FOR_TITLE": "conta con %1 da %2 a %3 per %4", - "CONTROLS_FOREACH_TITLE": "per ogni elemento %1 nella lista %2", - "CONTROLS_FOREACH_TOOLTIP": "Per ogni elemento in una lista, imposta la variabile '%1' pari all'elemento e quindi esegue alcune istruzioni.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "esce dal ciclo", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "prosegui con la successiva iterazione del ciclo", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Esce dal ciclo.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Salta il resto di questo ciclo e prosegue con la successiva iterazione.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Attenzioneː Questo blocco può essere usato solo in un ciclo.", - "CONTROLS_IF_TOOLTIP_1": "Se un valore è vero allora esegue alcune istruzioni.", - "CONTROLS_IF_TOOLTIP_2": "Se un valore è vero allora esegue il primo blocco di istruzioni. Altrimenti esegue il secondo blocco di istruzioni.", - "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.", - "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.", - "CONTROLS_IF_MSG_IF": "se", - "CONTROLS_IF_MSG_ELSEIF": "altrimenti se", - "CONTROLS_IF_MSG_ELSE": "altrimenti", - "CONTROLS_IF_IF_TOOLTIP": "Aggiungi, elimina o riordina le sezioni per riconfigurare questo blocco se.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Aggiungi una condizione al blocco se.", - "CONTROLS_IF_ELSE_TOOLTIP": "Aggiungi una condizione finale pigliatutto al blocco se.", - "LOGIC_COMPARE_HELPURL": "https://it.wikipedia.org/wiki/Disuguaglianza", - "LOGIC_COMPARE_TOOLTIP_EQ": "Restituisce vero se gli input sono uno uguale all'altro.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Restituisce vero se gli input non sono uno uguale all'altro.", - "LOGIC_COMPARE_TOOLTIP_LT": "Restituisce vero se il primo input è minore del secondo.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Restituisce vero se il primo input è minore o uguale al secondo.", - "LOGIC_COMPARE_TOOLTIP_GT": "Restituisce vero se il primo input è maggiore o uguale al secondo.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Restituisce uguale se il primo input è maggiore o uguale al secondo input.", - "LOGIC_OPERATION_TOOLTIP_AND": "Restituisce vero se entrambi gli input sono veri.", - "LOGIC_OPERATION_AND": "e", - "LOGIC_OPERATION_TOOLTIP_OR": "Restituisce vero se almeno uno degli input è vero.", - "LOGIC_OPERATION_OR": "o", - "LOGIC_NEGATE_TITLE": "non %1", - "LOGIC_NEGATE_TOOLTIP": "Restituisce vero se l'input è falso. Restituisce falso se l'input è vero.", - "LOGIC_BOOLEAN_TRUE": "vero", - "LOGIC_BOOLEAN_FALSE": "falso", - "LOGIC_BOOLEAN_TOOLTIP": "Restituisce vero o falso.", - "LOGIC_NULL": "nullo", - "LOGIC_NULL_TOOLTIP": "Restituisce valore nullo.", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "se vero", - "LOGIC_TERNARY_IF_FALSE": "se falso", - "LOGIC_TERNARY_TOOLTIP": "Verifica la condizione in 'test'. Se questa è vera restituisce il valore 'se vero' altrimenti restituisce il valore 'se falso'.", - "MATH_NUMBER_HELPURL": "https://it.wikipedia.org/wiki/Numero", - "MATH_NUMBER_TOOLTIP": "Un numero.", - "MATH_ARITHMETIC_HELPURL": "https://it.wikipedia.org/wiki/Aritmetica", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Restituisce la somma dei due numeri.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Restituisce la differenza dei due numeri.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Restituisce il prodotto dei due numeri.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Restituisce il quoziente dei due numeri.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Restituisce il primo numero elevato alla potenza del secondo numero.", - "MATH_SINGLE_HELPURL": "https://it.wikipedia.org/wiki/Radice_quadrata", - "MATH_SINGLE_OP_ROOT": "radice quadrata", - "MATH_SINGLE_TOOLTIP_ROOT": "Restituisce la radice quadrata del numero.", - "MATH_SINGLE_OP_ABSOLUTE": "assoluto", - "MATH_SINGLE_TOOLTIP_ABS": "Restituisce il valore assoluto del numero.", - "MATH_SINGLE_TOOLTIP_NEG": "Restituisce l'opposto del numero.", - "MATH_SINGLE_TOOLTIP_LN": "Restituisce il logaritmo naturale del numero.", - "MATH_SINGLE_TOOLTIP_LOG10": "Restituisce il logaritmo in base 10 del numero.", - "MATH_SINGLE_TOOLTIP_EXP": "Restituisce e elevato alla potenza del numero.", - "MATH_SINGLE_TOOLTIP_POW10": "Restituisce 10 elevato alla potenza del numero.", - "MATH_TRIG_HELPURL": "https://it.wikipedia.org/wiki/Funzione_trigonometrica", - "MATH_TRIG_TOOLTIP_SIN": "Restituisce il seno di un angolo espresso in gradi (non radianti).", - "MATH_TRIG_TOOLTIP_COS": "Restituisce il coseno di un angolo espresso in gradi (non radianti).", - "MATH_TRIG_TOOLTIP_TAN": "Restituisce la tangente di un angolo espresso in gradi (non radianti).", - "MATH_TRIG_TOOLTIP_ASIN": "Restituisce l'arco-seno di un numero.", - "MATH_TRIG_TOOLTIP_ACOS": "Restituisce l'arco-coseno di un numero.", - "MATH_TRIG_TOOLTIP_ATAN": "Restituisce l'arco-tangente di un numero.", - "MATH_CONSTANT_HELPURL": "https://it.wikipedia.org/wiki/Costante_matematica", - "MATH_CONSTANT_TOOLTIP": "Restituisce una delle costanti comuniː π (3.141…), e (2.718…), φ (1.618…), radq(2) (1.414…), radq(½) (0.707…) o ∞ (infinito).", - "MATH_IS_EVEN": "è pari", - "MATH_IS_ODD": "è dispari", - "MATH_IS_PRIME": "è primo", - "MATH_IS_WHOLE": "è intero", - "MATH_IS_POSITIVE": "è positivo", - "MATH_IS_NEGATIVE": "è negativo", - "MATH_IS_DIVISIBLE_BY": "è divisibile per", - "MATH_IS_TOOLTIP": "Verifica se un numero è pari, dispari, primo, intero, positivo, negativo o se è divisibile per un certo numero. Restituisce vero o falso.", - "MATH_CHANGE_HELPURL": "https://it.wikipedia.org/wiki/Addizione", - "MATH_CHANGE_TITLE": "cambia %1 di %2", - "MATH_CHANGE_TOOLTIP": "Aggiunge un numero alla variabile '%1'.", - "MATH_ROUND_HELPURL": "https://it.wikipedia.org/wiki/Arrotondamento", - "MATH_ROUND_TOOLTIP": "Arrotonda un numero verso l'alto o verso il basso.", - "MATH_ROUND_OPERATOR_ROUND": "arrotonda", - "MATH_ROUND_OPERATOR_ROUNDUP": "arrotonda verso l'alto", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "arrotonda verso il basso", - "MATH_ONLIST_OPERATOR_SUM": "somma la lista", - "MATH_ONLIST_TOOLTIP_SUM": "Restituisce la somma si tutti i numeri nella lista.", - "MATH_ONLIST_OPERATOR_MIN": "minimo della lista", - "MATH_ONLIST_TOOLTIP_MIN": "Restituisce il più piccolo numero della lista.", - "MATH_ONLIST_OPERATOR_MAX": "massimo della lista", - "MATH_ONLIST_TOOLTIP_MAX": "Restituisce il più grande numero della lista.", - "MATH_ONLIST_OPERATOR_AVERAGE": "media della lista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Restituisce la media (media aritmetica) dei valori numerici nella lista.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana della lista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Restituisce il valore mediano della lista.", - "MATH_ONLIST_OPERATOR_MODE": "mode della lista", - "MATH_ONLIST_TOOLTIP_MODE": "Restituisce una lista degli elementi più frequenti nella lista.", - "MATH_ONLIST_OPERATOR_STD_DEV": "deviazione standard della lista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Restituisce la deviazione standard della lista.", - "MATH_ONLIST_OPERATOR_RANDOM": "elemento casuale della lista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Restituisce un elemento casuale della lista.", - "MATH_MODULO_HELPURL": "https://it.wikipedia.org/wiki/Resto", - "MATH_MODULO_TITLE": "resto di %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Restituisce il resto della divisione di due numeri.", - "MATH_CONSTRAIN_TITLE": "costringi %1 da %2 a %3", - "MATH_CONSTRAIN_TOOLTIP": "Costringe un numero all'interno dei limiti indicati (compresi).", - "MATH_RANDOM_INT_HELPURL": "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali", - "MATH_RANDOM_INT_TITLE": "intero casuale da %1 a %2", - "MATH_RANDOM_INT_TOOLTIP": "Restituisce un numero intero casuale compreso tra i due limiti indicati (inclusi).", - "MATH_RANDOM_FLOAT_HELPURL": "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "frazione casuale", - "MATH_RANDOM_FLOAT_TOOLTIP": "Restituisce una frazione compresa fra 0.0 (incluso) e 1.0 (escluso).", - "TEXT_TEXT_HELPURL": "https://it.wikipedia.org/wiki/Stringa_(informatica)", - "TEXT_TEXT_TOOLTIP": "Una lettera, una parola o una linea di testo.", - "TEXT_JOIN_TITLE_CREATEWITH": "crea testo con", - "TEXT_JOIN_TOOLTIP": "Crea un blocco di testo unendo un certo numero di elementi.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "unisci", - "TEXT_CREATE_JOIN_TOOLTIP": "Aggiungi, rimuovi o riordina le sezioni per riconfigurare questo blocco testo.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Aggiungi un elemento al testo.", - "TEXT_APPEND_TO": "a", - "TEXT_APPEND_APPENDTEXT": "aggiungi il testo", - "TEXT_APPEND_TOOLTIP": "Aggiunge del testo alla variabile '%1'.", - "TEXT_LENGTH_TITLE": "lunghezza di %1", - "TEXT_LENGTH_TOOLTIP": "Restituisce il numero di lettere (inclusi gli spazi) nel testo fornito.", - "TEXT_ISEMPTY_TITLE": "%1 è vuoto", - "TEXT_ISEMPTY_TOOLTIP": "Restituisce vero se il testo fornito è vuoto.", - "TEXT_INDEXOF_TOOLTIP": "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce 0 se il testo non viene trovato.", - "TEXT_INDEXOF_INPUT_INTEXT": "nel testo", - "TEXT_INDEXOF_OPERATOR_FIRST": "trova la prima occorrenza del testo", - "TEXT_INDEXOF_OPERATOR_LAST": "trova l'ultima occorrenza del testo", - "TEXT_CHARAT_INPUT_INTEXT": "nel testo", - "TEXT_CHARAT_FROM_START": "prendi la lettera #", - "TEXT_CHARAT_FROM_END": "prendi la lettera # dalla fine", - "TEXT_CHARAT_FIRST": "prendi la prima lettera", - "TEXT_CHARAT_LAST": "prendi l'ultima lettera", - "TEXT_CHARAT_RANDOM": "prendi lettera casuale", - "TEXT_CHARAT_TOOLTIP": "Restituisce la lettera nella posizione indicata.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Restituisce la porzione di testo indicata.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "nel testo", - "TEXT_GET_SUBSTRING_START_FROM_START": "prendi sotto-stringa dalla lettera #", - "TEXT_GET_SUBSTRING_START_FROM_END": "prendi sotto-stringa dalla lettera # dalla fine", - "TEXT_GET_SUBSTRING_START_FIRST": "prendi sotto-stringa dalla prima lettera", - "TEXT_GET_SUBSTRING_END_FROM_START": "alla lettera #", - "TEXT_GET_SUBSTRING_END_FROM_END": "alla lettera # dalla fine", - "TEXT_GET_SUBSTRING_END_LAST": "all'ultima lettera", - "TEXT_CHANGECASE_TOOLTIP": "Restituisce una copia del testo in un diverso formato maiuscole/minuscole.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "in MAIUSCOLO", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "in minuscolo", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "con Iniziali Maiuscole", - "TEXT_TRIM_TOOLTIP": "Restituisce una copia del testo con gli spazi rimossi ad uno o entrambe le estremità.", - "TEXT_TRIM_OPERATOR_BOTH": "rimuovi spazi da entrambi gli estremi", - "TEXT_TRIM_OPERATOR_LEFT": "rimuovi spazi a sinistra", - "TEXT_TRIM_OPERATOR_RIGHT": "rimuovi spazi a destra", - "TEXT_PRINT_TITLE": "scrivi %1", - "TEXT_PRINT_TOOLTIP": "Scrive il testo, numero o altro valore indicato.", - "TEXT_PROMPT_TYPE_TEXT": "richiedi testo con messaggio", - "TEXT_PROMPT_TYPE_NUMBER": "richiedi numero con messaggio", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Richiedi un numero all'utente.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Richiede del testo da parte dell'utente.", - "LISTS_CREATE_EMPTY_TITLE": "crea lista vuota", - "LISTS_CREATE_EMPTY_TOOLTIP": "Restituisce una lista, di lunghezza 0, contenente nessun record di dati", - "LISTS_CREATE_WITH_TOOLTIP": "Crea una lista con un certo numero di elementi.", - "LISTS_CREATE_WITH_INPUT_WITH": "crea lista con", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Aggiungi, rimuovi o riordina le sezioni per riconfigurare il blocco lista.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Aggiunge un elemento alla lista.", - "LISTS_REPEAT_TOOLTIP": "Crea una lista costituita dal valore indicato ripetuto per il numero di volte specificato.", - "LISTS_REPEAT_TITLE": "crea una lista con l'elemento %1 ripetuto %2 volte", - "LISTS_LENGTH_TITLE": "lunghezza di %1", - "LISTS_LENGTH_TOOLTIP": "Restituisce la lunghezza della lista", - "LISTS_ISEMPTY_TITLE": "%1 è vuota", - "LISTS_ISEMPTY_TOOLTIP": "Restituisce vero se la lista è vuota.", - "LISTS_INLIST": "nella lista", - "LISTS_INDEX_OF_FIRST": "trova la prima occorrenza dell'elemento", - "LISTS_INDEX_OF_LAST": "trova l'ultima occorrenza dell'elemento", - "LISTS_INDEX_OF_TOOLTIP": "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce 0 se l'elemento non viene trovato.", - "LISTS_GET_INDEX_GET": "prendi", - "LISTS_GET_INDEX_GET_REMOVE": "prendi e rimuovi", - "LISTS_GET_INDEX_REMOVE": "rimuovi", - "LISTS_GET_INDEX_FROM_END": "# dalla fine", - "LISTS_GET_INDEX_FIRST": "primo", - "LISTS_GET_INDEX_LAST": "ultimo", - "LISTS_GET_INDEX_RANDOM": "casuale", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Restituisce l'elemento nella posizione indicata della lista. 1 corrisponde al primo elemento della lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Restituisce l'elemento nella posizione indicata della lista. 1 corrisponde all'ultimo elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Restituisce il primo elemento in una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Restituisce l'ultimo elemento in una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Restituisce un elemento casuale in una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Rimuove e restituisce l'elemento nella posizione indicata in una lista. 1 corrisponde al primo elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Rimuove e restituisce l'elemento nella posizione indicata in una lista. 1 corrisponde all'ultimo elemento.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Rimuove e restituisce il primo elemento in una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Restituisce e rimuove l'ultimo elemento in una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Restituisce e rimuove un elemento casuale in una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Rimuove l'elemento nella posizione indicata in una lista. 1 corrisponde al primo elemento.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Rimuove l'elemento nella posizione indicata in una lista. 1 corrisponde all'ultimo elemento.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Rimuove il primo elemento in una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Rimuove l'ultimo elemento in una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Rimuove un elemento casuale in una lista.", - "LISTS_SET_INDEX_SET": "imposta", - "LISTS_SET_INDEX_INSERT": "inserisci in", - "LISTS_SET_INDEX_INPUT_TO": "come", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Imposta l'elemento nella posizione indicata di una lista. 1 corrisponde al primo elemento.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Imposta l'elemento nella posizione indicata di una lista. 1 corrisponde all'ultimo elemento.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Imposta il primo elemento in una lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Imposta l'ultimo elemento in una lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Imposta un elemento casuale in una lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Inserisci un elemento nella posizione indicata in una lista. #1 corrisponde al primo elemento.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Inserisci l'elemento nella posizione indicata in una lista. #1 corrisponde all'ultimo elemento.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Inserisci l'elemento all'inizio della lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Aggiungi un elemento alla fine di una lista", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Inserisce l'elemento casualmente in una lista.", - "LISTS_GET_SUBLIST_START_FROM_START": "prendi sotto-lista da #", - "LISTS_GET_SUBLIST_START_FROM_END": "prendi sotto-lista da # dalla fine", - "LISTS_GET_SUBLIST_START_FIRST": "prendi sotto-lista dall'inizio", - "LISTS_GET_SUBLIST_END_FROM_START": "fino a #", - "LISTS_GET_SUBLIST_END_FROM_END": "da # dalla fine", - "LISTS_GET_SUBLIST_END_LAST": "dagli ultimi", - "LISTS_GET_SUBLIST_TOOLTIP": "Crea una copia della porzione specificata di una lista.", - "LISTS_SPLIT_LIST_FROM_TEXT": "crea lista da testo", - "LISTS_SPLIT_TEXT_FROM_LIST": "crea testo da lista", - "LISTS_SPLIT_WITH_DELIMITER": "con delimitatore", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividi il testo in un elenco di testi, interrompendo ad ogni delimitatore.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Unisci una lista di testi in un unico testo, separato da un delimitatore.", - "VARIABLES_GET_TOOLTIP": "Restituisce il valore di una variabile.", - "VARIABLES_GET_CREATE_SET": "Crea 'imposta %1'", - "VARIABLES_SET": "imposta %1 a %2", - "VARIABLES_SET_TOOLTIP": "Imposta questa variabile ad essere pari all'input.", - "VARIABLES_SET_CREATE_GET": "Crea 'prendi %1'", - "PROCEDURES_DEFNORETURN_TITLE": "per", - "PROCEDURES_DEFNORETURN_PROCEDURE": "fai qualcosa", - "PROCEDURES_BEFORE_PARAMS": "conː", - "PROCEDURES_CALL_BEFORE_PARAMS": "conː", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Crea una funzione senza output.", - "PROCEDURES_DEFRETURN_RETURN": "ritorna", - "PROCEDURES_DEFRETURN_TOOLTIP": "Crea una funzione con un output.", - "PROCEDURES_ALLOW_STATEMENTS": "consenti dichiarazioni", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Attenzioneː Questa funzione ha parametri duplicati.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://it.wikipedia.org/wiki/Funzione_(informatica)", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Esegue la funzione definita dall'utente '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://it.wikipedia.org/wiki/Funzione_(informatica)", - "PROCEDURES_CALLRETURN_TOOLTIP": "Esegue la funzione definita dall'utente '%1' ed usa il suo output.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "input", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Aggiungi, rimuovi o riordina input alla funzione.", - "PROCEDURES_MUTATORARG_TITLE": "nome inputː", - "PROCEDURES_MUTATORARG_TOOLTIP": "Aggiungi un input alla funzione.", - "PROCEDURES_HIGHLIGHT_DEF": "Evidenzia definizione di funzione", - "PROCEDURES_CREATE_DO": "Crea '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Se un valore è vero allora restituisce un secondo valore.", - "PROCEDURES_IFRETURN_WARNING": "Attenzioneː Questo blocco può essere usato solo all'interno di una definizione di funzione." -} diff --git a/msg/json/ja.json b/msg/json/ja.json deleted file mode 100644 index 4be3fbfe38..0000000000 --- a/msg/json/ja.json +++ /dev/null @@ -1,328 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Shirayuki", - "Oda", - "아라", - "Otokoume", - "Sujiniku" - ] - }, - "VARIABLES_DEFAULT_NAME": "項目", - "TODAY": "今日", - "DUPLICATE_BLOCK": "複製", - "ADD_COMMENT": "コメントを追加", - "REMOVE_COMMENT": "コメントを削除します。", - "EXTERNAL_INPUTS": "外部入力", - "INLINE_INPUTS": "インライン入力", - "DELETE_BLOCK": "ブロックを消す", - "DELETE_X_BLOCKS": "%1 個のブロックを消す", - "DELETE_ALL_BLOCKS": "%1 個すべてのブロックを消しますか?", - "CLEAN_UP": "ブロックの整理", - "COLLAPSE_BLOCK": "ブロックを折りたたむ", - "COLLAPSE_ALL": "ブロックを折りたたむ", - "EXPAND_BLOCK": "ブロックを展開します。", - "EXPAND_ALL": "ブロックを展開します。", - "DISABLE_BLOCK": "ブロックを無効にします。", - "ENABLE_BLOCK": "ブロックを有効にします。", - "HELP": "ヘルプ", - "CHAT": "このボックスに入力して共同編集者とチャットしよう!", - "ME": "私に", - "CHANGE_VALUE_TITLE": "値を変更します。", - "NEW_VARIABLE": "新しい変数", - "NEW_VARIABLE_TITLE": "新しい変数の、名前", - "RENAME_VARIABLE": "変数の名前を変更.", - "RENAME_VARIABLE_TITLE": "%1の変数すべてを名前変更します。", - "COLOUR_PICKER_HELPURL": "https://ja.wikipedia.org/wiki/色", - "COLOUR_PICKER_TOOLTIP": "パレットから色を選んでください。", - "COLOUR_RANDOM_TITLE": "ランダムな色", - "COLOUR_RANDOM_TOOLTIP": "ランダムな色を選択します。", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "カラーと", - "COLOUR_RGB_RED": "赤", - "COLOUR_RGB_GREEN": "緑", - "COLOUR_RGB_BLUE": "青", - "COLOUR_RGB_TOOLTIP": "赤、緑、および青の指定された量で色を作成します。すべての値は 0 ~ 100 の間でなければなりません。", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "ブレンド", - "COLOUR_BLEND_COLOUR1": "色 1", - "COLOUR_BLEND_COLOUR2": "色 2", - "COLOUR_BLEND_RATIO": "割合", - "COLOUR_BLEND_TOOLTIP": "ブレンド2 つの色を指定された比率に混ぜる」 (0.0 ~ 1.0)。", - "CONTROLS_REPEAT_HELPURL": "https://ja.wikipedia.org/wiki/for文", - "CONTROLS_REPEAT_TITLE": "%1 回、繰り返します", - "CONTROLS_REPEAT_INPUT_DO": "してください", - "CONTROLS_REPEAT_TOOLTIP": "いくつかのステートメントを数回行います。", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "つつその間、繰り返す4", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "までを繰り返します", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "値は true のあいだ、いくつかのステートメントを行います。", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "値は false のあいだ、いくつかのステートメントを行います。", - "CONTROLS_FOR_TOOLTIP": "変数 \"%1\"は、指定した間隔ごとのカウントを開始番号から 終了番号まで、値をとり、指定したブロックを行う必要があります。", - "CONTROLS_FOR_TITLE": "で、カウントします。 %1 %2 から%3、 %4 で", - "CONTROLS_FOREACH_TITLE": "各項目の %1 リストで %2", - "CONTROLS_FOREACH_TOOLTIP": "リストの各項目に対して変数 '%1' のアイテムに設定し、いくつかのステートメントをしてください。", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ループから抜け出す", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ループの次の反復処理を続行します。", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "含むループから抜け出します。", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "このループの残りの部分をスキップし、次のイテレーションに進みます。", - "CONTROLS_FLOW_STATEMENTS_WARNING": "注意: このブロックは、ループ内でのみ使用します。", - "CONTROLS_IF_TOOLTIP_1": "値が true の場合はその後ステートメントを行をいくつかします。", - "CONTROLS_IF_TOOLTIP_2": "値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、ステートメントの 2 番目のブロックを行います。", - "CONTROLS_IF_TOOLTIP_3": "最初の値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、2 番目の値が true の場合、ステートメントの 2 番目のブロックをします。", - "CONTROLS_IF_TOOLTIP_4": "最初の値が true 場合は、ステートメントの最初のブロックを行います。2 番目の値が true の場合は、ステートメントの 2 番目のブロックを行います。それ以外の場合は最後のブロックのステートメントを行います。", - "CONTROLS_IF_MSG_IF": "もし", - "CONTROLS_IF_MSG_ELSEIF": "他でもし", - "CONTROLS_IF_MSG_ELSE": "他", - "CONTROLS_IF_IF_TOOLTIP": "追加、削除、またはセクションを順序変更して、ブロックをこれを再構成します。", - "CONTROLS_IF_ELSEIF_TOOLTIP": "場合に条件にブロック追加。", - "CONTROLS_IF_ELSE_TOOLTIP": "Ifブロックに、すべてをキャッチする条件を追加。", - "LOGIC_COMPARE_HELPURL": "https://ja.wikipedia.org/wiki/不等式", - "LOGIC_COMPARE_TOOLTIP_EQ": "もし両方がお互いに等しく入力した場合は true を返します。", - "LOGIC_COMPARE_TOOLTIP_NEQ": "両方の入力が互いに等しくない場合に true を返します。", - "LOGIC_COMPARE_TOOLTIP_LT": "最初の入力が 2 番目の入力よりも小さいい場合は true を返します。", - "LOGIC_COMPARE_TOOLTIP_LTE": "もし、最初の入力が二つ目入力より少ないか、おなじであったらTRUEをかえしてください", - "LOGIC_COMPARE_TOOLTIP_GT": "最初の入力が 2 番目の入力よりも大きい場合は true を返します。", - "LOGIC_COMPARE_TOOLTIP_GTE": "もし入力がふたつめの入よりも大きかったらtrueをり返します。", - "LOGIC_OPERATION_TOOLTIP_AND": "両方の入力がおんなじ場わいわtrue を返します。", - "LOGIC_OPERATION_AND": "そして", - "LOGIC_OPERATION_TOOLTIP_OR": "最低少なくとも 1 つの入力が true の場合は true を返します。", - "LOGIC_OPERATION_OR": "または", - "LOGIC_NEGATE_HELPURL": "https://ja.wikipedia.org/wiki/否定", - "LOGIC_NEGATE_TITLE": "%1 ではないです。", - "LOGIC_NEGATE_TOOLTIP": "入力が false の場合は、true を返します。入力が true の場合は false を返します。", - "LOGIC_BOOLEAN_TRUE": "true", - "LOGIC_BOOLEAN_FALSE": "false", - "LOGIC_BOOLEAN_TOOLTIP": "True または false を返します。", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Null を返します。", - "LOGIC_TERNARY_HELPURL": "https://ja.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "テスト", - "LOGIC_TERNARY_IF_TRUE": "true の場合", - "LOGIC_TERNARY_IF_FALSE": "false の場合", - "LOGIC_TERNARY_TOOLTIP": "'テスト' の条件をチェックします。条件が true の場合、'true' の値を返します。それ以外の場合 'false' のを返します。", - "MATH_NUMBER_HELPURL": "https://ja.wikipedia.org/wiki/数", - "MATH_NUMBER_TOOLTIP": "数です。", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://ja.wikipedia.org/wiki/算術", - "MATH_ARITHMETIC_TOOLTIP_ADD": "2 つの数の合計を返します。", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "2 つの数の差を返します。", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "2 つの数の積を返します。", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "2 つの数の商を返します。", - "MATH_ARITHMETIC_TOOLTIP_POWER": "最初の数を2 番目の値で累乗した結果を返します。", - "MATH_SINGLE_HELPURL": "https://ja.wikipedia.org/wiki/平方根", - "MATH_SINGLE_OP_ROOT": "平方根", - "MATH_SINGLE_TOOLTIP_ROOT": "平方根を返す", - "MATH_SINGLE_OP_ABSOLUTE": "絶対値", - "MATH_SINGLE_TOOLTIP_ABS": "絶対値を返す", - "MATH_SINGLE_TOOLTIP_NEG": "負の数を返す", - "MATH_SINGLE_TOOLTIP_LN": "数値の自然対数をかえしてください", - "MATH_SINGLE_TOOLTIP_LOG10": "log 10 を返す。", - "MATH_SINGLE_TOOLTIP_EXP": "数値の e 粂を返す", - "MATH_SINGLE_TOOLTIP_POW10": "10の x 乗", - "MATH_TRIG_HELPURL": "https://ja.wikipedia.org/wiki/三角関数", - "MATH_TRIG_TOOLTIP_SIN": "番号のsineの次数を返す", - "MATH_TRIG_TOOLTIP_COS": "番号のcosineの次数を返す", - "MATH_TRIG_TOOLTIP_TAN": "番号のtangentの次数を返す", - "MATH_TRIG_TOOLTIP_ASIN": "番号のarcsine を返すます", - "MATH_TRIG_TOOLTIP_ACOS": "arccosine の値を返す", - "MATH_TRIG_TOOLTIP_ATAN": "番号のarctangent を返すます", - "MATH_CONSTANT_HELPURL": "https://ja.wikipedia.org/wiki/数学定数", - "MATH_CONSTANT_TOOLTIP": "いずれかの共通の定数のを返す: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (無限).", - "MATH_IS_EVEN": "わ偶数", - "MATH_IS_ODD": "奇数です。", - "MATH_IS_PRIME": "素数です", - "MATH_IS_WHOLE": "は整数", - "MATH_IS_POSITIVE": "正の値", - "MATH_IS_NEGATIVE": "負の値", - "MATH_IS_DIVISIBLE_BY": "割り切れる", - "MATH_IS_TOOLTIP": "数字が、偶数、奇数、素数、整数、正数、負数、またはそれが特定の数で割り切れる場合かどうかを確認してください。どの制限が一つでも本当でしたら true をかえしてください、そうでない場合わ falseを返してください。", - "MATH_CHANGE_HELPURL": "https://ja.wikipedia.org/wiki/加法", - "MATH_CHANGE_TITLE": "変更 %1 に %2", - "MATH_CHANGE_TOOLTIP": "'%1' をたします。", - "MATH_ROUND_HELPURL": "https://ja.wikipedia.org/wiki/端数処理", - "MATH_ROUND_TOOLTIP": "数値を切り上げるか切り捨てる", - "MATH_ROUND_OPERATOR_ROUND": "概数", - "MATH_ROUND_OPERATOR_ROUNDUP": "数値を切り上げ", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "端数を切り捨てる", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "リストの合計", - "MATH_ONLIST_TOOLTIP_SUM": "全部リストの数をたして返す", - "MATH_ONLIST_OPERATOR_MIN": "リストの最小の数", - "MATH_ONLIST_TOOLTIP_MIN": "リストの最小数を返します。", - "MATH_ONLIST_OPERATOR_MAX": "リストの最大値", - "MATH_ONLIST_TOOLTIP_MAX": "リストの最大数を返します。", - "MATH_ONLIST_OPERATOR_AVERAGE": "リストの平均", - "MATH_ONLIST_TOOLTIP_AVERAGE": "リストの数値の平均 (算術平均) を返します。", - "MATH_ONLIST_OPERATOR_MEDIAN": "リストの中央値", - "MATH_ONLIST_TOOLTIP_MEDIAN": "リストの中央値の数を返します。", - "MATH_ONLIST_OPERATOR_MODE": "一覧モード", - "MATH_ONLIST_TOOLTIP_MODE": "リストで最も一般的な項目のリストを返します。", - "MATH_ONLIST_OPERATOR_STD_DEV": "リストの標準偏差", - "MATH_ONLIST_TOOLTIP_STD_DEV": "リウトの標準偏差をかえす", - "MATH_ONLIST_OPERATOR_RANDOM": "リストのランダム アイテム", - "MATH_ONLIST_TOOLTIP_RANDOM": "リストからランダムに要素を返します。", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "残りの %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "2 つの数値を除算した残りを返します。", - "MATH_CONSTRAIN_TITLE": "制限%1下リミット%2上限リミット%3", - "MATH_CONSTRAIN_TOOLTIP": "値を、上限 x と下限 y のあいだに制限んする(上限と下限が、x と y とに同じ場合わ、上限の値は x, 下限の値はy)。", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "%1 から %2 への無作為の整数", - "MATH_RANDOM_INT_TOOLTIP": "指定した下限の間、無作為なランダムな整数を返します。", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "ランダムな分数", - "MATH_RANDOM_FLOAT_TOOLTIP": "ランダムな分数を返すー0.0 (包括) の間のと 1.0 (排他的な)。", - "TEXT_TEXT_HELPURL": "https://ja.wikipedia.org/wiki/文字列", - "TEXT_TEXT_TOOLTIP": "文字、単語、または行のテキスト。", - "TEXT_JOIN_TITLE_CREATEWITH": "テキストを作成します。", - "TEXT_JOIN_TOOLTIP": "任意の数の項目一部を一緒に接合してテキストの作成します。", - "TEXT_CREATE_JOIN_TITLE_JOIN": "結合", - "TEXT_CREATE_JOIN_TOOLTIP": "追加、削除、またはセクションを順序変更して、ブロックを再構成します。", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "テキスト をアイテム追加します。", - "TEXT_APPEND_TO": "宛先", - "TEXT_APPEND_APPENDTEXT": "テキストを追加します。", - "TEXT_APPEND_TOOLTIP": "変数 '%1' にいくつかのテキストを追加します。", - "TEXT_LENGTH_TITLE": "%1 の長さ", - "TEXT_LENGTH_TOOLTIP": "指定されたテキストの文字 (スペースを含む) の数を返します。", - "TEXT_ISEMPTY_TITLE": "%1 が空", - "TEXT_ISEMPTY_TOOLTIP": "指定されたテキストが空の場合は、true を返します。", - "TEXT_INDEXOF_TOOLTIP": "最初のテキストの二番目のてきすとの、最初と最後の、出現したインデックスをかえします。テキストが見つからない場合は 0 を返します。", - "TEXT_INDEXOF_INPUT_INTEXT": "テキストで", - "TEXT_INDEXOF_OPERATOR_FIRST": "テキストの最初の出現箇所を検索します。", - "TEXT_INDEXOF_OPERATOR_LAST": "テキストの最後に見つかったを検索します。", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_INPUT_INTEXT": "テキストで", - "TEXT_CHARAT_FROM_START": "文字# を取得", - "TEXT_CHARAT_FROM_END": "一番最後の言葉、キャラクターを所得", - "TEXT_CHARAT_FIRST": "最初の文字を得る", - "TEXT_CHARAT_LAST": "最後の文字を得る", - "TEXT_CHARAT_RANDOM": "ランダムな文字を得る", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "指定された位置に文字を返します。", - "TEXT_GET_SUBSTRING_TOOLTIP": "テキストの指定部分を返します。", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "テキストで", - "TEXT_GET_SUBSTRING_START_FROM_START": "文字列からの部分文字列を取得 #", - "TEXT_GET_SUBSTRING_START_FROM_END": "部分文字列を取得する #端から得る", - "TEXT_GET_SUBSTRING_START_FIRST": "部分文字列を取得する。", - "TEXT_GET_SUBSTRING_END_FROM_START": "# の文字", - "TEXT_GET_SUBSTRING_END_FROM_END": "文字列の# 終わりからの#", - "TEXT_GET_SUBSTRING_END_LAST": "最後のの文字", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "別のケースに、テキストのコピーを返します。", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "大文字に変換する", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "小文字に", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "タイトル ケースに", - "TEXT_TRIM_TOOLTIP": "スペースを 1 つまたは両方の端から削除したのち、テキストのコピーを返します。", - "TEXT_TRIM_OPERATOR_BOTH": "両端のスペースを取り除く", - "TEXT_TRIM_OPERATOR_LEFT": "左端のスペースを取り除く", - "TEXT_TRIM_OPERATOR_RIGHT": "右端のスペースを取り除く", - "TEXT_PRINT_TITLE": "%1 を印刷します。", - "TEXT_PRINT_TOOLTIP": "指定したテキスト、番号または他の値を印刷します。", - "TEXT_PROMPT_TYPE_TEXT": "メッセージをプロンプトしてにテキストを求める", - "TEXT_PROMPT_TYPE_NUMBER": "メッセージを送って番号の入力を求める", - "TEXT_PROMPT_TOOLTIP_NUMBER": "ユーザーにプロンプトして数字のインプットを求めます", - "TEXT_PROMPT_TOOLTIP_TEXT": "いくつかのテキストを、ユーザーに入力するようにプロンプト。", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "空のリストを作成します。", - "LISTS_CREATE_EMPTY_TOOLTIP": "長さゼロ、データ レコード空のリストを返します", - "LISTS_CREATE_WITH_TOOLTIP": "アイテム数かぎりないのリストを作成します。", - "LISTS_CREATE_WITH_INPUT_WITH": "これを使ってリストを作成します。", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "リスト", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "追加、削除、またはセクションを順序変更して、ブロックを再構成します。", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "リストにアイテムを追加します。", - "LISTS_REPEAT_TOOLTIP": "指定された値をなんどか繰り返してリストを作ります。", - "LISTS_REPEAT_TITLE": "アイテム %1 と一緒にリストを作成し %2 回繰り", - "LISTS_LENGTH_TITLE": " %1の長さ", - "LISTS_LENGTH_TOOLTIP": "リストの長さを返します。", - "LISTS_ISEMPTY_TITLE": "%1 が空", - "LISTS_ISEMPTY_TOOLTIP": "リストが空の場合は、true を返します。", - "LISTS_INLIST": "リストで", - "LISTS_INDEX_OF_FIRST": "最初に見つかった項目を検索します。", - "LISTS_INDEX_OF_LAST": "最後に見つかったアイテムを見つける", - "LISTS_INDEX_OF_TOOLTIP": "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は 0 を返します。", - "LISTS_GET_INDEX_GET": "取得", - "LISTS_GET_INDEX_GET_REMOVE": "取得と削除", - "LISTS_GET_INDEX_REMOVE": "削除", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "終しまいから #", - "LISTS_GET_INDEX_FIRST": "最初", - "LISTS_GET_INDEX_LAST": "最後", - "LISTS_GET_INDEX_RANDOM": "ランダム", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "リスト内の指定位置にある項目を返します。# 1 は、最初の項目です。", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "リスト内の指定位置にある項目を返します。# 1 は、最後の項目です。", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "リストの最初の項目を返信します。", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "リストの最後の項目を返します。", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "ランダム アイテム リストを返します。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "リスト内の指定位置にある項目を削除し、返します。# 1 は、最後の項目です。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "リスト内の指定位置にある項目を削除し、返します。# 1 は、最後の項目です。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "リスト内の最初の項目を削除したあと返します。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "リスト内の最後の項目を削除したあと返します。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "リストのランダムなアイテムを削除し、返します。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "リスト内の指定位置にある項目を返します。# 1 は、最初の項目です。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "リスト内の指定位置にある項目を削除します。# 1 は、最後の項目です。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "リスト内の最初の項目を削除します。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "リスト内の最後の項目を削除します。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "リスト内にある任意のアイテムを削除します。", - "LISTS_SET_INDEX_SET": "セット", - "LISTS_SET_INDEX_INSERT": "挿入します。", - "LISTS_SET_INDEX_INPUT_TO": "として", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "リスト内の指定された位置に項目を設定します。# 1 は、最初の項目です。", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "リスト内の指定された位置に項目を設定します。# 1 は、最後の項目です。", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "リスト内に最初の項目を設定します。", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "リスト内の最後の項目を設定します。", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "リスト内にランダムなアイテムを設定します。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "リスト内の指定位置に項目を挿入します。# 1 は、最初の項目です。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "リスト内の指定位置に項目を挿入します。# 1 は、最後の項目です。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "リストの先頭に項目を挿入します。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "リストの末尾に項目を追加します。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "リストに項目をランダムに挿入します。", - "LISTS_GET_SUBLIST_START_FROM_START": "# からサブディレクトリのリストを取得します。", - "LISTS_GET_SUBLIST_START_FROM_END": "端から #のサブリストを取得します。", - "LISTS_GET_SUBLIST_START_FIRST": "最初からサブリストを取得する。", - "LISTS_GET_SUBLIST_END_FROM_START": "#へ", - "LISTS_GET_SUBLIST_END_FROM_END": "最後から#へ", - "LISTS_GET_SUBLIST_END_LAST": "最後へ", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "リストの指定された部分のコピーを作成してくださ。", - "LISTS_SPLIT_LIST_FROM_TEXT": "テキストからリストを作る", - "LISTS_SPLIT_TEXT_FROM_LIST": "リストからテキストを作る", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_TOOLTIP": "この変数の値を返します。", - "VARIABLES_GET_CREATE_SET": "'セット%1を作成します。", - "VARIABLES_SET": "セット %1 宛先 %2", - "VARIABLES_SET_TOOLTIP": "この入力を変数と等しくなるように設定します。", - "VARIABLES_SET_CREATE_GET": "'%1 を取得' を作成します。", - "PROCEDURES_DEFNORETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", - "PROCEDURES_DEFNORETURN_TITLE": "宛先", - "PROCEDURES_DEFNORETURN_PROCEDURE": "何かしてください", - "PROCEDURES_BEFORE_PARAMS": "で。", - "PROCEDURES_CALL_BEFORE_PARAMS": "で。", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "出力なしで関数を作成します。", - "PROCEDURES_DEFRETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", - "PROCEDURES_DEFRETURN_RETURN": "返す", - "PROCEDURES_DEFRETURN_TOOLTIP": "出力を持つ関数を作成します。", - "PROCEDURES_DEF_DUPLICATE_WARNING": "警告: この関数は、重複するパラメーターがあります。", - "PROCEDURES_CALLNORETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", - "PROCEDURES_CALLNORETURN_TOOLTIP": "ユーザー定義関数 '%1' を実行します。", - "PROCEDURES_CALLRETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", - "PROCEDURES_CALLRETURN_TOOLTIP": "ユーザー定義関数 '%1' を実行し、その出力を使用します。", - "PROCEDURES_MUTATORCONTAINER_TITLE": "入力", - "PROCEDURES_MUTATORARG_TITLE": "入力名:", - "PROCEDURES_HIGHLIGHT_DEF": "関数の内容を強調表示します。", - "PROCEDURES_CREATE_DO": "%1をつくる", - "PROCEDURES_IFRETURN_TOOLTIP": "1番目値が true の場合、2 番目の値を返します。", - "PROCEDURES_IFRETURN_WARNING": "警告: このブロックは、関数定義内でのみ使用できます。" -} diff --git a/msg/json/ko.json b/msg/json/ko.json deleted file mode 100644 index 7760a24a54..0000000000 --- a/msg/json/ko.json +++ /dev/null @@ -1,366 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Hym411", - "아라", - "Priviet", - "Revi", - "SeoJeongHo", - "Alex00728", - "Kurousagi" - ] - }, - "VARIABLES_DEFAULT_NAME": "항목", - "TODAY": "오늘", - "DUPLICATE_BLOCK": "중복됨", - "ADD_COMMENT": "댓글 추가", - "REMOVE_COMMENT": "내용 제거", - "EXTERNAL_INPUTS": "외부 입력", - "INLINE_INPUTS": "내부 입력", - "DELETE_BLOCK": "블록 삭제", - "DELETE_X_BLOCKS": "블록 %1 삭제", - "DELETE_ALL_BLOCKS": "모든 블록 %1개를 삭제하겠습니까?", - "CLEAN_UP": "블록 정리", - "COLLAPSE_BLOCK": "블록 축소", - "COLLAPSE_ALL": "블록 축소", - "EXPAND_BLOCK": "블록 확장", - "EXPAND_ALL": "블록 확장", - "DISABLE_BLOCK": "블록 비활성화", - "ENABLE_BLOCK": "블록 활성화", - "HELP": "도움말", - "CHAT": "이 상자에 입력하여 당신의 동료와 채팅하세요!", - "AUTH": "당신의 작업을 저장하고 다른 사람과 공유할 수 있도록 이 애플리케이션을 인증해 주십시오.", - "ME": "나", - "CHANGE_VALUE_TITLE": "값 바꾸기:", - "NEW_VARIABLE": "새 변수", - "NEW_VARIABLE_TITLE": "새 변수 이름:", - "RENAME_VARIABLE": "변수 이름 바꾸기:", - "RENAME_VARIABLE_TITLE": "'%1' 변수 이름을 바꾸기:", - "COLOUR_PICKER_HELPURL": "https://ko.wikipedia.org/wiki/색", - "COLOUR_PICKER_TOOLTIP": "팔레트에서 색을 고릅니다", - "COLOUR_RANDOM_TITLE": "임의 색상", - "COLOUR_RANDOM_TOOLTIP": "무작위로 색을 고릅니다.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "RGB 색", - "COLOUR_RGB_RED": "빨강", - "COLOUR_RGB_GREEN": "초록", - "COLOUR_RGB_BLUE": "파랑", - "COLOUR_RGB_TOOLTIP": "빨강,파랑,초록의 값을 이용하여 색을 만드십시오. 모든 값은 0과 100 사이에 있어야 합니다.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "혼합", - "COLOUR_BLEND_COLOUR1": "색 1", - "COLOUR_BLEND_COLOUR2": "색 2", - "COLOUR_BLEND_RATIO": "비율", - "COLOUR_BLEND_TOOLTIP": "두 색을 주어진 비율로 혼합 (0.0 - 1.0)", - "CONTROLS_REPEAT_HELPURL": "https://ko.wikipedia.org/wiki/For_루프", - "CONTROLS_REPEAT_TITLE": "%1회 반복", - "CONTROLS_REPEAT_INPUT_DO": "하기", - "CONTROLS_REPEAT_TOOLTIP": "여러 번 반복해 명령들을 실행합니다.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://ko.wikipedia.org/wiki/While_%EB%A3%A8%ED%94%84", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "동안 반복", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "다음까지 반복", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "값이 참일 때, 몇가지 선언을 합니다.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "값이 거짓일 때, 몇가지 선언을 합니다.", - "CONTROLS_FOR_HELPURL": "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84", - "CONTROLS_FOR_TOOLTIP": "변수 \"%1\"은 지정된 간격으로 시작 수에서 끝 수까지를 세어 지정된 블록을 수행해야 합니다.", - "CONTROLS_FOR_TITLE": "으로 계산 %1 %2에서 %4을 이용하여 %3로", - "CONTROLS_FOREACH_HELPURL": "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84#.EC.9E.84.EC.9D.98.EC.9D.98_.EC.A7.91.ED.95.A9", - "CONTROLS_FOREACH_TITLE": "각 항목에 대해 %1 목록으로 %2", - "CONTROLS_FOREACH_TOOLTIP": "리스트 안에 들어있는 각 아이템들을, 순서대로 변수 '%1' 에 한 번씩 저장시키고, 그 때 마다 명령을 실행합니다.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://ko.wikipedia.org/wiki/%EC%A0%9C%EC%96%B4_%ED%9D%90%EB%A6%84", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "반복 중단", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "다음 반복", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "현재 반복 실행 블럭을 빠져나갑니다.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "나머지 반복 부분을 더이상 실행하지 않고, 다음 반복을 수행합니다.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "경고 : 이 블록은 반복 실행 블럭 안에서만 사용됩니다.", - "CONTROLS_IF_HELPURL": "https://ko.wikipedia.org/wiki/%EC%A1%B0%EA%B1%B4%EB%AC%B8", - "CONTROLS_IF_TOOLTIP_1": "조건식의 계산 결과가 참이면, 명령을 실행합니다.", - "CONTROLS_IF_TOOLTIP_2": "조건식의 계산 결과가 참이면, 첫번째 블럭의 명령을 실행하고, 그렇지 않으면 두번째 블럭의 명령을 실행합니다.", - "CONTROLS_IF_TOOLTIP_3": "첫번째 조건식의 계산 결과가 참이면, 첫번째 블럭의 명령을 실행하고, 두번째 조건식의 계산 결과가 참이면, 두번째 블럭의 명령을 실행합니다.", - "CONTROLS_IF_TOOLTIP_4": "첫번째 조건식의 계산 결과가 참이면, 첫번째 블럭의 명령을 실행하고, 두번째 조건식의 계산 결과가 참이면, 두번째 블럭의 명령을 실행하고, ... , 어떤 조건식의 계산 결과도 참이 아니면, 마지막 블럭의 명령을 실행합니다.", - "CONTROLS_IF_MSG_IF": "만약", - "CONTROLS_IF_MSG_ELSEIF": "다른 경우", - "CONTROLS_IF_MSG_ELSE": "아니라면", - "CONTROLS_IF_IF_TOOLTIP": "\"만약\" 블럭의 내용을 추가, 삭제, 재구성 합니다.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "\"만약\" 블럭에 조건 검사를 추가합니다.", - "CONTROLS_IF_ELSE_TOOLTIP": "\"만약\" 블럭의 마지막에, 모든 검사 결과가 거짓인 경우 실행할 부분을 추가합니다.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "두 값이 같으면, 참(true) 값을 돌려줍니다.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "두 값이 서로 다르면, 참(true) 값을 돌려줍니다.", - "LOGIC_COMPARE_TOOLTIP_LT": "첫 번째 값이 두 번째 값보다 작으면, 참(true) 값을 돌려줍니다.", - "LOGIC_COMPARE_TOOLTIP_LTE": "첫 번째 값이 두 번째 값보다 작거나 같으면, 참(true) 값을 돌려줍니다.", - "LOGIC_COMPARE_TOOLTIP_GT": "첫 번째 값이 두 번째 값보다 크면, 참(true) 값을 돌려줍니다.", - "LOGIC_COMPARE_TOOLTIP_GTE": "첫 번째 값이 두 번째 값보다 크거나 같으면, 참(true) 값을 돌려줍니다.", - "LOGIC_OPERATION_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B6%88_%EB%85%BC%EB%A6%AC", - "LOGIC_OPERATION_TOOLTIP_AND": "두 값이 모두 참(true) 값이면, 참 값을 돌려줍니다.", - "LOGIC_OPERATION_AND": "그리고", - "LOGIC_OPERATION_TOOLTIP_OR": "적어도 하나의 값이 참일 경우 참을 반환합니다.", - "LOGIC_OPERATION_OR": "또는", - "LOGIC_NEGATE_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B6%80%EC%A0%95", - "LOGIC_NEGATE_TITLE": "%1 의 반대", - "LOGIC_NEGATE_TOOLTIP": "입력값이 거짓이라면 참을 반환합니다. 참이라면 거짓을 반환합니다.", - "LOGIC_BOOLEAN_HELPURL": "https://ko.wikipedia.org/wiki/%EC%A7%84%EB%A6%BF%EA%B0%92", - "LOGIC_BOOLEAN_TRUE": "참", - "LOGIC_BOOLEAN_FALSE": "거짓", - "LOGIC_BOOLEAN_TOOLTIP": "참 혹은 거짓 모두 반환합니다.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "빈 값", - "LOGIC_NULL_TOOLTIP": "빈 값을 반환합니다.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "테스트", - "LOGIC_TERNARY_IF_TRUE": "만약 참이라면", - "LOGIC_TERNARY_IF_FALSE": "만약 거짓이라면", - "LOGIC_TERNARY_TOOLTIP": "'검사' 를 진행해, 결과가 참(true)이면 '참이면' 부분의 값을 돌려줍니다. ; 결과가 참이 아니면, '거짓이면' 부분의 값을 돌려줍니다.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "수", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "x", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "두 수의 합을 반환합니다.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "두 수간의 차이를 반환합니다.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "두 수의 곱을 반환합니다.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "두 수의 나눈 결과를 반환합니다.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "첫 번째 수를 두 번째 수 만큼, 거듭제곱 한 결과값을 돌려줍니다.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "제곱근", - "MATH_SINGLE_TOOLTIP_ROOT": "숫자의 제곱근을 반환합니다.", - "MATH_SINGLE_OP_ABSOLUTE": "절대값", - "MATH_SINGLE_TOOLTIP_ABS": "어떤 수의 절대값(absolute)을 계산한 결과를, 정수값으로 돌려줍니다.", - "MATH_SINGLE_TOOLTIP_NEG": "음(-)/양(+), 부호를 반대로 하여 값을 돌려줍니다.", - "MATH_SINGLE_TOOLTIP_LN": "어떤 수의, 자연로그(natural logarithm) 값을 돌려줍니다.(밑 e, 예시 log e x)", - "MATH_SINGLE_TOOLTIP_LOG10": "어떤 수의, 기본로그(logarithm) 값을 돌려줍니다.(밑 10, 예시 log 10 x)", - "MATH_SINGLE_TOOLTIP_EXP": "e 의, 거듭제곱(power) 값을 돌려줍니다.", - "MATH_SINGLE_TOOLTIP_POW10": "10 의, 거듭제곱(power) 값을 돌려줍니다.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "어떤 각도(degree, radian 아님)의, sin(sine) 값을 계산해 돌려줍니다.", - "MATH_TRIG_TOOLTIP_COS": "어떤 각도(degree, radian 아님)의, cos(cosine) 값을 계산해 돌려줍니다.", - "MATH_TRIG_TOOLTIP_TAN": "어떤 각도(degree, radian 아님)의, tan(tangent) 값을 계산해 돌려줍니다.", - "MATH_TRIG_TOOLTIP_ASIN": "어떤 수에 대한, asin(arcsine) 값을 돌려줍니다.", - "MATH_TRIG_TOOLTIP_ACOS": "어떤 수에 대한, acos(arccosine) 값을 돌려줍니다.", - "MATH_TRIG_TOOLTIP_ATAN": "어떤 수에 대한, atan(arctangent) 값을 돌려줍니다.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "일반적인 상수 값들 중 하나를 돌려줍니다. : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", - "MATH_IS_EVEN": "가 짝수(even) 이면", - "MATH_IS_ODD": "가 홀수(odd) 이면", - "MATH_IS_PRIME": "가 소수(prime) 이면", - "MATH_IS_WHOLE": "가 정수이면", - "MATH_IS_POSITIVE": "가 양(+)수 이면", - "MATH_IS_NEGATIVE": "가 음(-)수 이면", - "MATH_IS_DIVISIBLE_BY": "가 다음 수로 나누어 떨어지면 :", - "MATH_IS_TOOLTIP": "어떤 수가 짝 수, 홀 수, 소 수, 정 수, 양 수, 음 수, 나누어 떨어지는 수 인지 검사해 결과값을 돌려줍니다. 참(true) 또는 거짓(false) 값을 돌려줌.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "바꾸기 %1 만큼 %2", - "MATH_CHANGE_TOOLTIP": "변수 '%1' 에 저장되어있는 값에, 어떤 수를 더해, 변수에 다시 저장합니다.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "어떤 수를 반올림/올림/버림한 결과를, 정수값으로 돌려줍니다.", - "MATH_ROUND_OPERATOR_ROUND": "반올림", - "MATH_ROUND_OPERATOR_ROUNDUP": "올림", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "버림", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "합", - "MATH_ONLIST_TOOLTIP_SUM": "리스트에 들어있는 수(값)들을, 모두 합(sum) 한, 총합(sum)을 돌려줍니다.", - "MATH_ONLIST_OPERATOR_MIN": "최소값", - "MATH_ONLIST_TOOLTIP_MIN": "리스트에 들어있는 수(값) 들 중, 가장 작은(min) 수(값)를 돌려줍니다.", - "MATH_ONLIST_OPERATOR_MAX": "최대값", - "MATH_ONLIST_TOOLTIP_MAX": "리스트에 들어있는 수(값) 들 중, 가장 큰(max) 수(값)를 돌려줍니다.", - "MATH_ONLIST_OPERATOR_AVERAGE": "평균값", - "MATH_ONLIST_TOOLTIP_AVERAGE": "리스트에 들어있는 수(값)들에 대해, 산술 평균(arithmetic mean) 한 값을 돌려줍니다.", - "MATH_ONLIST_OPERATOR_MEDIAN": "중간값", - "MATH_ONLIST_TOOLTIP_MEDIAN": "리스트에 들어있는 수(값) 들 중, 중간(median) 수(값)를 돌려줍니다.", - "MATH_ONLIST_OPERATOR_MODE": "가장 여러 개 있는 값", - "MATH_ONLIST_TOOLTIP_MODE": "리스트에 들어있는 아이템들 중에서, 가장 여러 번 들어있는 아이템들을 리스트로 만들어 돌려줍니다. (최빈값, modes)", - "MATH_ONLIST_OPERATOR_STD_DEV": "표준 편차", - "MATH_ONLIST_TOOLTIP_STD_DEV": "리스트에 들어있는 수(값)들에 대해, 표준 편차(standard deviation) 를 구해 돌려줍니다.", - "MATH_ONLIST_OPERATOR_RANDOM": "목록의 임의 아이템", - "MATH_ONLIST_TOOLTIP_RANDOM": "목록에서 임의의 아이템을 돌려줍니다.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "%1 를 %2 로 나눈 나머지", - "MATH_MODULO_TOOLTIP": "첫 번째 수를 두 번째 수로 나눈, 나머지 값을 돌려줍니다.", - "MATH_CONSTRAIN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9E%A8%ED%95%91_(%EA%B7%B8%EB%9E%98%ED%94%BD)", - "MATH_CONSTRAIN_TITLE": "%1 의 값을, 최소 %2 최대 %3 으로 조정", - "MATH_CONSTRAIN_TOOLTIP": "어떤 수를, 특정 범위의 값이 되도록 강제로 조정합니다.", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "랜덤정수(%1<= n <=%2)", - "MATH_RANDOM_INT_TOOLTIP": "두 주어진 제한된 범위 사이의 임의 정수값을 돌려줍니다.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "임의 분수", - "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (포함)과 1.0 (배타적) 사이의 임의 분수 값을 돌려줍니다.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "문자, 단어, 문장.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", - "TEXT_JOIN_TITLE_CREATEWITH": "텍스트 만들기", - "TEXT_JOIN_TOOLTIP": "여러 개의 아이템들을 연결해(묶어), 새로운 문장을 만듭니다.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "가입", - "TEXT_CREATE_JOIN_TOOLTIP": "이 문장 블럭의 구성을 추가, 삭제, 재구성 합니다.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "문장을 만들 조각 아이템", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", - "TEXT_APPEND_TO": "다음", - "TEXT_APPEND_APPENDTEXT": "내용 덧붙이기", - "TEXT_APPEND_TOOLTIP": "'%1' 의 마지막에 문장을 덧붙입니다.", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", - "TEXT_LENGTH_TITLE": "다음 문장의 문자 개수 %1", - "TEXT_LENGTH_TOOLTIP": "입력된 문장의, 문자 개수를 돌려줍니다.(공백문자 포함)", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", - "TEXT_ISEMPTY_TITLE": "%1이 비어 있습니다", - "TEXT_ISEMPTY_TOOLTIP": "입력된 문장이, 빈 문장(\"\")이면 참(true) 값을 돌려줍니다.", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", - "TEXT_INDEXOF_TOOLTIP": "어떤 문장이 가장 처음 나타난 위치 또는, 가장 마지막으로 나타난 위치를 찾아 돌려줍니다. 찾는 문장이 없는 경우는 0 값을 돌려줌.", - "TEXT_INDEXOF_INPUT_INTEXT": "문장", - "TEXT_INDEXOF_OPERATOR_FIRST": "에서 다음 문장이 처음으로 나타난 위치 찾기 :", - "TEXT_INDEXOF_OPERATOR_LAST": "에서 다음 문장이 마지막으로 나타난 위치 찾기 :", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", - "TEXT_CHARAT_INPUT_INTEXT": "문장", - "TEXT_CHARAT_FROM_START": "에서, 앞에서부터 # 번째 위치의 문자 얻기", - "TEXT_CHARAT_FROM_END": "에서, 마지막부터 # 번째 위치의 문자 얻기", - "TEXT_CHARAT_FIRST": "에서, 첫 번째 문자 얻기", - "TEXT_CHARAT_LAST": "에서, 마지막 문자 얻기", - "TEXT_CHARAT_RANDOM": "에서, 랜덤하게 한 문자 얻기", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "특정 번째 위치에서, 문자를 얻어내 돌려줍니다.", - "TEXT_GET_SUBSTRING_TOOLTIP": "문장 중 일부를 얻어내 돌려줍니다.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "문장", - "TEXT_GET_SUBSTRING_START_FROM_START": "에서, 처음부터 # 번째 문자부터 얻어냄", - "TEXT_GET_SUBSTRING_START_FROM_END": "에서, 마지막에서 # 번째부터 얻어냄", - "TEXT_GET_SUBSTRING_START_FIRST": "에서, 처음부터 얻어냄", - "TEXT_GET_SUBSTRING_END_FROM_START": "# 번째 문자까지", - "TEXT_GET_SUBSTRING_END_FROM_END": "끝에서부터 # 번째 문자까지", - "TEXT_GET_SUBSTRING_END_LAST": "마지막 문자까지", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", - "TEXT_CHANGECASE_TOOLTIP": "영문 대소문자 형태를 변경해 돌려줍니다.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "대문자로", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "소문자로", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "첫 문자만 대문자로", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", - "TEXT_TRIM_TOOLTIP": "문장의 왼쪽/오른쪽/양쪽에서 스페이스 문자를 제거해 돌려줍니다.", - "TEXT_TRIM_OPERATOR_BOTH": "양쪽의 공백 문자 제거", - "TEXT_TRIM_OPERATOR_LEFT": "왼쪽의 공백 문자 제거", - "TEXT_TRIM_OPERATOR_RIGHT": "오른쪽의 공백 문자 제거", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", - "TEXT_PRINT_TITLE": "다음 내용 출력 %1", - "TEXT_PRINT_TOOLTIP": "원하는 문장, 수, 값 등을 출력합니다.", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", - "TEXT_PROMPT_TYPE_TEXT": "다음 안내 멘트를 활용해 문장 입력", - "TEXT_PROMPT_TYPE_NUMBER": "다음 안내 멘트를 활용해 수 입력", - "TEXT_PROMPT_TOOLTIP_NUMBER": "수 입력 받음.", - "TEXT_PROMPT_TOOLTIP_TEXT": "문장 입력 받음.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "빈 리스트 생성", - "LISTS_CREATE_EMPTY_TOOLTIP": "아이템이 없는, 빈 리스트를 만들어 돌려줍니다.", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "원하는 아이템 갯수로 리스트를 생성합니다.", - "LISTS_CREATE_WITH_INPUT_WITH": "리스트 만들기", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "리스트", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "리스트 블럭의 내용을 추가, 삭제, 재구성 합니다.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "아이템을 리스트에 추가합니다.", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_REPEAT_TOOLTIP": "원하는 값을, 원하는 갯수 만큼 넣어, 새로운 리스트를 생성합니다.", - "LISTS_REPEAT_TITLE": "%1 을 %2 번 넣어, 리스트 생성", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", - "LISTS_LENGTH_TITLE": "%1의 길이", - "LISTS_LENGTH_TOOLTIP": "리스트에 포함되어있는, 아이템 갯수를 돌려줍니다.", - "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", - "LISTS_ISEMPTY_TITLE": "%1이 비어 있습니다", - "LISTS_ISEMPTY_TOOLTIP": "목록이 비었을 때 참을 반환합니다.", - "LISTS_INLIST": "리스트", - "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", - "LISTS_INDEX_OF_FIRST": "처음으로 나타난 위치", - "LISTS_INDEX_OF_LAST": "마지막으로 나타난 위치", - "LISTS_INDEX_OF_TOOLTIP": "아이템이 나타난 처음 또는 마지막 위치를 찾아 돌려줍니다. 아이템이 없으면 0이 반환됩니다.", - "LISTS_GET_INDEX_GET": "아이템 가져오기", - "LISTS_GET_INDEX_GET_REMOVE": "잘라 내기", - "LISTS_GET_INDEX_REMOVE": "삭제", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "마지막 번째 위치부터, # 번째", - "LISTS_GET_INDEX_FIRST": "첫번째", - "LISTS_GET_INDEX_LAST": "마지막", - "LISTS_GET_INDEX_RANDOM": "임의로", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "특정 위치의 아이템을 찾아 돌려줍니다. #1 은 첫번째 아이템.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "특정 위치의 아이템을 찾아 돌려줍니다. #1 은 마지막 아이템.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "첫 번째 아이템을 찾아 돌려줍니다.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "마지막 아이템을 찾아 돌려줍니다.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "리스트의 아이템들 중, 랜덤으로 선택해 돌려줍니다.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "특정 위치의 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다. #1 는 첫번째 아이템.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "특정 위치의 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다. #1 는 마지막 아이템.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "첫 번째 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "마지막 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "목록에서 임의 위치의 아이템을 찾아내 삭제하고 돌려줍니다.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "특정 위치의 아이템을 찾아내 삭제합니다. #1 는 첫번째 아이템.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "특정 위치의 아이템을 찾아내 삭제합니다. #1 는 마지막 아이템.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "리스트에서 첫 번째 아이템을 삭제합니다.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "리스트에서 마지막 아이템을 찾아 삭제합니다.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "리스트에서 랜덤하게 아이템을 삭제합니다.", - "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", - "LISTS_SET_INDEX_SET": "에서 설정", - "LISTS_SET_INDEX_INSERT": "에서 원하는 위치에 삽입", - "LISTS_SET_INDEX_INPUT_TO": "에", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "특정 번째 위치의 아이템으로 설정합니다. #1 는 첫번째 아이템.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "특정 번째 위치의 아이템으로 설정합니다. #1 는 마지막 아이템.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "첫 번째 위치의 아이템으로 설정합니다.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "마지막 아이템으로 설정합니다.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "목록에서 임의 위치의 아이템을 설정합니다.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "아이템을 리스트의 특정 위치에 삽입합니다. 첫번째 아이템은 #1.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "아이템을 리스트의 특정 위치에 삽입합니다. 마지막 아이템은 #1.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "아이템을 리스트의 첫번째 위치에 삽입합니다.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "리스트의 마지막에 아이템을 추가합니다.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "목록에서 임의 위치에 아이템을 삽입합니다.", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", - "LISTS_GET_SUBLIST_START_FROM_START": "처음 # 번째 위치부터, 서브 리스트 추출", - "LISTS_GET_SUBLIST_START_FROM_END": "마지막부터 # 번째 위치부터, 서브 리스트 추출", - "LISTS_GET_SUBLIST_START_FIRST": "첫 번째 위치부터, 서브 리스트 추출", - "LISTS_GET_SUBLIST_END_FROM_START": "앞에서부터 # 번째로", - "LISTS_GET_SUBLIST_END_FROM_END": "끝에서부터 # 번째로", - "LISTS_GET_SUBLIST_END_LAST": "마지막으로", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "특정 부분을 복사해 새로운 리스트로 생성합니다.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "텍스트에서 목록 만들기", - "LISTS_SPLIT_TEXT_FROM_LIST": "목록에서 텍스트 만들기", - "LISTS_SPLIT_WITH_DELIMITER": "분리와", - "LISTS_SPLIT_TOOLTIP_SPLIT": "각 속보, 텍스트의 목록들에서 텍스트를 분할합니다.", - "LISTS_SPLIT_TOOLTIP_JOIN": "구분 기호로 분리 된 하나의 텍스트에 텍스트 의 목록을 넣으세요.", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)", - "VARIABLES_GET_TOOLTIP": "변수에 저장 되어있는 값을 돌려줍니다.", - "VARIABLES_GET_CREATE_SET": "'집합 %1' 생성", - "VARIABLES_SET_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)", - "VARIABLES_SET": "바꾸기 %1 를 다음 값으로 바꾸기 %2", - "VARIABLES_SET_TOOLTIP": "변수의 값을 입력한 값으로 변경해 줍니다.", - "VARIABLES_SET_CREATE_GET": "'%1 값 읽기' 블럭 생성", - "PROCEDURES_DEFNORETURN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29", - "PROCEDURES_DEFNORETURN_TITLE": "함수", - "PROCEDURES_DEFNORETURN_PROCEDURE": "함수 이름", - "PROCEDURES_BEFORE_PARAMS": "사용:", - "PROCEDURES_CALL_BEFORE_PARAMS": "사용:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "실행 후, 결과 값을 돌려주지 않는 함수를 만듭니다.", - "PROCEDURES_DEFRETURN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29", - "PROCEDURES_DEFRETURN_RETURN": "다음을 돌려줌", - "PROCEDURES_DEFRETURN_TOOLTIP": "실행 후, 결과 값을 돌려주는 함수를 만듭니다.", - "PROCEDURES_ALLOW_STATEMENTS": "서술 허가", - "PROCEDURES_DEF_DUPLICATE_WARNING": "경고: 이 함수에는, 같은 이름을 사용하는 매개 변수들이 있습니다.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "미리 정의해 둔 '%1' 함수를 실행합니다.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "미리 정의해 둔 '%1' 함수를 실행하고, 함수를 실행한 결과 값을 돌려줍니다.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "매개 변수들", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "이 함수를 추가, 삭제, 혹은 재정렬합니다.", - "PROCEDURES_MUTATORARG_TITLE": "매개 변수:", - "PROCEDURES_MUTATORARG_TOOLTIP": "함수에 값을 더합니다.", - "PROCEDURES_HIGHLIGHT_DEF": "함수 정의 찾기", - "PROCEDURES_CREATE_DO": "'%1' 생성", - "PROCEDURES_IFRETURN_TOOLTIP": "값이 참이라면, 두번째 값을 반환합니다.", - "PROCEDURES_IFRETURN_WARNING": "경고: 이 블럭은, 함수 정의 블럭 안에서만 사용할 수 있습니다." -} diff --git a/msg/json/lb.json b/msg/json/lb.json deleted file mode 100644 index 55b2bcdc3d..0000000000 --- a/msg/json/lb.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Robby", - "Soued031" - ] - }, - "VARIABLES_DEFAULT_NAME": "Element", - "TODAY": "Haut", - "DUPLICATE_BLOCK": "Duplizéieren", - "ADD_COMMENT": "Bemierkung derbäisetzen", - "REMOVE_COMMENT": "Bemierkunge ewechhuelen", - "DELETE_BLOCK": "Block läschen", - "DELETE_X_BLOCKS": "%1 Bléck läschen", - "CLEAN_UP": "Bléck opraumen", - "COLLAPSE_BLOCK": "Block zesummeklappen", - "EXPAND_BLOCK": "Block opklappen", - "EXPAND_ALL": "Bléck opklappen", - "DISABLE_BLOCK": "Block desaktivéieren", - "ENABLE_BLOCK": "Block aktivéieren", - "HELP": "Hëllef", - "CHAT": "Mat ärem Mataarbechter chatten an deem Dir an dës Këscht tippt!", - "ME": "Mech", - "CHANGE_VALUE_TITLE": "Wäert änneren:", - "NEW_VARIABLE": "Nei Variabel...", - "NEW_VARIABLE_TITLE": "Neie variabelen Numm:", - "RENAME_VARIABLE": "Variabel ëmbenennen...", - "RENAME_VARIABLE_TITLE": "All '%1' Variabelen ëmbenennen op:", - "COLOUR_PICKER_TOOLTIP": "Wielt eng Faarf vun der Palette.", - "COLOUR_RANDOM_TITLE": "zoufälleg Faarf", - "COLOUR_RANDOM_TOOLTIP": "Eng zoufälleg Faarf eraussichen.", - "COLOUR_RGB_TITLE": "fierwe mat", - "COLOUR_RGB_RED": "rout", - "COLOUR_RGB_GREEN": "gréng", - "COLOUR_RGB_BLUE": "blo", - "COLOUR_BLEND_TITLE": "mëschen", - "COLOUR_BLEND_COLOUR1": "Faarf 1", - "COLOUR_BLEND_COLOUR2": "Faarf 2", - "COLOUR_BLEND_RATIO": "ratio", - "CONTROLS_REPEAT_TITLE": "%1 mol widderhuelen", - "CONTROLS_REPEAT_INPUT_DO": "maachen", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "widderhuele bis", - "CONTROLS_FOREACH_TITLE": "fir all Element %1 an der Lëscht %2", - "CONTROLS_IF_MSG_IF": "wann", - "CONTROLS_IF_MSG_ELSE": "soss", - "LOGIC_OPERATION_AND": "an", - "LOGIC_OPERATION_OR": "oder", - "LOGIC_NEGATE_TITLE": "net %1", - "LOGIC_BOOLEAN_TRUE": "wouer", - "LOGIC_BOOLEAN_FALSE": "falsch", - "LOGIC_BOOLEAN_TOOLTIP": "Schéckt entweder richteg oder falsch zréck.", - "LOGIC_NULL": "null", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "wa wouer", - "LOGIC_TERNARY_IF_FALSE": "wa falsch", - "MATH_NUMBER_TOOLTIP": "Eng Zuel.", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Gëtt d'Zomme vun zwou Zuelen.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "D'Produkt vun den zwou Zuelen zréckginn.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "Quadratwuerzel", - "MATH_SINGLE_OP_ABSOLUTE": "absolut", - "MATH_IS_EVEN": "ass gerued", - "MATH_IS_ODD": "ass net gerued", - "MATH_IS_PRIME": "ass eng Primzuel", - "MATH_IS_WHOLE": "ass eng ganz Zuel", - "MATH_IS_POSITIVE": "ass positiv", - "MATH_IS_NEGATIVE": "ass negativ", - "MATH_CHANGE_TITLE": "änneren %1 ëm %2", - "MATH_ROUND_TOOLTIP": "Eng Zuel op- oder ofronnen.", - "MATH_ROUND_OPERATOR_ROUND": "opronnen", - "MATH_ROUND_OPERATOR_ROUNDUP": "opronnen", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "ofronnen", - "MATH_ONLIST_OPERATOR_MAX": "Maximum aus der Lëscht", - "MATH_ONLIST_TOOLTIP_MAX": "Schéckt de gréisste Wäert aus enger Lëscht zréck.", - "MATH_ONLIST_OPERATOR_AVERAGE": "Duerchschnëtt vun der Lëscht", - "MATH_ONLIST_OPERATOR_RANDOM": "zoufällegt Element vun enger Lëscht", - "MATH_MODULO_TITLE": "Rescht vu(n) %1 ÷ %2", - "MATH_RANDOM_INT_TITLE": "zoufälleg ganz Zuel tëscht %1 a(n) %2", - "TEXT_TEXT_TOOLTIP": "E Buschtaf, e Wuert oder eng Textzeil.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "En Element bei den Text derbäisetzen.", - "TEXT_APPEND_APPENDTEXT": "Text drunhänken", - "TEXT_LENGTH_TITLE": "Längt vu(n) %1", - "TEXT_ISEMPTY_TITLE": "%1 ass eidel", - "TEXT_INDEXOF_INPUT_INTEXT": "am Text", - "TEXT_CHARAT_INPUT_INTEXT": "am Text", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "am Text", - "TEXT_GET_SUBSTRING_END_FROM_START": "bis de Buschtaf #", - "TEXT_GET_SUBSTRING_END_LAST": "op de leschte Buschtaw", - "TEXT_PRINT_TITLE": "%1 drécken", - "TEXT_PROMPT_TOOLTIP_TEXT": "Freet de Benotzer en Text.", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "Lëscht", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "En Element op d'Lëscht derbäisetzen.", - "LISTS_LENGTH_TITLE": "Längt vu(n) %1", - "LISTS_ISEMPTY_TITLE": "%1 ass eidel", - "LISTS_INLIST": "an der Lëscht", - "LISTS_GET_INDEX_REMOVE": "ewechhuelen", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# vum Schluss", - "LISTS_GET_INDEX_FIRST": "éischt", - "LISTS_GET_INDEX_LAST": "lescht", - "LISTS_GET_INDEX_RANDOM": "Zoufall", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Schéckt en zoufällegt Element aus enger Lëscht zréck.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Hëlt dat lescht Element aus enger Lëscht eraus.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Hëlt en zoufällegt Element aus enger Lëscht eraus.", - "LISTS_SET_INDEX_INSERT": "asetzen op", - "LISTS_SET_INDEX_INPUT_TO": "als", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt en zuofällegt Element an eng Lëscht.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Setzt d'Element um Ënn vun enger Lëscht derbäi.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Setzt d'Element op eng zoufälleg Plaz an d'Lëscht derbäi.", - "PROCEDURES_DEFNORETURN_PROCEDURE": "eppes maachen", - "PROCEDURES_BEFORE_PARAMS": "mat:", - "PROCEDURES_CALL_BEFORE_PARAMS": "mat:", - "PROCEDURES_DEFRETURN_RETURN": "zréck" -} diff --git a/msg/json/lki.json b/msg/json/lki.json deleted file mode 100644 index b7619f3567..0000000000 --- a/msg/json/lki.json +++ /dev/null @@ -1,304 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Hosseinblue", - "Lakzon" - ] - }, - "VARIABLES_DEFAULT_NAME": "آیتم", - "TODAY": "ایمڕۆ", - "DUPLICATE_BLOCK": "کؤپی کردن", - "ADD_COMMENT": "گةپ دائن", - "REMOVE_COMMENT": "گةپة پاک کة", - "EXTERNAL_INPUTS": "ورودیةل خروجی", - "INLINE_INPUTS": "ورودیةل نوم جا", - "DELETE_BLOCK": "پاک کردن بلاک", - "DELETE_X_BLOCKS": "حةذف %1 بلاکةل", - "DELETE_ALL_BLOCKS": "حةذف کؤل %1 بلاکةل?", - "CLEAN_UP": "تمیزکردن بلاکةل", - "COLLAPSE_BLOCK": "چؤیچانن/پشکانن بلاک", - "COLLAPSE_ALL": "چؤیچانن/پشکانن بلاکةل", - "EXPAND_BLOCK": "کةلنگآ کردِن بلاک", - "EXPAND_ALL": "کةلنگآ کردِن بلاکةل", - "DISABLE_BLOCK": "إ کارکةتن بلاک", - "ENABLE_BLOCK": "إ کارآشتن بلاک", - "HELP": "کؤمةک", - "CHAT": "!وةگةرد هؤمکارةتان وة نام ئئ کادرة گةپ بةن", - "AUTH": "لطفا ئئ اپلیکیشن را ثبت کةن و آثارتان فعال کةن تا ذخیره بو و اجازهٔ اشتراک‌ نیائن توسط هؤمة بو", - "ME": "مإ", - "CHANGE_VALUE_TITLE": "تةغییر مقدار:", - "NEW_VARIABLE": "متغیر تازه...", - "NEW_VARIABLE_TITLE": "نام متغیر تازه:", - "RENAME_VARIABLE": "تغییر نام متغیر...", - "RENAME_VARIABLE_TITLE": "تغییر نام همهٔ متغیرهای «%1» به:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/رةنگ", - "COLOUR_PICKER_TOOLTIP": "رةنگێ إژ تةختة رةنگ انتخاب کةن", - "COLOUR_RANDOM_TITLE": "رةنگ بةختةکی", - "COLOUR_RANDOM_TOOLTIP": ".رةنگئ بةختةکی انتخاب کةن", - "COLOUR_RGB_TITLE": "رةنگ وة", - "COLOUR_RGB_RED": "سۆر", - "COLOUR_RGB_GREEN": "سؤز", - "COLOUR_RGB_BLUE": "کاوو", - "COLOUR_RGB_TOOLTIP": "ساخت یک رنگ با مقدار مشخص‌شده‌ای از سۆر، سؤز و کاوو. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند.", - "COLOUR_BLEND_TITLE": "قاتی پاتی", - "COLOUR_BLEND_COLOUR1": "رةنگ 1", - "COLOUR_BLEND_COLOUR2": "رةنگ 2", - "COLOUR_BLEND_RATIO": "نسبت", - "COLOUR_BLEND_TOOLTIP": "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)", - "CONTROLS_REPEAT_HELPURL": "https://lki.wikipedia.org/wiki/حلقه_فور", - "CONTROLS_REPEAT_TITLE": "%بار تکرار 1", - "CONTROLS_REPEAT_INPUT_DO": "انجوم بی", - "CONTROLS_REPEAT_TOOLTIP": "انجام چةن عبارت چندین گِل.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "تکرار در حالی که", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "تکرار تا وةختێ گإ", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "تا زمانی که یک مقدار صحیح است، چند عبارت را انجام بده.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "تا زمانی که یک مقدار ناصحیح است، چند عبارت را انجام بده.", - "CONTROLS_FOR_TOOLTIP": "متغیر %1 را در مقادیر شروع‌شده از عدد انتهای به عدد انتهایی را دارد، با فواصل مشخص‌شده می‌شمارد و این بلوک مشخص‌شده را انجام می‌دهد.", - "CONTROLS_FOR_TITLE": "با تعداد %1 از %2 به %3 با گام‌های %4", - "CONTROLS_FOREACH_TITLE": "ئةرا هر مورد %1 وۀ نام لیست%2", - "CONTROLS_FOREACH_TOOLTIP": "برای هر مورد در این فهرست، تنظیم متغیر «%1» به مورد و انجام تعدادی عبارت.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "شکانِن حلقه", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ادامه با تکرار بعدی حلقه", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "شکستن حلقهٔ شامل.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "پریدن از بقیهٔ حلقه و ادامه با تکرار بعدی.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "اخطار: این بلوک ممکن است فقط داخل یک حلقه استفاده شود.", - "CONTROLS_IF_TOOLTIP_1": "اگر یک مقدار صحیح است، سپس چند عبارت را انجام بده.", - "CONTROLS_IF_TOOLTIP_2": "اگر یک مقدار صحیح است، اول بلوک اول عبارات را انجام بده. در غیر این صورت بلوک دوم عبارات انجام بده.", - "CONTROLS_IF_TOOLTIP_3": "اگر مقدار اول صحیح بود، از آن بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم صحیح است، بلوک دوم عبارات را انجام بده.", - "CONTROLS_IF_TOOLTIP_4": "اگر مقدار اول درست است، بلوک اول عبارات را انجام بده. در غیر این صورت، اگر مقدار دوم درست باشد بلوک دوم عبارات را انجام بده. اگر هیچ از مقادیر درست نبود، آخرین بلوک عبارات را انجام بده.", - "CONTROLS_IF_MSG_IF": "اگر", - "CONTROLS_IF_MSG_ELSEIF": "اگر آنگاه", - "CONTROLS_IF_MSG_ELSE": "آنگاه", - "CONTROLS_IF_IF_TOOLTIP": "افزودن، حذف یا بازمرتب‌سازی قسمت‌ها برای پیکربندی دوبارهٔ این بلوک اگر.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "افزودن یک شرط به بلوک اگر.", - "CONTROLS_IF_ELSE_TOOLTIP": "اضافه‌کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "برگرداندن صحیح اگر هر دو ورودی با یکدیگر برابر نباشند.", - "LOGIC_COMPARE_TOOLTIP_LT": "بازگرداندن صحیح اگر ورودی اول کوچکتر از ورودی دوم باشد.", - "LOGIC_COMPARE_TOOLTIP_LTE": "بازگرداندن صحیح اگر ورودی اول کوچکتر یا مساوی با ورودی دوم باشد.", - "LOGIC_COMPARE_TOOLTIP_GT": "بازگرداندن صحیح اگر ورودی اول بزرگتر از ورودی دوم باشد.", - "LOGIC_COMPARE_TOOLTIP_GTE": "بازگرداندن صحیح اگر ورودی اول بزرگتر یا مساوی یا ورودی دوم باشد.", - "LOGIC_OPERATION_TOOLTIP_AND": "بازگرداندن صحیح اگر هر دو ورودی صحیح باشد.", - "LOGIC_OPERATION_AND": "و", - "LOGIC_OPERATION_TOOLTIP_OR": "بازگرداندن صحیح اگر یکی از دو ورودی صحیح باشد.", - "LOGIC_OPERATION_OR": "یا", - "LOGIC_NEGATE_TITLE": "نه %1", - "LOGIC_NEGATE_TOOLTIP": "صجیج باز می‌گرداند اگر ورودی نا صحیح باشند. ناصحیح بازمی‌گرداند اگر ورودی صحیح باشد.", - "LOGIC_BOOLEAN_TRUE": "درست", - "LOGIC_BOOLEAN_FALSE": "نادرست", - "LOGIC_BOOLEAN_TOOLTIP": "بازگرداندن یکی از صحیح یا ناصحیح.", - "LOGIC_NULL": "پةتی/خالی", - "LOGIC_NULL_TOOLTIP": "تهی باز می گرداند", - "LOGIC_TERNARY_CONDITION": "آزمائشت", - "LOGIC_TERNARY_IF_TRUE": "اگر درست", - "LOGIC_TERNARY_IF_FALSE": "اگر نادرست", - "LOGIC_TERNARY_TOOLTIP": "بررسی وضعیت در «آزمایش». اگر وضعیت صحیح باشد، مقدار «اگر صحیح» را بر می‌گرداند در غیر اینصورت مقدار «اگر ناصحیح» را.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "یک عدد.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "بازگرداندن مقدار جمع دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "بازگرداندن تفاوت دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "بازگرداندن حاصلضرب دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "بازگرداندن باقی‌ماندهٔ دو عدد.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "ریشهٔ دوم", - "MATH_SINGLE_TOOLTIP_ROOT": "ریشهٔ دوم یک عدد را باز می‌گرداند.", - "MATH_SINGLE_OP_ABSOLUTE": "مطلق", - "MATH_SINGLE_TOOLTIP_ABS": "قدر مطلق یک عدد را بازمی‌گرداند.", - "MATH_SINGLE_TOOLTIP_NEG": "منفی‌شدهٔ یک عدد را باز می‌گرداند.", - "MATH_SINGLE_TOOLTIP_LN": "لوگاریتم طبیعی یک عدد را باز می‌گرداند.", - "MATH_SINGLE_TOOLTIP_LOG10": "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد.", - "MATH_SINGLE_TOOLTIP_EXP": "بازگرداندن توان e یک عدد.", - "MATH_SINGLE_TOOLTIP_POW10": "بازگرداندن توان ۱۰ یک عدد.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "بازگرداندن سینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_COS": "بازگرداندن کسینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_TAN": "بازگرداندن تانژانت یک درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_ASIN": ".(بازگرداندن آرک‌سینوس درجه (نه رادیان", - "MATH_TRIG_TOOLTIP_ACOS": "بازگرداندن آرک‌کسینوس درجه (نه رادیان).", - "MATH_TRIG_TOOLTIP_ATAN": "بازگرداندن آرک‌تانژانت درجه (نه رادیان).", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت).", - "MATH_IS_EVEN": "زوج است", - "MATH_IS_ODD": "فرد است", - "MATH_IS_PRIME": "عدد اول است", - "MATH_IS_WHOLE": "کامل است", - "MATH_IS_POSITIVE": "مثبت است", - "MATH_IS_NEGATIVE": "منفی است", - "MATH_IS_DIVISIBLE_BY": "تقسیم شده بر", - "MATH_IS_TOOLTIP": "بررسی می‌کند که آیا یک عدد زوج، فرد، اول، کامل، مثبت، منفی یا بخش‌پذیر عدد خاصی باشد را بررسی می‌کند. درست یا نادرست باز می‌گرداند.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "تغییر %1 با %2", - "MATH_CHANGE_TOOLTIP": "افزودن یک عدد به متغیر '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "گردکردن یک عدد به بالا یا پایین.", - "MATH_ROUND_OPERATOR_ROUND": "گردکردن", - "MATH_ROUND_OPERATOR_ROUNDUP": "گرد به بالا", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "گرد به پایین", - "MATH_ONLIST_OPERATOR_SUM": "جمع لیست", - "MATH_ONLIST_TOOLTIP_SUM": "جمع همهٔ عددهای فهرست را باز می‌گرداند.", - "MATH_ONLIST_OPERATOR_MIN": "گوجةرتةرین لیست", - "MATH_ONLIST_TOOLTIP_MIN": "کوچک‌ترین عدد در فهرست را باز می‌گرداند.", - "MATH_ONLIST_OPERATOR_MAX": "بزرگ‌ترین فهرست", - "MATH_ONLIST_TOOLTIP_MAX": "بزرگ‌ترین عدد در فهرست را باز می‌گرداند.", - "MATH_ONLIST_OPERATOR_AVERAGE": "میانگین فهرست", - "MATH_ONLIST_TOOLTIP_AVERAGE": "میانگین (میانگین ریاضی) مقادیر عددی فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_MEDIAN": "میانهٔ فهرست", - "MATH_ONLIST_TOOLTIP_MEDIAN": "میانهٔ عدد در فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_MODE": "مد فهرست", - "MATH_ONLIST_TOOLTIP_MODE": "شایع‌ترین قلم(های) در فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_STD_DEV": "انحراف معیار فهرست", - "MATH_ONLIST_TOOLTIP_STD_DEV": "انحراف معیار فهرست را بر می‌گرداند.", - "MATH_ONLIST_OPERATOR_RANDOM": "مورد تصادفی از فهرست", - "MATH_ONLIST_TOOLTIP_RANDOM": "موردی تصادفی از فهرست را بر می‌گرداند.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "باقی‌ماندهٔ %1 + %2", - "MATH_MODULO_TOOLTIP": "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند.", - "MATH_CONSTRAIN_TITLE": "محدودکردن %1 پایین %2 بالا %3", - "MATH_CONSTRAIN_TOOLTIP": "محدودکردن یک عدد بین محدودیت‌های مشخص‌شده (بسته).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "عدد صحیح تصادفی بین %1 تا %2", - "MATH_RANDOM_INT_TOOLTIP": "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "کسر تصادفی", - "MATH_RANDOM_FLOAT_TOOLTIP": "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "یک حرف، کلمه یا خطی از متن.", - "TEXT_JOIN_TITLE_CREATEWITH": "ایجاد متن با", - "TEXT_JOIN_TOOLTIP": "یک تکه‌ای از متن را با چسپاندن همهٔ تعداد از موارد ایجاد می‌کند.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "نام نؤیسی", - "TEXT_CREATE_JOIN_TOOLTIP": "اضافه‌کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "افزودن یک مورد به متن.", - "TEXT_APPEND_TO": "به", - "TEXT_APPEND_APPENDTEXT": "چسباندن متن", - "TEXT_APPEND_TOOLTIP": "الحاق متنی به متغیر «%1».", - "TEXT_LENGTH_TITLE": "طول %1", - "TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده.", - "TEXT_ISEMPTY_TITLE": "%1 خالی است", - "TEXT_ISEMPTY_TOOLTIP": "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است.", - "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد ۰ باز می‌گرداند.", - "TEXT_INDEXOF_INPUT_INTEXT": "در متن", - "TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب", - "TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب", - "TEXT_CHARAT_INPUT_INTEXT": "در متن", - "TEXT_CHARAT_FROM_START": "گرفتن حرف #", - "TEXT_CHARAT_FROM_END": "گرفتن حرف # از آخر", - "TEXT_CHARAT_FIRST": "گرفتن اولین حرف", - "TEXT_CHARAT_LAST": "گرفتن آخرین حرف", - "TEXT_CHARAT_RANDOM": "گرفتن حرف تصادفی", - "TEXT_CHARAT_TOOLTIP": "حرفی در موقعیت مشخص‌شده بر می‌گرداند.", - "TEXT_GET_SUBSTRING_TOOLTIP": "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "در متن", - "TEXT_GET_SUBSTRING_START_FROM_START": "گرفتن زیرمتن از حرف #", - "TEXT_GET_SUBSTRING_START_FROM_END": "گرفتن زیرمتن از حرف # به انتها", - "TEXT_GET_SUBSTRING_START_FIRST": "گرفتن زیرمتن از اولین حرف", - "TEXT_GET_SUBSTRING_END_FROM_START": "به حرف #", - "TEXT_GET_SUBSTRING_END_FROM_END": "به حرف # از انتها", - "TEXT_GET_SUBSTRING_END_LAST": "به آخرین حرف", - "TEXT_CHANGECASE_TOOLTIP": "بازگرداندن کپی متن در حالتی متفاوت.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "به حروف بزرگ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "به حروف کوچک", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "به حروف بزرگ عنوان", - "TEXT_TRIM_TOOLTIP": "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند.", - "TEXT_TRIM_OPERATOR_BOTH": "تراشیدن فاصله‌ها از هر دو طرف", - "TEXT_TRIM_OPERATOR_LEFT": "تراشیدن فاصله‌ها از طرف چپ", - "TEXT_TRIM_OPERATOR_RIGHT": "تراشیدن فاصله‌ها از طرف چپ", - "TEXT_PRINT_TITLE": "چاپ %1", - "TEXT_PRINT_TOOLTIP": "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده.", - "TEXT_PROMPT_TYPE_TEXT": "اعلان برای متن با پیام", - "TEXT_PROMPT_TYPE_NUMBER": "اعلان برای عدد با پیام", - "TEXT_PROMPT_TOOLTIP_NUMBER": "اعلان برای کاربر با یک عدد.", - "TEXT_PROMPT_TOOLTIP_TEXT": "اعلان برای کاربر برای یک متن.", - "LISTS_CREATE_EMPTY_TITLE": "ایجاد فهرست خالی", - "LISTS_CREATE_EMPTY_TOOLTIP": "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند.", - "LISTS_CREATE_WITH_TOOLTIP": "فهرستی از هر عددی از موارد می‌سازد.", - "LISTS_CREATE_WITH_INPUT_WITH": "ایجاد فهرست با", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "لیست", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "اضافه‌کردن، حذف‌کردن یا ترتیب‌سازی مجدد بخش‌ها این بلوک فهرستی.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "اضافه‌کردن یک مورد به فهرست.", - "LISTS_REPEAT_TOOLTIP": "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد.", - "LISTS_REPEAT_TITLE": "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد", - "LISTS_LENGTH_TITLE": "طول %1", - "LISTS_LENGTH_TOOLTIP": "طول یک فهرست را برمی‌گرداند.", - "LISTS_ISEMPTY_TITLE": "%1 خالی است", - "LISTS_ISEMPTY_TOOLTIP": "اگر فهرست خالی است مقدار صجیج بر می‌گرداند.", - "LISTS_INLIST": "در فهرست", - "LISTS_INDEX_OF_FIRST": "یافتن اولین رخ‌داد مورد", - "LISTS_INDEX_OF_LAST": "یافتن آخرین رخ‌داد مورد", - "LISTS_INDEX_OF_TOOLTIP": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. ۰ بر می‌گرداند اگر آیتم موجود نبود.", - "LISTS_GET_INDEX_GET": "گِرتِن", - "LISTS_GET_INDEX_GET_REMOVE": "گِرتِن و حةذف کردن", - "LISTS_GET_INDEX_REMOVE": "حةذف کردن", - "LISTS_GET_INDEX_FROM_END": "# إژ دؤما آخر", - "LISTS_GET_INDEX_FIRST": "إژ أؤةل", - "LISTS_GET_INDEX_LAST": "دؤمائن/آخرین", - "LISTS_GET_INDEX_RANDOM": "بةختةکی", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "موردی در محل مشخص‌شده بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "موردی در محل مشخص در فهرست بر می‌گرداند. #1 آخرین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "اولین مورد یک فهرست را بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "آخرین مورد در یک فهرست را بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "یک مورد تصادفی در یک فهرست بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 اولین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند. #1 آخرین مورد است.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "اولین مورد را در یک فهرست حذف می‌کند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "آخرین مورد را در یک فهرست حذف می‌کند.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "یک مورد تصادفی را یک فهرست حذف می‌کند.", - "LISTS_SET_INDEX_SET": "مجموعه", - "LISTS_SET_INDEX_INSERT": "درج در", - "LISTS_SET_INDEX_INPUT_TO": "به عنوان", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد. #1 آخرین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "اولین مورد در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "آخرین مورد در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "یک مورد تصادفی در یک فهرست را تعیین می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 اولین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند. #1 آخرین مورد است.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "موردی به ته فهرست اضافه می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "موردی به ته فهرست الحاق می‌کند.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "مورد را به صورت تصادفی در یک فهرست می‌افزاید.", - "LISTS_GET_SUBLIST_START_FROM_START": "گرفتن زیرمجموعه‌ای از #", - "LISTS_GET_SUBLIST_START_FROM_END": "گرفتن زیرمجموعه‌ای از # از انتها", - "LISTS_GET_SUBLIST_START_FIRST": "گرفتن زیرمجموعه‌ای از ابتدا", - "LISTS_GET_SUBLIST_END_FROM_START": "به #", - "LISTS_GET_SUBLIST_END_FROM_END": "به # از انتها", - "LISTS_GET_SUBLIST_END_LAST": "به آخرین", - "LISTS_GET_SUBLIST_TOOLTIP": "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند.", - "LISTS_SPLIT_LIST_FROM_TEXT": "ساخت لیست إژ متن", - "LISTS_SPLIT_TEXT_FROM_LIST": "ساخت متن إژ لیست", - "LISTS_SPLIT_WITH_DELIMITER": "همراه جداساز", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Split text into a list of texts, breaking at each delimiter.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Join a list of texts into one text, separated by a delimiter.", - "VARIABLES_GET_TOOLTIP": "مقدار این متغیر را بر می‌گرداند.", - "VARIABLES_GET_CREATE_SET": "درست‌کردن «تنظیم %1»", - "VARIABLES_SET": "مجموعه %1 به %2", - "VARIABLES_SET_TOOLTIP": "متغیر برابر با خروجی را مشخص می‌کند.", - "VARIABLES_SET_CREATE_GET": "درست‌کردن «گرفتن %1»", - "PROCEDURES_DEFNORETURN_TITLE": "به", - "PROCEDURES_DEFNORETURN_PROCEDURE": "انجام چیزی", - "PROCEDURES_BEFORE_PARAMS": "با:", - "PROCEDURES_CALL_BEFORE_PARAMS": "با:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "تابعی می‌سازد بدون هیچ خروجی.", - "PROCEDURES_DEFRETURN_RETURN": "بازگشت", - "PROCEDURES_DEFRETURN_TOOLTIP": "تابعی با یک خروجی می‌سازد.", - "PROCEDURES_ALLOW_STATEMENTS": "اجازه اظهارات", - "PROCEDURES_DEF_DUPLICATE_WARNING": "اخطار: این تابعی پارامتر تکراری دارد.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1».", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "ورودی‌ها", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع.", - "PROCEDURES_MUTATORARG_TITLE": "نام ورودی:", - "PROCEDURES_MUTATORARG_TOOLTIP": "اضافه کردن ورودی به تابع.", - "PROCEDURES_HIGHLIGHT_DEF": "برجسته‌سازی تعریف تابع", - "PROCEDURES_CREATE_DO": "ساختن «%1»", - "PROCEDURES_IFRETURN_TOOLTIP": "اگر یک مقدار صحیح است، مقدار دوم را برگردان.", - "PROCEDURES_IFRETURN_WARNING": "اخطار: این بلوک احتمالاً فقط داخل یک تابع استفاده می‌شود." -} diff --git a/msg/json/lrc.json b/msg/json/lrc.json deleted file mode 100644 index 52e432b255..0000000000 --- a/msg/json/lrc.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Mogoeilor" - ] - }, - "VARIABLES_DEFAULT_NAME": "قلم", - "TODAY": "ئمروٙ", - "DUPLICATE_BLOCK": "کپی کردن", - "ADD_COMMENT": "نظرتونه اضاف بکید", - "REMOVE_COMMENT": "نظر جا وه جا کو", - "EXTERNAL_INPUTS": "داده یا وه دری", - "INLINE_INPUTS": "داده یا مئنجا", - "DELETE_BLOCK": "پاکسا کردن برشت", - "DELETE_X_BLOCKS": "پاکسا کردن%1 د برشتیا", - "COLLAPSE_BLOCK": "کوچک کردن برشت", - "COLLAPSE_ALL": "کوچک کردن برشتیا", - "EXPAND_BLOCK": "گپ کردن برشت", - "EXPAND_ALL": "گپ کردن برشتیا", - "DISABLE_BLOCK": "ناکشتگر کردن برشت", - "ENABLE_BLOCK": "کنشتگر کردن برشت", - "HELP": "هومياری", - "ME": "مه", - "CHANGE_VALUE_TITLE": "ارزشت آلشت کو:", - "NEW_VARIABLE": "آلشتگر تازه...", - "NEW_VARIABLE_TITLE": "نوم آلشتگر تازه:", - "RENAME_VARIABLE": "د نو نوم نیائن آلشتگر...", - "RENAME_VARIABLE_TITLE": "د نو نوم نیائن %1 د تموم آلشتگریا د:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "یه رن د رنگ دو انتخاو بکید", - "COLOUR_RANDOM_TITLE": "رن بختکی", - "COLOUR_RANDOM_TOOLTIP": "یه رنگ بختکی انتخاو بکید", - "COLOUR_RGB_TITLE": "رن وا", - "COLOUR_RGB_RED": "سور", - "COLOUR_RGB_GREEN": "سوز", - "COLOUR_RGB_BLUE": "آوی", - "COLOUR_BLEND_TITLE": "شیوسته", - "COLOUR_BLEND_COLOUR1": "رن 1", - "COLOUR_BLEND_COLOUR2": "رن 2", - "COLOUR_BLEND_RATIO": "نسوت", - "COLOUR_BLEND_TOOLTIP": "هر کوم د رنگیانه وا نسوت دائه بیه به شیون(0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "%1 تکرار کو چن بار", - "CONTROLS_REPEAT_INPUT_DO": "انجوم بئه", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "تا تکرار کو", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "تا تکرار کو", - "CONTROLS_FOR_TITLE": "اشماردن وا %1 د %2 سی %3 وا %4", - "CONTROLS_FOREACH_TITLE": "سی هر قلم %1 د نوم گه %2", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "حلقه نه خراو کو", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "حلقه شومل بیه نه خراو کو", - "CONTROLS_IF_MSG_IF": "ار", - "CONTROLS_IF_MSG_ELSEIF": "هنی ار", - "CONTROLS_IF_MSG_ELSE": "هنی", - "LOGIC_OPERATION_AND": "و", - "LOGIC_OPERATION_OR": "یا", - "LOGIC_NEGATE_TITLE": "نه %1", - "LOGIC_BOOLEAN_TRUE": "راست و دوروست", - "LOGIC_BOOLEAN_FALSE": "غلط", - "LOGIC_BOOLEAN_TOOLTIP": "هم غلط و هم راس ورگن", - "LOGIC_NULL": "خمثی", - "LOGIC_TERNARY_CONDITION": "آزماشت کردن", - "LOGIC_TERNARY_IF_TRUE": "ار درس بی", - "LOGIC_TERNARY_IF_FALSE": "ار غلط بی", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "یه شماره.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "وه انازه دو گل شماره ورگن.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "چارسوک ریشه", - "MATH_SINGLE_OP_ABSOLUTE": "تموم و کمال", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_IS_EVEN": "همیشه هیئش", - "MATH_IS_ODD": "تهنائه", - "MATH_IS_PRIME": "وه اوله", - "MATH_IS_WHOLE": "همشه", - "MATH_IS_POSITIVE": "مثبته", - "MATH_IS_NEGATIVE": "منفیه", - "MATH_IS_DIVISIBLE_BY": "یه وا بهر بیه", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "آلشت بكيد %1 وا %2", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_OPERATOR_ROUND": "گرد کردن", - "MATH_ROUND_OPERATOR_ROUNDUP": "وه رو گرد کردن", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "وه هار گرد کردن", - "MATH_ONLIST_OPERATOR_SUM": "جم کردن نومگه", - "MATH_ONLIST_OPERATOR_MIN": "کمترونه د نومگه", - "MATH_ONLIST_OPERATOR_MAX": "بیشترونه د نومگه", - "MATH_ONLIST_OPERATOR_AVERAGE": "مینجاگه نوم گه", - "MATH_ONLIST_OPERATOR_MEDIAN": "مینجا نوم گه", - "MATH_ONLIST_OPERATOR_MODE": "بیشری د نومگه", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_JOIN_TITLE_CREATEWITH": "راس کردن متن وا", - "TEXT_CREATE_JOIN_TITLE_JOIN": "پیوسن", - "TEXT_APPEND_TO": "سی", - "TEXT_ISEMPTY_TITLE": "%1 حالیه", - "TEXT_INDEXOF_INPUT_INTEXT": "د متن", - "TEXT_CHARAT_INPUT_INTEXT": "د متن", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "د متن", - "TEXT_GET_SUBSTRING_END_FROM_START": "سی واج#", - "TEXT_GET_SUBSTRING_END_FROM_END": "سی واج# تا آخر", - "TEXT_GET_SUBSTRING_END_LAST": "سی آخرین واج", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "سی حرف گپ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "سی واج کؤچک", - "LISTS_CREATE_EMPTY_TITLE": "یه گل نوم گه حالی راس بکیت", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "نوم گه", - "LISTS_ISEMPTY_TITLE": "%1 حالیه", - "LISTS_INLIST": "د نوم گه", - "LISTS_GET_INDEX_GET": "گرتن", - "LISTS_GET_INDEX_GET_REMOVE": "گرتن و جاوه جا بیئن", - "LISTS_GET_INDEX_REMOVE": "ؤرداشتن", - "LISTS_GET_INDEX_FROM_END": "# تا آخر", - "LISTS_GET_INDEX_FIRST": "اولی", - "LISTS_GET_INDEX_LAST": "آخر", - "LISTS_GET_INDEX_RANDOM": "بختكی", - "LISTS_SET_INDEX_INSERT": "بنه د", - "LISTS_SET_INDEX_INPUT_TO": "چی", - "LISTS_GET_SUBLIST_END_FROM_START": "سی#", - "LISTS_GET_SUBLIST_END_LAST": "سی آخر", - "VARIABLES_SET": "میزوکاری %1 سی %2", - "PROCEDURES_DEFNORETURN_TITLE": "سی", - "PROCEDURES_DEFNORETURN_PROCEDURE": "یه کار انجوم بیئت", - "PROCEDURES_BEFORE_PARAMS": "وا:", - "PROCEDURES_CALL_BEFORE_PARAMS": "وا:", - "PROCEDURES_DEFRETURN_RETURN": "ورگنیئن", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_MUTATORCONTAINER_TITLE": "داده یا", - "PROCEDURES_MUTATORARG_TITLE": "نوم داده:", - "PROCEDURES_CREATE_DO": "راس کردن%1" -} diff --git a/msg/json/lt.json b/msg/json/lt.json deleted file mode 100644 index 2c23fc5af0..0000000000 --- a/msg/json/lt.json +++ /dev/null @@ -1,233 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Eitvys200", - "Jurgis", - "Zygimantus" - ] - }, - "VARIABLES_DEFAULT_NAME": "elementas", - "TODAY": "Šiandien", - "DUPLICATE_BLOCK": "Kopijuoti", - "ADD_COMMENT": "Palikti komentarą", - "REMOVE_COMMENT": "Pašalinti komentarą", - "EXTERNAL_INPUTS": "Išdėstyti stulpeliu, kai daug parametrų", - "INLINE_INPUTS": "Išdėstyti vienoje eilutėje", - "DELETE_BLOCK": "Ištrinti bloką", - "DELETE_X_BLOCKS": "Ištrinti %1 blokus", - "CLEAN_UP": "Išvalyti blokus", - "COLLAPSE_BLOCK": "Suskleisti bloką", - "COLLAPSE_ALL": "Suskleisti blokus", - "EXPAND_BLOCK": "Išskleisti bloką", - "EXPAND_ALL": "Išskleisti blokus", - "DISABLE_BLOCK": "Išjungti bloką", - "ENABLE_BLOCK": "Įjungti bloką", - "HELP": "Pagalba", - "CHAT": "Galite susirašinėti su projekto bendradarbiais.", - "AUTH": "Norint išsaugoti (ir dalintis) savo sukurtas programas, reikia prisijungti (autorizuotis).", - "ME": "Mane", - "CHANGE_VALUE_TITLE": "Keisti reikšmę:", - "NEW_VARIABLE": "Naujas kintamasis...", - "NEW_VARIABLE_TITLE": "Naujo kintamojo pavadinimas:", - "RENAME_VARIABLE": "Pervardyti kintamajį...", - "RENAME_VARIABLE_TITLE": "Pervadinti visus '%1' kintamuosius į:", - "COLOUR_PICKER_HELPURL": "https://lt.wikipedia.org/wiki/Spalva", - "COLOUR_PICKER_TOOLTIP": "Pasirinkti spalvą iš paletės.", - "COLOUR_RANDOM_TITLE": "atsitiktinė spalva", - "COLOUR_RANDOM_TOOLTIP": "Pasirinkti spalvą atsitiktinai.", - "COLOUR_RGB_TITLE": "spalva su", - "COLOUR_RGB_RED": "raudona", - "COLOUR_RGB_GREEN": "žalia", - "COLOUR_RGB_BLUE": "mėlyna", - "COLOUR_RGB_TOOLTIP": "Spalvą galima sudaryti iš raudonos, žalios ir mėlynos dedamųjų. Kiekvienos intensyvumas nuo 0 iki 100.", - "COLOUR_BLEND_TITLE": "sumaišyk", - "COLOUR_BLEND_COLOUR1": "1 spalva", - "COLOUR_BLEND_COLOUR2": "2 spalva", - "COLOUR_BLEND_RATIO": "santykis", - "COLOUR_BLEND_TOOLTIP": "Sumaišo dvi spalvas su pateiktu santykiu (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "pakartokite %1 kartus", - "CONTROLS_REPEAT_INPUT_DO": "daryti", - "CONTROLS_REPEAT_TOOLTIP": "Leidžia atlikti išvardintus veiksmus kelis kartus.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "kartok kol", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "kartok, kol pasieksi", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Kartoja veiksmus, kol sąlyga tenkinama.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Kartoja veiksmus, kol bus pasiekta nurodyta sąlyga.", - "CONTROLS_FOR_TOOLTIP": "Kartoti veiksmus su kiekvienu sąrašo elementu, priskirtu kintamajam \"%1\".", - "CONTROLS_FOR_TITLE": "kartok, kai %1 kinta nuo %2 iki %3 po %4", - "CONTROLS_FOREACH_TITLE": "kartok su kiekvienu %1 iš sąrašo %2", - "CONTROLS_FOREACH_TOOLTIP": "Kartok veiksmus, kol kintamasis \"%1\" paeiliui gauna kiekvieną sąrašo reikšmę.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "nutraukti kartojimą", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "šį kartą praleisti likusius veiksmus ir tęsti kartojimą", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Nutraukia (artimiausią) vykstantį kartojimą.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Praleidžia žemiau išvardintus kartojimo veiksmus (ir tęsia darbą nuo kartojimo pradinio veiksmo).", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Atsargiai: šis blokas gali būt naudojamas tik kartojimo bloko viduje.", - "CONTROLS_IF_TOOLTIP_1": "Jeigu sąlyga tenkinama, tai atlik veiksmus.", - "CONTROLS_IF_TOOLTIP_2": "Jei sąlyga tenkinama, atlikti jai priklausančius veiksmus, o jei ne -- atlikti kitus nurodytus veiksmus.", - "CONTROLS_IF_TOOLTIP_3": "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus.", - "CONTROLS_IF_TOOLTIP_4": "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus. Kitais atvejais -- atlikti paskutinio bloko veiksmus.", - "CONTROLS_IF_MSG_IF": "jei", - "CONTROLS_IF_MSG_ELSEIF": "arba jei", - "CONTROLS_IF_MSG_ELSE": "kitu atveju", - "CONTROLS_IF_IF_TOOLTIP": "Galite pridėt/pašalinti/pertvarkyti sąlygų \"šakas\".", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Pridėti sąlygą „jei“ blokui.", - "CONTROLS_IF_ELSE_TOOLTIP": "Pridėti veiksmų vykdymo variantą/\"šaką\", kai netenkinama nė viena sąlyga.", - "LOGIC_COMPARE_TOOLTIP_EQ": "Tenkinama, jei abu reiškiniai lygūs.", - "LOGIC_OPERATION_TOOLTIP_AND": "Bus teisinga, kai abi sąlygos bus tenkinamos.", - "LOGIC_OPERATION_AND": "ir", - "LOGIC_OPERATION_OR": "arba", - "LOGIC_NEGATE_TITLE": "ne %1", - "LOGIC_BOOLEAN_TRUE": "tiesa", - "LOGIC_BOOLEAN_FALSE": "klaidinga", - "LOGIC_BOOLEAN_TOOLTIP": "Reikšmė gali būti \"teisinga\"/\"Taip\" arba \"klaidinga\"/\"Ne\".", - "LOGIC_NULL": "nieko", - "LOGIC_NULL_TOOLTIP": "Reikšmė nebuvo nurodyta...", - "LOGIC_TERNARY_CONDITION": "sąlyga", - "LOGIC_TERNARY_IF_TRUE": "jei taip", - "LOGIC_TERNARY_IF_FALSE": "jei ne", - "LOGIC_TERNARY_TOOLTIP": "Jeigu sąlygą tenkinama, grąžina pirmą reikšmę, o jei ne - antrąją.", - "MATH_NUMBER_HELPURL": "https://lt.wikipedia.org/wiki/Skaičius", - "MATH_NUMBER_TOOLTIP": "Skaičius.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Grąžina dviejų skaičių sumą.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Grąžina dviejų skaičių skirtumą.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Grąžina dviejų skaičių sandaugą.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Grąžina dviejų skaičių dalmenį.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Grąžina pirmą skaičių pakeltą laipsniu pagal antrą skaičių.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "kvadratinė šaknis", - "MATH_SINGLE_OP_ABSOLUTE": "modulis", - "MATH_SINGLE_TOOLTIP_ABS": "Skaičiaus modulis - reikšmė be ženklo (panaikina minusą).", - "MATH_SINGLE_TOOLTIP_NEG": "Grąžina skaičiui priešingą skaičių.", - "MATH_SINGLE_TOOLTIP_LN": "Grąžinti skaičiaus natūrinį logaritmą.", - "MATH_SINGLE_TOOLTIP_EXP": "Grąžinti skaičių laipsniu e.", - "MATH_SINGLE_TOOLTIP_POW10": "Grąžinti skaičių laipsniu 10.", - "MATH_TRIG_HELPURL": "https://lt.wikipedia.org/wiki/Trigonometrinės_funkcijos", - "MATH_TRIG_TOOLTIP_SIN": "Grąžinti laipsnio sinusą (ne radiano).", - "MATH_TRIG_TOOLTIP_COS": "Grąžinti laipsnio kosinusą (ne radiano).", - "MATH_TRIG_TOOLTIP_TAN": "Grąžinti laipsnio tangentą (ne radiano).", - "MATH_TRIG_TOOLTIP_ASIN": "Grąžinti skaičiaus arksinusą.", - "MATH_TRIG_TOOLTIP_ACOS": "Grąžinti skaičiaus arkkosinusą.", - "MATH_TRIG_TOOLTIP_ATAN": "Grąžinti skaičiaus arktangentą.", - "MATH_IS_EVEN": "yra lyginis", - "MATH_IS_ODD": "yra nelyginis", - "MATH_IS_PRIME": "yra pirminis", - "MATH_IS_WHOLE": "yra sveikasis", - "MATH_IS_POSITIVE": "yra teigiamas", - "MATH_IS_NEGATIVE": "yra neigiamas", - "MATH_IS_DIVISIBLE_BY": "yra dalus iš", - "MATH_IS_TOOLTIP": "Patikrina skaičiaus savybę: (ne)lyginis/pirminis/sveikasis/teigiamas/neigiamas/dalus iš x.", - "MATH_CHANGE_TITLE": "padidink %1 (emptypage) %2", - "MATH_CHANGE_TOOLTIP": "Prideda skaičių prie kintamojo '%1'. Kai skaičius neigiamas - gaunasi atimtis.", - "MATH_ROUND_OPERATOR_ROUND": "apvalink", - "MATH_ROUND_OPERATOR_ROUNDUP": "apvalink aukštyn", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "apvalink žemyn", - "MATH_ONLIST_OPERATOR_SUM": "suma", - "MATH_ONLIST_TOOLTIP_SUM": "didžiausia reikšmė", - "MATH_ONLIST_OPERATOR_MIN": "mažiausia reikšmė sąraše", - "MATH_ONLIST_OPERATOR_MAX": "didžiausia reikšmė sąraše", - "MATH_ONLIST_OPERATOR_AVERAGE": "vidurkis", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana sąrašui", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Grąžinti sąrašo medianą.", - "MATH_ONLIST_OPERATOR_MODE": "statistinė moda sąrašui", - "MATH_ONLIST_TOOLTIP_MODE": "Grąžinti sąrašą dažniausių elementų sąraše.", - "MATH_ONLIST_OPERATOR_STD_DEV": "standartinis nuokrypis sąraše", - "MATH_ONLIST_OPERATOR_RANDOM": "atsitiktinis elementas iš sąrašo", - "MATH_ONLIST_TOOLTIP_RANDOM": "Grąžinti atsitiktinį elementą iš sąrašo.", - "MATH_MODULO_TITLE": "dalybos liekana %1 ÷ %2", - "MATH_CONSTRAIN_TITLE": "apribok %1 tarp %2 ir %3", - "MATH_RANDOM_INT_TITLE": "atsitiktinis sveikas sk. nuo %1 iki %2", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "atsitiktinė trupmena", - "MATH_RANDOM_FLOAT_TOOLTIP": "Atsitiktinė trupmena nuo 0 (imtinai) iki 1 (neimtinai).", - "TEXT_TEXT_TOOLTIP": "Tekstas (arba žodis, ar raidė)", - "TEXT_JOIN_TITLE_CREATEWITH": "sukurti tekstą su", - "TEXT_CREATE_JOIN_TITLE_JOIN": "sujunk", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Pridėti teksto elementą.", - "TEXT_APPEND_TO": "prie", - "TEXT_APPEND_APPENDTEXT": "pridėk tekstą", - "TEXT_LENGTH_TITLE": "teksto %1 ilgis", - "TEXT_LENGTH_TOOLTIP": "Suranda teksto simbolių kiekį (įskaitant ir tarpus)", - "TEXT_ISEMPTY_TITLE": "%1 yra tuščias", - "TEXT_INDEXOF_INPUT_INTEXT": "tekste", - "TEXT_INDEXOF_OPERATOR_FIRST": "rask,kur pirmą kartą paminėta", - "TEXT_INDEXOF_OPERATOR_LAST": "rask,kur paskutinį kartą paminėta", - "TEXT_CHARAT_INPUT_INTEXT": "tekste", - "TEXT_CHARAT_FROM_START": "gauti raidę #", - "TEXT_CHARAT_FROM_END": "raidė nuo galo #", - "TEXT_CHARAT_FIRST": "gauti pirmą raidę", - "TEXT_CHARAT_LAST": "gauti paskutinę raidę", - "TEXT_CHARAT_RANDOM": "gauti atsitiktinę raidę", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "tekste", - "TEXT_GET_SUBSTRING_START_FROM_START": "dalis nuo raidės #", - "TEXT_GET_SUBSTRING_START_FROM_END": "dalis nuo raidės #", - "TEXT_GET_SUBSTRING_START_FIRST": "dalis nuo pradžios", - "TEXT_GET_SUBSTRING_END_FROM_START": "iki raidės #", - "TEXT_GET_SUBSTRING_END_FROM_END": "iki raidės nuo galo #", - "TEXT_GET_SUBSTRING_END_LAST": "iki pabaigos", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": " DIDŽIOSIOM RAIDĖM", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": " mažosiom raidėm", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": " Pavadinimo Raidėmis", - "TEXT_TRIM_OPERATOR_BOTH": "išvalyk tarpus šonuose", - "TEXT_TRIM_OPERATOR_LEFT": "išvalyk tarpus pradžioje", - "TEXT_TRIM_OPERATOR_RIGHT": "išvalyk tarpus pabaigoje", - "TEXT_PRINT_TITLE": "spausdinti %1", - "TEXT_PROMPT_TYPE_TEXT": "paprašyk įvesti tekstą :", - "TEXT_PROMPT_TYPE_NUMBER": "paprašyk įvesti skaičių :", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Prašyti vartotoją įvesti skaičių.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Prašyti vartotoją įvesti tekstą.", - "LISTS_CREATE_EMPTY_TITLE": "tuščias sąrašas", - "LISTS_CREATE_EMPTY_TOOLTIP": "Grąžina sąrašą, ilgio 0, neturintį duomenų", - "LISTS_CREATE_WITH_TOOLTIP": "Sukurti sąrašą iš bet kokio skaičiaus elementų.", - "LISTS_CREATE_WITH_INPUT_WITH": "sukurti sąrašą su", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "sąrašas", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Pridėti elementą į sąrašą.", - "LISTS_REPEAT_TITLE": "sukurk sąrašą, kuriame %1 bus %2 kartus", - "LISTS_LENGTH_TITLE": "ilgis %1", - "LISTS_LENGTH_TOOLTIP": "Grąžina sąrašo ilgį.", - "LISTS_ISEMPTY_TITLE": "%1 yra tuščias", - "LISTS_ISEMPTY_TOOLTIP": "Grąžina „true“, jeigu sąrašas tuščias.", - "LISTS_INLIST": "sąraše", - "LISTS_INDEX_OF_FIRST": "rask pirmą reikšmę", - "LISTS_INDEX_OF_LAST": "rask paskutinę reikšmę", - "LISTS_INDEX_OF_TOOLTIP": "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina 0, jei reikšmės neranda.", - "LISTS_GET_INDEX_GET": "paimk", - "LISTS_GET_INDEX_GET_REMOVE": "paimk ir ištrink", - "LISTS_GET_INDEX_REMOVE": "pašalinti", - "LISTS_GET_INDEX_FROM_END": "# nuo galo", - "LISTS_GET_INDEX_FIRST": "pirmas", - "LISTS_GET_INDEX_LAST": "paskutinis", - "LISTS_GET_INDEX_RANDOM": "atsitiktinis", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Grąžina pirmąjį sąrašo elementą.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Grąžina paskutinį elementą iš sąrašo.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Grąžina atsitiktinį elementą iš sąrašo.", - "LISTS_SET_INDEX_SET": "priskirk elementui", - "LISTS_SET_INDEX_INSERT": "įterpk į vietą", - "LISTS_SET_INDEX_INPUT_TO": "kaip", - "LISTS_GET_SUBLIST_START_FROM_START": "sąrašo dalis nuo #", - "LISTS_GET_SUBLIST_START_FROM_END": "sąrašo dalis nuo # nuo galo", - "LISTS_GET_SUBLIST_START_FIRST": "sąrašo dalis nuo pradžios", - "LISTS_GET_SUBLIST_END_FROM_START": "iki #", - "LISTS_GET_SUBLIST_END_FROM_END": "iki # nuo galo", - "LISTS_GET_SUBLIST_END_LAST": "iki galo", - "VARIABLES_GET_CREATE_SET": "Sukurk \"priskirk %1\"", - "VARIABLES_SET": "priskirk %1 = %2", - "VARIABLES_SET_CREATE_GET": "Sukurti 'kintamasis %1'", - "PROCEDURES_DEFNORETURN_TITLE": "komanda:", - "PROCEDURES_DEFNORETURN_PROCEDURE": "daryk kažką", - "PROCEDURES_BEFORE_PARAMS": "pagal:", - "PROCEDURES_CALL_BEFORE_PARAMS": "su:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Sukuria procedūrą - komandą, kuri nepateikia jokio rezultato (tik atlieka veiksmus).", - "PROCEDURES_DEFRETURN_RETURN": "duok", - "PROCEDURES_DEFRETURN_TOOLTIP": "Sukuria funkciją - komandą, kuri ne tik atlieka veiksmus bet ir pateikia (grąžina/duoda) rezultatą.", - "PROCEDURES_ALLOW_STATEMENTS": "leisti vidinius veiksmus", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Ši komanda turi du vienodus gaunamų duomenų pavadinimus.", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Vykdyti sukurtą komandą \"%1\".", - "PROCEDURES_CALLRETURN_TOOLTIP": "Įvykdyti komandą \"%1\" ir naudoti jos suskaičiuotą (atiduotą) reikšmę.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "gaunami duomenys (parametrai)", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tvarkyti komandos gaunamus duomenis (parametrus).", - "PROCEDURES_MUTATORARG_TITLE": "parametro pavadinimas:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Pridėti funkcijos parametrą (gaunamų duomenų pavadinimą).", - "PROCEDURES_CREATE_DO": "Sukurti \"%1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Jeigu pirma reikšmė yra teisinga (sąlyga tenkinama), grąžina antrą reikšmę.", - "PROCEDURES_IFRETURN_WARNING": "Perspėjimas: šis blokas gali būti naudojamas tik aprašant funkciją." -} diff --git a/msg/json/mk.json b/msg/json/mk.json deleted file mode 100644 index 4cb890cf09..0000000000 --- a/msg/json/mk.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Bjankuloski06" - ] - }, - "VARIABLES_DEFAULT_NAME": "елемент", - "DUPLICATE_BLOCK": "Ископирај", - "ADD_COMMENT": "Додај коментар:", - "REMOVE_COMMENT": "Отстрани коментар", - "EXTERNAL_INPUTS": "Надворешен внос", - "INLINE_INPUTS": "Внатрешен внос", - "DELETE_BLOCK": "Избриши блок", - "DELETE_X_BLOCKS": "Избриши %1 блока", - "DELETE_ALL_BLOCKS": "Да ги избришам сите %1 блокчиња?", - "COLLAPSE_BLOCK": "Собери блок", - "COLLAPSE_ALL": "Собери блокови", - "EXPAND_BLOCK": "Рашири го блокови", - "EXPAND_ALL": "Рашири блокови", - "DISABLE_BLOCK": "Исклучи блок", - "ENABLE_BLOCK": "Вклучи блок", - "HELP": "Помош", - "CHAT": "Разговарајте со вашиот соработник во ова поле!", - "AUTH": "Овластете го извршников за да можете да ја зачувате вашата работа и да можете да ја споделувате.", - "ME": "Мене", - "CHANGE_VALUE_TITLE": "Смена на вредност:", - "NEW_VARIABLE": "Нова променлива...", - "NEW_VARIABLE_TITLE": "Назив на новата променлива:", - "RENAME_VARIABLE": "Преименувај променлива...", - "RENAME_VARIABLE_TITLE": "Преименувај ги сите променливи „%1“ во:", - "COLOUR_PICKER_HELPURL": "https://mk.wikipedia.org/wiki/Боја", - "COLOUR_PICKER_TOOLTIP": "Изберете боја од палетата.", - "COLOUR_RANDOM_TITLE": "случајна боја", - "COLOUR_RANDOM_TOOLTIP": "Избери боја на тепка.", - "COLOUR_RGB_TITLE": "боја со", - "COLOUR_RGB_RED": "црвена", - "COLOUR_RGB_GREEN": "зелена", - "COLOUR_RGB_BLUE": "сина", - "COLOUR_RGB_TOOLTIP": "Создајте боја со укажаните износи на црвена, зелена и сина. Сите вредности мора да бидат помеѓу 0 и 100.", - "COLOUR_BLEND_TITLE": "смешај", - "COLOUR_BLEND_COLOUR1": "боја 1", - "COLOUR_BLEND_COLOUR2": "боја 2", - "COLOUR_BLEND_RATIO": "сооднос", - "COLOUR_BLEND_TOOLTIP": "Меша две бои во даден сооднос (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://mk.wikipedia.org/wiki/For-јамка", - "CONTROLS_REPEAT_TITLE": "повтори %1 пати", - "CONTROLS_REPEAT_INPUT_DO": "исполни", - "CONTROLS_REPEAT_TOOLTIP": "Исполнува наредби неколку пати.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "повторувај додека", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "повторувај сè до", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Додека вредноста е вистинита, исполнува наредби.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Додека вредноста е невистинита, исполнува наредби.", - "CONTROLS_FOR_TOOLTIP": "Променливата \"%1\" да ги земе вредностите од почетниот до завршниот број, броејќи според укажаниот интервал и ги исполнува укажаните блокови.", - "CONTROLS_FOR_TITLE": "број со %1 од %2 до %3 со %4", - "CONTROLS_FOREACH_TITLE": "за секој елемент %1 на списокот %2", - "CONTROLS_FOREACH_TOOLTIP": "Му ја задава променливата „%1“ на секој елемент на списокот, а потоа исполнува наредби.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "излези од јамката", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "продолжи со следното повторување на јамката", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Излези од содржечката јамка.", - "CONTROLS_IF_MSG_IF": "ако", - "CONTROLS_IF_MSG_ELSEIF": "инаку ако", - "CONTROLS_IF_MSG_ELSE": "инаку", - "CONTROLS_IF_IF_TOOLTIP": "Додава, отстранува или прередува делови за прераспоредување на овој блок „ако“.", - "LOGIC_COMPARE_HELPURL": "https://mk.wikipedia.org/wiki/Неравенство", - "LOGIC_COMPARE_TOOLTIP_EQ": "Дава вистина ако обата вноса се еднакви.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Дава вистина ако обата вноса не се еднакви.", - "LOGIC_COMPARE_TOOLTIP_LT": "Дава вистина ако првиот внос е помал од вториот.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Дава вистина ако првиот внос е помал или еднаков на вториот.", - "LOGIC_COMPARE_TOOLTIP_GT": "Дава вистина ако првиот внос е поголем од вториот.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Дава вистина ако првиот внос е поголем или еднаков на вториот.", - "LOGIC_OPERATION_TOOLTIP_AND": "Дава вистина ако обата вноса се вистинити.", - "LOGIC_OPERATION_AND": "и", - "LOGIC_OPERATION_TOOLTIP_OR": "Дава вистина ако барем еден од вносовите е вистинит.", - "LOGIC_OPERATION_OR": "или", - "LOGIC_NEGATE_TITLE": "не %1", - "LOGIC_NEGATE_TOOLTIP": "Дава вистина ако вносот е невистинит. Дава невистина ако вносот е вистинит.", - "LOGIC_BOOLEAN_TRUE": "вистина", - "LOGIC_BOOLEAN_FALSE": "невистина", - "LOGIC_BOOLEAN_TOOLTIP": "Дава или вистина или невистина.", - "LOGIC_NULL": "ништо", - "LOGIC_NULL_TOOLTIP": "Дава ништо.", - "LOGIC_TERNARY_CONDITION": "испробај", - "LOGIC_TERNARY_IF_TRUE": "ако е вистинито", - "LOGIC_TERNARY_IF_FALSE": "ако е невистинито", - "MATH_CONSTANT_HELPURL": "https://mk.wikipedia.org/wiki/Математичка_константа", - "MATH_CONSTANT_TOOLTIP": "Дава една од вообичаените константи: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), или ∞ (бесконечност).", - "MATH_IS_EVEN": "е парен", - "MATH_IS_ODD": "е непарен", - "MATH_IS_PRIME": "е прост", - "MATH_IS_WHOLE": "е цел", - "MATH_IS_POSITIVE": "е позитивен", - "MATH_IS_NEGATIVE": "е негативен", - "MATH_IS_DIVISIBLE_BY": "е делив со", - "MATH_IS_TOOLTIP": "Проверува дали бројот е парен, непарен, прост, цел, позитивен, негативен или делив со некој број. Дава вистина или невистина.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter?uselang=mk", - "MATH_CHANGE_TITLE": "повиши %1 за %2", - "MATH_CHANGE_TOOLTIP": "Ѝ додава број на променливата „%1“.", - "MATH_ROUND_HELPURL": "https://mk.wikipedia.org/wiki/Заокружување", - "MATH_ROUND_TOOLTIP": "Го заокружува бројот на поголем или помал.", - "MATH_ROUND_OPERATOR_ROUND": "заокружи", - "MATH_ROUND_OPERATOR_ROUNDUP": "заокружи на поголемо", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "заокружи на помало", - "MATH_ONLIST_OPERATOR_SUM": "збир од списокот", - "MATH_ONLIST_TOOLTIP_SUM": "Дава збир од сите броеви на списокот.", - "MATH_ONLIST_OPERATOR_MIN": "најмал на списокот", - "MATH_ONLIST_TOOLTIP_MIN": "Го дава најмалиот број на списокот.", - "MATH_ONLIST_OPERATOR_MAX": "најголем на списокот", - "MATH_ONLIST_TOOLTIP_MAX": "Го дава најголемиот број на списокот.", - "MATH_ONLIST_OPERATOR_AVERAGE": "просек на списокот", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Дава просек (аритметичка средина) од броевите на списокот.", - "MATH_ONLIST_OPERATOR_MEDIAN": "медијана на списокот", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Дава медијана од броевите на списокот.", - "MATH_ONLIST_OPERATOR_MODE": "модул на списокот", - "MATH_ONLIST_TOOLTIP_MODE": "Дава список на најзастапен(и) елемент(и) на списокот." -} diff --git a/msg/json/ms.json b/msg/json/ms.json deleted file mode 100644 index 2ee094a97d..0000000000 --- a/msg/json/ms.json +++ /dev/null @@ -1,317 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Anakmalaysia", - "Espertus" - ] - }, - "VARIABLES_DEFAULT_NAME": "Perkara", - "TODAY": "Hari ini", - "DUPLICATE_BLOCK": "Pendua", - "ADD_COMMENT": "Berikan Komen", - "REMOVE_COMMENT": "Padamkan Komen", - "EXTERNAL_INPUTS": "Input Luaran", - "INLINE_INPUTS": "Input Sebaris", - "DELETE_BLOCK": "Hapuskan Blok", - "DELETE_X_BLOCKS": "Hapuskan %1 Blok", - "DELETE_ALL_BLOCKS": "Hapuskan kesemua %1 blok?", - "COLLAPSE_BLOCK": "Lipat Blok", - "COLLAPSE_ALL": "Lipat Blok²", - "EXPAND_BLOCK": "Buka Blok", - "EXPAND_ALL": "Buka Blok²", - "DISABLE_BLOCK": "Matikan Blok", - "ENABLE_BLOCK": "Hidupkan Blok", - "HELP": "Bantuan", - "CHAT": "Bersembang dengan rakan kerjasama anda dengan menaip di dalam petak ini!", - "AUTH": "Sila benarkan aplikasi ini untuk membolehkan hasil kerja anda disimpan, malah dikongsikan oleh anda.", - "ME": "Saya", - "CHANGE_VALUE_TITLE": "Ubah nilai:", - "NEW_VARIABLE": "Pembolehubah baru...", - "NEW_VARIABLE_TITLE": "Nama pembolehubah baru:", - "RENAME_VARIABLE": "Tukar nama pembolehubah...", - "RENAME_VARIABLE_TITLE": "Tukar nama semua pembolehubah '%1' kepada:", - "COLOUR_PICKER_HELPURL": "https://ms.wikipedia.org/wiki/Warna", - "COLOUR_PICKER_TOOLTIP": "Pilih satu warna daripada palet.", - "COLOUR_RANDOM_TITLE": "warna rawak", - "COLOUR_RANDOM_TOOLTIP": "Pilih satu warna secara rawak.", - "COLOUR_RGB_TITLE": "warnakan", - "COLOUR_RGB_RED": "merah", - "COLOUR_RGB_GREEN": "hijau", - "COLOUR_RGB_BLUE": "biru", - "COLOUR_RGB_TOOLTIP": "Peroleh satu warna dengan menentukan amaun campuran merah, hijau dan biru. Kesemua nilai haruslah antara 0 hingga 100.", - "COLOUR_BLEND_TITLE": "adun", - "COLOUR_BLEND_COLOUR1": "warna 1", - "COLOUR_BLEND_COLOUR2": "warna 2", - "COLOUR_BLEND_RATIO": "nisbah", - "COLOUR_BLEND_TOOLTIP": "Campurkan dua warna sekali pada nisbah yang ditentukan (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "ulang %1 kali", - "CONTROLS_REPEAT_INPUT_DO": "lakukan", - "CONTROLS_REPEAT_TOOLTIP": "Lakukan perintah berulang kali.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ulangi apabila", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ulangi sehingga", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Lakukan beberapa perintah apabila nilainya benar (true).", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Lakukan beberapa perintah apabila nilainya palsu (false).", - "CONTROLS_FOR_TOOLTIP": "Gunakan pembolehubah \"%1\" pada nilai-nilai dari nombor pangkal hingga nombor hujung, mengira mengikut selang yang ditentukan, dan lakukan blok-blok yang tertentu.", - "CONTROLS_FOR_TITLE": "kira dengan %1 dari %2 hingga %3 selang %4", - "CONTROLS_FOREACH_TITLE": "untuk setiap perkara %1 dalam senarai %2", - "CONTROLS_FOREACH_TOOLTIP": "Untuk setiap perkara dalam senarai, tetapkan pembolehubah '%1' pada perkara, kemudian lakukan beberapa perintah.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "hentikan gelung", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "teruskan dengan lelaran gelung seterusnya", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Keluar dari gelung pengandung.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Langkau seluruh gelung yang tinggal dan bersambung dengan lelaran seterusnya.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Amaran: Blok ini hanya boleh digunakan dalam satu gelung.", - "CONTROLS_IF_TOOLTIP_1": "Jika nilai yang benar, lakukan beberapa penyata.", - "CONTROLS_IF_TOOLTIP_2": "Jika suatu nilai benar, lakukan penyata blok pertama. Jika tidak, bina penyata blok kedua.", - "CONTROLS_IF_TOOLTIP_3": "Jika nilai yang pertama adalah benar, lakukan penyata pertama blok. Sebaliknya, jika nilai kedua adalah benar, lakukan penyata blok kedua.", - "CONTROLS_IF_TOOLTIP_4": "Jika nilai yang pertama adalah benar, lakukan penyata blok pertama. Sebaliknya, jika nilai kedua adalah benar, lakukan penyata blok kedua. Jika tiada nilai adalah benar, lakukan penyata blok terakhir.", - "CONTROLS_IF_MSG_IF": "jika", - "CONTROLS_IF_MSG_ELSEIF": "lain jika", - "CONTROLS_IF_MSG_ELSE": "lain", - "CONTROLS_IF_IF_TOOLTIP": "Tambah, alih keluar, atau susun semula bahagian-bahagian untuk menyusun semula blok jika.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Tambah satu syarat kepada blok jika.", - "CONTROLS_IF_ELSE_TOOLTIP": "Tambah yang terakhir, alihkan semua keadaan ke blok jika.", - "LOGIC_COMPARE_HELPURL": "https://id.wikipedia.org/wiki/Pertidaksamaan", - "LOGIC_COMPARE_TOOLTIP_EQ": "Kembali benar jika kedua-dua input benar antara satu sama lain.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Taip balik benar jika kedua-dua input tidak sama.", - "LOGIC_COMPARE_TOOLTIP_LT": "Kembali benar jika input pertama adalah lebih kecil daripada input kedua.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Kembali benar jika input pertama adalah lebih kecil daripada atau sama dengan input kedua.", - "LOGIC_COMPARE_TOOLTIP_GT": "Kembali benar jika input pertama adalah lebih besar daripada input kedua.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Kembali benar jika input pertama adalah lebih besar daripada atau sama dengan input kedua.", - "LOGIC_OPERATION_TOOLTIP_AND": "Return true if both inputs are true.", - "LOGIC_OPERATION_AND": "dan", - "LOGIC_OPERATION_TOOLTIP_OR": "Return true if at least one of the inputs is true.", - "LOGIC_OPERATION_OR": "atau", - "LOGIC_NEGATE_TITLE": "bukan %1", - "LOGIC_NEGATE_TOOLTIP": "'Benar' akan dibalas jika inputnya salah. 'Salah' akan dibalas jika inputnya benar.", - "LOGIC_BOOLEAN_TRUE": "benar", - "LOGIC_BOOLEAN_FALSE": "palsu", - "LOGIC_BOOLEAN_TOOLTIP": "Kembalikan samada benar atau palsu.", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Returns null.", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "Jika benar", - "LOGIC_TERNARY_IF_FALSE": "Jika palsu", - "LOGIC_TERNARY_TOOLTIP": "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value.", - "MATH_NUMBER_HELPURL": "https://ms.wikipedia.org/wiki/Nombor", - "MATH_NUMBER_TOOLTIP": "Suatu nombor.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://ms.wikipedia.org/wiki/Aritmetik", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Kembalikan jumlah kedua-dua bilangan.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Taip balik hasil tolak dua nombor tersebut.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Taip balik hasil darab dua nombor tersebut.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Taip balik hasil bahagi dua nombor tersebut.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Return the first number raised to the power of the second number.", - "MATH_SINGLE_HELPURL": "https://ms.wikipedia.org/wiki/Punca_kuasa_dua", - "MATH_SINGLE_OP_ROOT": "Punca kuasa dua", - "MATH_SINGLE_TOOLTIP_ROOT": "Kembalikan punca kuasa nombor.", - "MATH_SINGLE_OP_ABSOLUTE": "mutlak", - "MATH_SINGLE_TOOLTIP_ABS": "Kembalikan nilai mutlak suatu nombor.", - "MATH_SINGLE_TOOLTIP_NEG": "Kembalikan nombor yang songsang.", - "MATH_SINGLE_TOOLTIP_LN": "Kembali dalam logaritma nombor asli.", - "MATH_SINGLE_TOOLTIP_LOG10": "Kembali logarithm 10 asas nombor.", - "MATH_SINGLE_TOOLTIP_EXP": "Kembalikan e kepada kuasa nombor.", - "MATH_SINGLE_TOOLTIP_POW10": "Kembalikan 10 kepada kuasa nombor.", - "MATH_TRIG_HELPURL": "https://ms.wikipedia.org/wiki/Fungsi_trigonometri", - "MATH_TRIG_TOOLTIP_SIN": "Kembalikan darjah sine (bukan radian).", - "MATH_TRIG_TOOLTIP_COS": "Kembalikan darjah kosinus (bukan radian).", - "MATH_TRIG_TOOLTIP_TAN": "Kembalikan darjah tangen (bukan radian).", - "MATH_TRIG_TOOLTIP_ASIN": "Kembalikan arcsince beberapa nombor.", - "MATH_TRIG_TOOLTIP_ACOS": "Kembali arccosine beberapa nombor.", - "MATH_TRIG_TOOLTIP_ATAN": "Kembalikan beberapa nombor arctangent.", - "MATH_CONSTANT_HELPURL": "https://ms.wikipedia.org/wiki/Pemalar_matematik", - "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).", - "MATH_IS_EVEN": "Adalah genap", - "MATH_IS_ODD": "aneh", - "MATH_IS_PRIME": "is prime", - "MATH_IS_WHOLE": "is whole", - "MATH_IS_POSITIVE": "adalah positif", - "MATH_IS_NEGATIVE": "negatif", - "MATH_IS_DIVISIBLE_BY": "Boleh dibahagikan dengan", - "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.", - "MATH_CHANGE_HELPURL": "https://id.wikipedia.org/wiki/Perjumlahan", - "MATH_CHANGE_TITLE": "perubahan %1 oleh %2", - "MATH_CHANGE_TOOLTIP": "Tambah nombor kepada pembolehubah '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Bulat nombor yang naik atau turun.", - "MATH_ROUND_OPERATOR_ROUND": "pusingan", - "MATH_ROUND_OPERATOR_ROUNDUP": "pusingan ke atas", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "Pusingan ke bawah", - "MATH_ONLIST_OPERATOR_SUM": "Jumlah senarai", - "MATH_ONLIST_TOOLTIP_SUM": "Kembalikan jumlah semua nombor dalam senarai.", - "MATH_ONLIST_OPERATOR_MIN": "min dalam senarai", - "MATH_ONLIST_TOOLTIP_MIN": "Kembalikan nombor terkecil dalam senarai.", - "MATH_ONLIST_OPERATOR_MAX": "Max senarai", - "MATH_ONLIST_TOOLTIP_MAX": "Pulangkan jumlah terbesar dalam senarai.", - "MATH_ONLIST_OPERATOR_AVERAGE": "purata daripada senarai", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Kembalikan purata (min aritmetik) nilai-nilai angka di dalam senarai.", - "MATH_ONLIST_OPERATOR_MEDIAN": "Median senarai", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Kembalikan nombor median dalam senarai.", - "MATH_ONLIST_OPERATOR_MODE": "jenis senarai", - "MATH_ONLIST_TOOLTIP_MODE": "Kembali senarai item yang paling biasa dalam senarai.", - "MATH_ONLIST_OPERATOR_STD_DEV": "sisihan piawai bagi senarai", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Kembali dengan sisihan piawai daripada senarai.", - "MATH_ONLIST_OPERATOR_RANDOM": "Item rawak daripada senarai", - "MATH_ONLIST_TOOLTIP_RANDOM": "Kembalikan elemen rawak daripada senarai.", - "MATH_MODULO_HELPURL": "https://id.wikipedia.org/wiki/Operasi_modulus", - "MATH_MODULO_TITLE": "remainder of %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Taip balik baki yang didapat daripada pembahagian dua nombor tersebut.", - "MATH_CONSTRAIN_TITLE": "constrain %1 low %2 high %3", - "MATH_CONSTRAIN_TOOLTIP": "Constrain a number to be between the specified limits (inclusive).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "integer rawak dari %1ke %2", - "MATH_RANDOM_INT_TOOLTIP": "Kembalikan integer rawak diantara dua had yang ditentukan, inklusif.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "pecahan rawak", - "MATH_RANDOM_FLOAT_TOOLTIP": "Kembali sebahagian kecil rawak antara 0.0 (inklusif) dan 1.0 (eksklusif).", - "TEXT_TEXT_HELPURL": "https://ms.wikipedia.org/wiki/Rentetan", - "TEXT_TEXT_TOOLTIP": "Huruf, perkataan, atau baris teks.", - "TEXT_JOIN_TITLE_CREATEWITH": "hasilkan teks dengan", - "TEXT_JOIN_TOOLTIP": "Hasilkan sebahagian teks dengan menghubungkan apa jua nombor item.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "Sertai", - "TEXT_CREATE_JOIN_TOOLTIP": "Add, remove, or reorder sections to reconfigure this text block.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Add an item to the text.", - "TEXT_APPEND_TO": "Untuk", - "TEXT_APPEND_APPENDTEXT": "append text", - "TEXT_APPEND_TOOLTIP": "Append some text to variable '%1'.", - "TEXT_LENGTH_TITLE": "panjang %1", - "TEXT_LENGTH_TOOLTIP": "Kembalikan jumlah huruf (termasuk ruang) dalam teks yang disediakan.", - "TEXT_ISEMPTY_TITLE": "%1 adalah kosong", - "TEXT_ISEMPTY_TOOLTIP": "Kembalikan benar jika teks yang disediakan adalah kosong.", - "TEXT_INDEXOF_TOOLTIP": "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan 0 Jika teks tidak ditemui.", - "TEXT_INDEXOF_INPUT_INTEXT": "dalam teks", - "TEXT_INDEXOF_OPERATOR_FIRST": "mencari kejadian pertama teks", - "TEXT_INDEXOF_OPERATOR_LAST": "mencari kejadian terakhir teks", - "TEXT_CHARAT_INPUT_INTEXT": "Dalam teks", - "TEXT_CHARAT_FROM_START": "get letter #", - "TEXT_CHARAT_FROM_END": "get letter # from end", - "TEXT_CHARAT_FIRST": "get first letter", - "TEXT_CHARAT_LAST": "Dapatkan abjad terakhir", - "TEXT_CHARAT_RANDOM": "Dapatkan abjad rawak", - "TEXT_CHARAT_TOOLTIP": "Returns the letter at the specified position.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Returns a specified portion of the text.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "dalam teks", - "TEXT_GET_SUBSTRING_START_FROM_START": "get substring from letter #", - "TEXT_GET_SUBSTRING_START_FROM_END": "get substring from letter # from end", - "TEXT_GET_SUBSTRING_START_FIRST": "get substring from first letter", - "TEXT_GET_SUBSTRING_END_FROM_START": "to letter #", - "TEXT_GET_SUBSTRING_END_FROM_END": "to letter # from end", - "TEXT_GET_SUBSTRING_END_LAST": "untuk huruf terakhir", - "TEXT_CHANGECASE_TOOLTIP": "Return a copy of the text in a different case.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "Kepada HURUF BESAR", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "Kepada huruf kecil", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "to Title Case", - "TEXT_TRIM_TOOLTIP": "Kembali salinan teks dengan ruang yang dikeluarkan daripada satu atau hujung kedua belah.", - "TEXT_TRIM_OPERATOR_BOTH": "mengurangkan kawasan dari kedua-dua belah", - "TEXT_TRIM_OPERATOR_LEFT": "mengurangkan ruang dari sebelah kiri", - "TEXT_TRIM_OPERATOR_RIGHT": "mengurangkan kawasan dari sisi kanan", - "TEXT_PRINT_TITLE": "cetak %1", - "TEXT_PRINT_TOOLTIP": "Cetak teks yang ditentukan, nombor atau nilai lain.", - "TEXT_PROMPT_TYPE_TEXT": "Prom untuk teks dengan mesej", - "TEXT_PROMPT_TYPE_NUMBER": "Prom untuk nombor dengan mesej", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Peringatan kepada pengguna untuk nombor.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Peringatkan pengguna untuk sebahagian teks.", - "LISTS_CREATE_EMPTY_TITLE": "Wujudkan senarai kosong", - "LISTS_CREATE_EMPTY_TOOLTIP": "Kembalikan senarai panjang 0, yang tidak mengandungi rekod data", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Wujudkan senarai dengan apa jua nombor item.", - "LISTS_CREATE_WITH_INPUT_WITH": "wujudkan senarai dengan", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "senarai", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Tambah, alih keluar, atau susun semula bahagian-bahagian untuk menyusun semula senarai blok.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Tambah item ke dalam senarai.", - "LISTS_REPEAT_TOOLTIP": "Wujudkan senarai yang terdiri daripada nilai berulang mengikut nombor yang ditentukan.", - "LISTS_REPEAT_TITLE": "wujudkan senarai dengan item %1 diulangi %2 kali", - "LISTS_LENGTH_TITLE": "panjang %1", - "LISTS_LENGTH_TOOLTIP": "Kembalikan panjang senarai", - "LISTS_ISEMPTY_TITLE": "%1 adalah kosong", - "LISTS_ISEMPTY_TOOLTIP": "Kembalikan benar jika senarai kosong.", - "LISTS_INLIST": "dalam senarai", - "LISTS_INDEX_OF_FIRST": "cari pertama item kejadian", - "LISTS_INDEX_OF_LAST": "cari kejadian akhir item", - "LISTS_INDEX_OF_TOOLTIP": "Kembalikan indeks kejadian pertama/terakhir item dalam senarai. Kembalikan 0 jika teks tidak ditemui.", - "LISTS_GET_INDEX_GET": "dapatkan", - "LISTS_GET_INDEX_GET_REMOVE": "dapat dan alihkan", - "LISTS_GET_INDEX_REMOVE": "alihkan", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# dari akhir", - "LISTS_GET_INDEX_FIRST": "pertama", - "LISTS_GET_INDEX_LAST": "terakhir", - "LISTS_GET_INDEX_RANDOM": "rawak", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai. #1 ialah item terakhir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai. #1 ialah item terakhir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Kembalikan item pertama dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Kembalikan item pertama dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Kembalikan item rawak dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai. #1 ialah item pertama.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai. #1 ialah item terakhir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Alihkan dan kembalikan item pertama dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Alihkan dan kembalikan item terakhir dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Alihkan dan kembalikan item rawak dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Alihkan item pada posisi mengikut spesifikasi dalam senarai. #1 ialah item pertama.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Alihkan item mengikut spesifikasi posisi dalam senarai. #1 ialah item terakhir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Alihkan item pertama dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Alihkan item terakhir dalam senarai.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Alihkan item rawak dalam senarai.", - "LISTS_SET_INDEX_SET": "set", - "LISTS_SET_INDEX_INSERT": "masukkan pada", - "LISTS_SET_INDEX_INPUT_TO": "sebagai", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Set item pertama dalam senarai.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Set item terakhir dalam senarai.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Set item rawak dalam senarai.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Masukkan item pada posisi yand ditentukan dalam senarai. #1 ialah item terakhir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Masukkan item pada posisi yang ditentukan dalam senarai. #1 ialah item terakhir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Selit item pada permulaan senarai.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Tambahkan item dalam senarai akhir.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Selit item secara rawak di dalam senarai.", - "LISTS_GET_SUBLIST_START_FROM_START": "dapatkan sub-senarai daripada #", - "LISTS_GET_SUBLIST_START_FROM_END": "dapatkan sub-senarai daripada # daripada terakhir", - "LISTS_GET_SUBLIST_START_FIRST": "dapatkan sub-senarai daripada pertama", - "LISTS_GET_SUBLIST_END_FROM_START": "ke #", - "LISTS_GET_SUBLIST_END_FROM_END": "ke # dari akhir", - "LISTS_GET_SUBLIST_END_LAST": "ke akhir", - "LISTS_GET_SUBLIST_TOOLTIP": "Wujudkan salinan bahagian yang ditentukan dari senarai.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "buat senarai dgn teks", - "LISTS_SPLIT_TEXT_FROM_LIST": "buat teks drpd senarai", - "LISTS_SPLIT_WITH_DELIMITER": "dengan delimiter", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Pecahkan teks kepada senarai teks, berpecah di setiap delimiter.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Cantumkan senarai teks menjadi satu teks, dipecahkan oleh delimiter.", - "VARIABLES_GET_TOOLTIP": "Kembalikan nilai pemboleh ubah ini.", - "VARIABLES_GET_CREATE_SET": "Hasilkan 'set %1'", - "VARIABLES_SET": "set %1 ke %2", - "VARIABLES_SET_TOOLTIP": "Set pembolehubah ini supaya sama dengan input.", - "VARIABLES_SET_CREATE_GET": "Hasilkan 'set %1'", - "PROCEDURES_DEFNORETURN_TITLE": "Untuk", - "PROCEDURES_DEFNORETURN_PROCEDURE": "Buat sesuatu", - "PROCEDURES_BEFORE_PARAMS": "dengan:", - "PROCEDURES_CALL_BEFORE_PARAMS": "dengan:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Menghasilkan suatu fungsi tanpa output.", - "PROCEDURES_DEFRETURN_RETURN": "kembali", - "PROCEDURES_DEFRETURN_TOOLTIP": "Mencipta satu fungsi dengan pengeluaran.", - "PROCEDURES_ALLOW_STATEMENTS": "bolehkan kenyataan", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Amaran: Fungsi ini mempunyai parameter yang berganda.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://ms.wikipedia.org/wiki/Fungsi", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Run the user-defined function '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://ms.wikipedia.org/wiki/Fungsi", - "PROCEDURES_CALLRETURN_TOOLTIP": "Run the user-defined function '%1' and use its output.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "Input-input", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tambah, alih keluar atau susun semula input pada fungsi ini.", - "PROCEDURES_MUTATORARG_TITLE": "Nama input:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Tambah satu input pada fungsi.", - "PROCEDURES_HIGHLIGHT_DEF": "Serlahkan definisi fungsi", - "PROCEDURES_CREATE_DO": "Hasilkan '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "If a value is true, then return a second value.", - "PROCEDURES_IFRETURN_WARNING": "Amaran: Blok ini hanya boleh digunakan dalam fungsi definisi." -} diff --git a/msg/json/nb.json b/msg/json/nb.json deleted file mode 100644 index 5d2314ce04..0000000000 --- a/msg/json/nb.json +++ /dev/null @@ -1,326 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Cocu", - "Kingu", - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "element", - "TODAY": "I dag", - "DUPLICATE_BLOCK": "duplikat", - "ADD_COMMENT": "Legg til kommentar", - "REMOVE_COMMENT": "Fjern kommentar", - "EXTERNAL_INPUTS": "Eksterne kilder", - "INLINE_INPUTS": "Interne kilder", - "DELETE_BLOCK": "Slett blokk", - "DELETE_X_BLOCKS": "Slett %1 blokker", - "DELETE_ALL_BLOCKS": "Slett alle %1 blokker?", - "COLLAPSE_BLOCK": "Skjul blokk", - "COLLAPSE_ALL": "Skjul blokker", - "EXPAND_BLOCK": "Utvid blokk", - "EXPAND_ALL": "Utvid blokker", - "DISABLE_BLOCK": "Deaktiver blokk", - "ENABLE_BLOCK": "Aktiver blokk", - "HELP": "Hjelp", - "CHAT": "Chat med din medarbeider ved å skrive i dette feltet!", - "AUTH": "Vennligst godkjenn at denne appen gjør det mulig for deg å lagre arbeidet slik at du kan dele det.", - "ME": "Jeg", - "CHANGE_VALUE_TITLE": "Bytt verdi:", - "NEW_VARIABLE": "Ny variabel...", - "NEW_VARIABLE_TITLE": "Nytt variabelnavn:", - "RENAME_VARIABLE": "Gi nytt navn til variabel...", - "RENAME_VARIABLE_TITLE": "Endre navnet til alle '%1' variabler til:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Velg en farge fra paletten.", - "COLOUR_RANDOM_TITLE": "tilfeldig farge", - "COLOUR_RANDOM_TOOLTIP": "Velg en tilfeldig farge.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "farge med", - "COLOUR_RGB_RED": "rød", - "COLOUR_RGB_GREEN": "grønn", - "COLOUR_RGB_BLUE": "blå", - "COLOUR_RGB_TOOLTIP": "Lag en farge med angitt verdi av rød, grønn og blå. Alle verdier må være mellom 0 og 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "blande", - "COLOUR_BLEND_COLOUR1": "farge 1", - "COLOUR_BLEND_COLOUR2": "farge 2", - "COLOUR_BLEND_RATIO": "forhold", - "COLOUR_BLEND_TOOLTIP": "Blander to farger sammen med et gitt forhold (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "gjenta %1 ganger", - "CONTROLS_REPEAT_INPUT_DO": "gjør", - "CONTROLS_REPEAT_TOOLTIP": "Gjenta noen instruksjoner flere ganger.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "gjenta mens", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "gjenta til", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Så lenge et utsagn stemmer, utfør noen instruksjoner.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Så lenge et utsagn ikke stemmer, gjør noen instruksjoner.", - "CONTROLS_FOR_TOOLTIP": "Ha variabel \"%1\" ta verdiene fra start nummer til slutt nummer, telle med spesifisert intervall og lag de spesifiserte blokkene.", - "CONTROLS_FOR_TITLE": "tell med %1 fra %2 til %3 med %4", - "CONTROLS_FOREACH_TITLE": "for hvert element %1 i listen %2", - "CONTROLS_FOREACH_TOOLTIP": "For hvert element i en liste, angi variabelen '%1' til elementet, og deretter lag noen setninger.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "bryt ut av løkken", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "fortsett med neste gjentakelse av løkken", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Bryt ut av den gjeldende løkken.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Hopp over resten av denne løkken og fortsett med neste gjentakelse.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Advarsel: Denne blokken kan kun brukes innenfor en løkke.", - "CONTROLS_IF_TOOLTIP_1": "Hvis dette er sant, så gjør følgende.", - "CONTROLS_IF_TOOLTIP_2": "Hvis dette er sant, så utfør den første blokken av instruksjoner. Hvis ikke, utfør den andre blokken.", - "CONTROLS_IF_TOOLTIP_3": "Hvis det første stemmer, så utfør den første blokken av instruksjoner. Ellers, hvis det andre stemmer, utfør den andre blokken av instruksjoner.", - "CONTROLS_IF_TOOLTIP_4": "Hvis den første verdien er sann, så utfør den første blokken med setninger. Ellers, hvis den andre verdien er sann, så utfør den andre blokken med setninger. Hvis ingen av verdiene er sanne, så utfør den siste blokken med setninger.", - "CONTROLS_IF_MSG_IF": "hvis", - "CONTROLS_IF_MSG_ELSEIF": "ellers hvis", - "CONTROLS_IF_MSG_ELSE": "ellers", - "CONTROLS_IF_IF_TOOLTIP": "Legg til, fjern eller flytt seksjoner i denne hvis-blokken.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Legg til en betingelse til hvis blokken.", - "CONTROLS_IF_ELSE_TOOLTIP": "Legg til hva som skal skje hvis de andre ikke slår til.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Returnerer sann hvis begge inputene er like hverandre.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Returnerer sant hvis begge argumentene er ulike hverandre.", - "LOGIC_COMPARE_TOOLTIP_LT": "Returnerer sant hvis det første argumentet er mindre enn det andre argumentet.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Returnerer sant hvis det første argumentet er mindre enn eller likt det andre argumentet.", - "LOGIC_COMPARE_TOOLTIP_GT": "Returnerer sant hvis det første argumentet er større enn den andre argumentet.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Returnerer sant hvis det første argumentet er større enn eller likt det andre argumentet.", - "LOGIC_OPERATION_TOOLTIP_AND": "Returnerer sant hvis begge argumentene er sanne.", - "LOGIC_OPERATION_AND": "og", - "LOGIC_OPERATION_TOOLTIP_OR": "Returnerer sant hvis minst ett av argumentene er sant.", - "LOGIC_OPERATION_OR": "eller", - "LOGIC_NEGATE_TITLE": "ikke %1", - "LOGIC_NEGATE_TOOLTIP": "Returnerer sant hvis argumentet er usant. Returnerer usant hvis argumentet er sant.", - "LOGIC_BOOLEAN_TRUE": "sann", - "LOGIC_BOOLEAN_FALSE": "usann", - "LOGIC_BOOLEAN_TOOLTIP": "Returnerer enten sann eller usann.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Returnerer null.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "hvis sant", - "LOGIC_TERNARY_IF_FALSE": "hvis usant", - "LOGIC_TERNARY_TOOLTIP": "Sjekk betingelsen i 'test'. Hvis betingelsen er sann, da returneres 'hvis sant' verdien. Hvis ikke returneres 'hvis usant' verdien.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Et tall.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "x", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://no.wikipedia.org/wiki/Aritmetikk", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Returnerer summen av to tall.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Returner differansen mellom to tall.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Returner produktet av to tall.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Returner kvotienten av to tall.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Returner det første tallet opphøyd i den andre tallet.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "kvadratrot", - "MATH_SINGLE_TOOLTIP_ROOT": "Returner kvadratroten av et tall.", - "MATH_SINGLE_OP_ABSOLUTE": "absoluttverdi", - "MATH_SINGLE_TOOLTIP_ABS": "Returner absoluttverdien av et tall.", - "MATH_SINGLE_TOOLTIP_NEG": "Returner det negative tallet.", - "MATH_SINGLE_TOOLTIP_LN": "Returner den naturlige logaritmen til et tall.", - "MATH_SINGLE_TOOLTIP_LOG10": "Returner base-10 logaritmen til et tall.", - "MATH_SINGLE_TOOLTIP_EXP": "Returner e opphøyd i et tall.", - "MATH_SINGLE_TOOLTIP_POW10": "Returner 10 opphøyd i et tall.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Returner sinus av en vinkel (ikke radian).", - "MATH_TRIG_TOOLTIP_COS": "Returner cosinus av en vinkel (ikke radian).", - "MATH_TRIG_TOOLTIP_TAN": "Returner tangenten av en vinkel (ikke radian).", - "MATH_TRIG_TOOLTIP_ASIN": "Returner arcsinus til et tall.", - "MATH_TRIG_TOOLTIP_ACOS": "Returner arccosinus til et tall.", - "MATH_TRIG_TOOLTIP_ATAN": "Returner arctangens til et tall.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Returner en av felleskonstantene π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), eller ∞ (uendelig).", - "MATH_IS_EVEN": "er et partall", - "MATH_IS_ODD": "er et oddetall", - "MATH_IS_PRIME": "er et primtall", - "MATH_IS_WHOLE": "er et heltall", - "MATH_IS_POSITIVE": "er positivt", - "MATH_IS_NEGATIVE": "er negativer negativt", - "MATH_IS_DIVISIBLE_BY": "er delelig med", - "MATH_IS_TOOLTIP": "Sjekk om et tall er et partall, oddetall, primtall, heltall, positivt, negativt, eller om det er delelig med et annet tall. Returnerer sant eller usant.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "endre %1 ved %2", - "MATH_CHANGE_TOOLTIP": "Addere et tall til variabelen '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Avrund et tall ned eller opp.", - "MATH_ROUND_OPERATOR_ROUND": "avrunding", - "MATH_ROUND_OPERATOR_ROUNDUP": "rund opp", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "rund ned", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "summen av listen", - "MATH_ONLIST_TOOLTIP_SUM": "Returner summen av alle tallene i listen.", - "MATH_ONLIST_OPERATOR_MIN": "minimum av listen", - "MATH_ONLIST_TOOLTIP_MIN": "Returner det minste tallet i listen.", - "MATH_ONLIST_OPERATOR_MAX": "maksimum av liste", - "MATH_ONLIST_TOOLTIP_MAX": "Returner det største tallet i listen.", - "MATH_ONLIST_OPERATOR_AVERAGE": "gjennomsnittet av listen", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Returner det aritmetiske gjennomsnittet av tallene i listen.", - "MATH_ONLIST_OPERATOR_MEDIAN": "medianen til listen", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Returner listens median.", - "MATH_ONLIST_OPERATOR_MODE": "Listens typetall", - "MATH_ONLIST_TOOLTIP_MODE": "Returner en liste av de vanligste elementene i listen.", - "MATH_ONLIST_OPERATOR_STD_DEV": "standardavviket til listen", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Returner listens standardavvik.", - "MATH_ONLIST_OPERATOR_RANDOM": "tilfeldig element i listen", - "MATH_ONLIST_TOOLTIP_RANDOM": "Returner et tilfeldig element fra listen.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "resten av %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Returner resten fra delingen av to tall.", - "MATH_CONSTRAIN_TITLE": "begrense %1 lav %2 høy %3", - "MATH_CONSTRAIN_TOOLTIP": "Begrens et tall til å være mellom de angitte grenseverdiene (inklusiv).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "Et tilfeldig heltall mellom %1 og %2", - "MATH_RANDOM_INT_TOOLTIP": "Returner et tilfeldig tall mellom de to spesifiserte grensene, inkludert de to.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "tilfeldig flyttall", - "MATH_RANDOM_FLOAT_TOOLTIP": "Returner et tilfeldig flyttall mellom 0.0 (inkludert) og 1.0 (ikke inkludert).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "En bokstav, ett ord eller en linje med tekst.", - "TEXT_JOIN_TITLE_CREATEWITH": "lage tekst med", - "TEXT_JOIN_TOOLTIP": "Opprett en tekst ved å sette sammen et antall elementer.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "føy sammen", - "TEXT_CREATE_JOIN_TOOLTIP": "Legg til, fjern eller forandre rekkefølgen for å forandre på denne tekstblokken.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Legg til et element til teksten.", - "TEXT_APPEND_TO": "til", - "TEXT_APPEND_APPENDTEXT": "tilføy tekst", - "TEXT_APPEND_TOOLTIP": "Tilføy tekst til variabelen '%1'.", - "TEXT_LENGTH_TITLE": "lengden av %1", - "TEXT_LENGTH_TOOLTIP": "Returnerer antall bokstaver (inkludert mellomrom) i den angitte teksten.", - "TEXT_ISEMPTY_TITLE": "%1 er tom", - "TEXT_ISEMPTY_TOOLTIP": "Returnerer sann hvis den angitte teksten er tom.", - "TEXT_INDEXOF_TOOLTIP": "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer 0 hvis teksten ikke blir funnet.", - "TEXT_INDEXOF_INPUT_INTEXT": "i tekst", - "TEXT_INDEXOF_OPERATOR_FIRST": "finn første forekomst av tekst", - "TEXT_INDEXOF_OPERATOR_LAST": "finn siste forekomst av tekst", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_INPUT_INTEXT": "i tekst", - "TEXT_CHARAT_FROM_START": "hent bokstav #", - "TEXT_CHARAT_FROM_END": "hent bokstav # fra slutten", - "TEXT_CHARAT_FIRST": "hent første bokstav", - "TEXT_CHARAT_LAST": "hent den siste bokstaven", - "TEXT_CHARAT_RANDOM": "hent en tilfeldig bokstav", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "Returnerer bokstaven på angitt plassering.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Returnerer den angitte delen av teksten.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "i tekst", - "TEXT_GET_SUBSTRING_START_FROM_START": "hent delstreng fra bokstav #", - "TEXT_GET_SUBSTRING_START_FROM_END": "hent delstreng fra bokstav # fra slutten", - "TEXT_GET_SUBSTRING_START_FIRST": "hent delstreng fra første bokstav", - "TEXT_GET_SUBSTRING_END_FROM_START": "til bokstav #", - "TEXT_GET_SUBSTRING_END_FROM_END": "til bokstav # fra slutten", - "TEXT_GET_SUBSTRING_END_LAST": "til siste bokstav", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "Returnerer en kopi av teksten der store og små bokstaver er byttet om.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "til STORE BOKSTAVER", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "til små bokstaver", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "til store forbokstaver", - "TEXT_TRIM_TOOLTIP": "Returner en kopi av teksten med mellomrom fjernet fra en eller begge sidene.", - "TEXT_TRIM_OPERATOR_BOTH": "fjern mellomrom fra begge sider av", - "TEXT_TRIM_OPERATOR_LEFT": "fjern mellomrom fra venstre side av", - "TEXT_TRIM_OPERATOR_RIGHT": "fjern mellomrom fra høyre side av", - "TEXT_PRINT_TITLE": "skriv ut %1", - "TEXT_PRINT_TOOLTIP": "Skriv ut angitt tekst, tall eller annet innhold.", - "TEXT_PROMPT_TYPE_TEXT": "spør om tekst med en melding", - "TEXT_PROMPT_TYPE_NUMBER": "spør om et tall med en melding", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Be brukeren om et tall.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Spør brukeren om tekst.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "opprett en tom liste", - "LISTS_CREATE_EMPTY_TOOLTIP": "Returnerer en tom liste, altså med lengde 0", - "LISTS_CREATE_WITH_TOOLTIP": "Lag en liste med et vilkårlig antall elementer.", - "LISTS_CREATE_WITH_INPUT_WITH": "lag en liste med", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "liste", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Legg til, fjern eller endre rekkefølgen for å endre på denne delen av listen.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Tilføy et element til listen.", - "LISTS_REPEAT_TOOLTIP": "Lager en liste hvor den gitte verdien gjentas et antall ganger.", - "LISTS_REPEAT_TITLE": "Lag en liste hvor elementet %1 forekommer %2 ganger", - "LISTS_LENGTH_TITLE": "lengden på %1", - "LISTS_LENGTH_TOOLTIP": "Returnerer lengden til en liste.", - "LISTS_ISEMPTY_TITLE": "%1 er tom", - "LISTS_ISEMPTY_TOOLTIP": "Returnerer sann hvis listen er tom.", - "LISTS_INLIST": "i listen", - "LISTS_INDEX_OF_FIRST": "finn første forekomst av elementet", - "LISTS_INDEX_OF_LAST": "finn siste forekomst av elementet", - "LISTS_INDEX_OF_TOOLTIP": "Returnerer posisjonen til den første/siste forekomsten av elementet i en liste. Returnerer 0 hvis ikke funnet.", - "LISTS_GET_INDEX_GET": "hent", - "LISTS_GET_INDEX_GET_REMOVE": "hent og fjern", - "LISTS_GET_INDEX_REMOVE": "fjern", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# fra slutten", - "LISTS_GET_INDEX_FIRST": "først", - "LISTS_GET_INDEX_LAST": "siste", - "LISTS_GET_INDEX_RANDOM": "tilfeldig", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Returner elementet på den angitte posisjonen i en liste. #1 er det første elementet.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Returner elementet på den angitte posisjonen i en liste. #1 er det siste elementet.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returnerer det første elementet i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returnerer det siste elementet i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returnerer et tilfeldig element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fjerner og returnerer elementet ved en gitt posisjon i en liste. #1 er det første elementet.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fjerner og returnerer elementet ved en gitt posisjon i en liste. #1 er det siste elementet.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fjerner og returnerer det første elementet i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fjerner og returnerer det siste elementet i en liste.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fjerner og returnerer et tilfeldig element i en liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fjerner et element ved en gitt posisjon i en liste. #1 er det første elementet.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fjerner et element ved en gitt posisjon i en liste. #1 er det siste elementet.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fjerner det første elementet i en liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fjerner det siste elementet i en liste.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Fjerner et tilfeldig element i en liste.", - "LISTS_SET_INDEX_SET": "sett", - "LISTS_SET_INDEX_INSERT": "sett inn ved", - "LISTS_SET_INDEX_INPUT_TO": "som", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det første elementet.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det siste elementet.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Angir det første elementet i en liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Angir det siste elementet i en liste.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Angir et tilfeldig element i en liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det første elementet.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Setter inn elementet ved den angitte posisjonen i en liste. #1 er det siste elementet.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Setter inn elementet i starten av en liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Tilføy elementet til slutten av en liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Setter inn elementet ved en tilfeldig posisjon i en liste.", - "LISTS_GET_SUBLIST_START_FROM_START": "Hent del-listen fra #", - "LISTS_GET_SUBLIST_START_FROM_END": "Hent de siste # elementene", - "LISTS_GET_SUBLIST_START_FIRST": "Hent en del av listen", - "LISTS_GET_SUBLIST_END_FROM_START": "til #", - "LISTS_GET_SUBLIST_END_FROM_END": "til # fra slutten", - "LISTS_GET_SUBLIST_END_LAST": "til siste", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "Kopiérer en ønsket del av en liste.", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_TOOLTIP": "Returnerer verdien av denne variabelen.", - "VARIABLES_GET_CREATE_SET": "Opprett 'sett %1'", - "VARIABLES_SET": "sett %1 til %2", - "VARIABLES_SET_TOOLTIP": "Setter verdien av denne variablen lik parameteren.", - "VARIABLES_SET_CREATE_GET": "Opprett 'hent %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "til", - "PROCEDURES_DEFNORETURN_PROCEDURE": "gjør noe", - "PROCEDURES_BEFORE_PARAMS": "med:", - "PROCEDURES_CALL_BEFORE_PARAMS": "med:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Opprett en funksjon som ikke har noe resultat.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "returner", - "PROCEDURES_DEFRETURN_TOOLTIP": "Oppretter en funksjon som har et resultat.", - "PROCEDURES_ALLOW_STATEMENTS": "tillat uttalelser", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Advarsel: Denne funksjonen har duplikate parametere.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Kjør den brukerdefinerte funksjonen '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Kjør den brukerdefinerte funksjonen'%1' og bruk resultatet av den.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "parametere", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Legg til, fjern eller endre rekkefølgen på input til denne funksjonen.", - "PROCEDURES_MUTATORARG_TITLE": "Navn på parameter:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Legg til en input til funksjonen.", - "PROCEDURES_HIGHLIGHT_DEF": "Marker funksjonsdefinisjonen", - "PROCEDURES_CREATE_DO": "Opprett '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Hvis en verdi er sann, returner da en annen verdi.", - "PROCEDURES_IFRETURN_WARNING": "Advarsel: Denne blokken kan bare benyttes innenfor en funksjonsdefinisjon." -} diff --git a/msg/json/nl.json b/msg/json/nl.json deleted file mode 100644 index 4ed0e2aea4..0000000000 --- a/msg/json/nl.json +++ /dev/null @@ -1,352 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Siebrand", - "McDutchie", - "Ribert", - "MedShot", - "아라", - "JaapDeKleine" - ] - }, - "VARIABLES_DEFAULT_NAME": "item", - "TODAY": "Vandaag", - "DUPLICATE_BLOCK": "Duplicaat", - "ADD_COMMENT": "Reactie toevoegen", - "REMOVE_COMMENT": "Opmerking verwijderen", - "EXTERNAL_INPUTS": "Externe invoer", - "INLINE_INPUTS": "Inline invoer", - "DELETE_BLOCK": "Blok verwijderen", - "DELETE_X_BLOCKS": "%1 blokken verwijderen", - "DELETE_ALL_BLOCKS": "Alle %1 blokken verwijderen?", - "CLEAN_UP": "Blokken opschonen", - "COLLAPSE_BLOCK": "Blok inklappen", - "COLLAPSE_ALL": "Blokken inklappen", - "EXPAND_BLOCK": "Blok uitvouwen", - "EXPAND_ALL": "Blokken uitvouwen", - "DISABLE_BLOCK": "Blok uitschakelen", - "ENABLE_BLOCK": "Blok inschakelen", - "HELP": "Hulp", - "CHAT": "Chat met iemand die ook aan het werk is via dit venster!", - "AUTH": "Sta deze app toe om uw werk op te slaan het uw werk te delen.", - "ME": "Ik", - "CHANGE_VALUE_TITLE": "Waarde wijzigen:", - "NEW_VARIABLE": "Nieuwe variabele...", - "NEW_VARIABLE_TITLE": "Nieuwe variabelenaam:", - "RENAME_VARIABLE": "Variabele hernoemen...", - "RENAME_VARIABLE_TITLE": "Alle variabelen \"%1\" hernoemen naar:", - "COLOUR_PICKER_HELPURL": "https://nl.wikipedia.org/wiki/Kleur", - "COLOUR_PICKER_TOOLTIP": "Kies een kleur in het palet.", - "COLOUR_RANDOM_TITLE": "willekeurige kleur", - "COLOUR_RANDOM_TOOLTIP": "Kies een willekeurige kleur.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "kleuren met", - "COLOUR_RGB_RED": "rood", - "COLOUR_RGB_GREEN": "groen", - "COLOUR_RGB_BLUE": "blauw", - "COLOUR_RGB_TOOLTIP": "Maak een kleur met de opgegeven hoeveelheid rood, groen en blauw. Alle waarden moeten tussen 0 en 100 liggen.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "mengen", - "COLOUR_BLEND_COLOUR1": "kleur 1", - "COLOUR_BLEND_COLOUR2": "kleur 2", - "COLOUR_BLEND_RATIO": "verhouding", - "COLOUR_BLEND_TOOLTIP": "Mengt twee kleuren samen met een bepaalde verhouding (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://nl.wikipedia.org/wiki/Repetitie_(informatica)#For_en_Foreach", - "CONTROLS_REPEAT_TITLE": "%1 keer herhalen", - "CONTROLS_REPEAT_INPUT_DO": "voer uit", - "CONTROLS_REPEAT_TOOLTIP": "Voer een aantal opdrachten meerdere keren uit.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "herhalen zolang", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "herhalen totdat", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Terwijl een waarde waar is de volgende opdrachten uitvoeren.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Terwijl een waarde onwaar is de volgende opdrachten uitvoeren.", - "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", - "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.", - "CONTROLS_FOR_TITLE": "rekenen met %1 van %2 tot %3 in stappen van %4", - "CONTROLS_FOREACH_TITLE": "voor ieder item %1 in lijst %2", - "CONTROLS_FOREACH_TOOLTIP": "Voor ieder item in een lijst, stel de variabele \"%1\" in op het item en voer daarna opdrachten uit.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "uit lus breken", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "doorgaan met de volgende iteratie van de lus", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "uit de bovenliggende lus breken", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "De rest van deze lus overslaan en doorgaan met de volgende herhaling.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Waarschuwing: dit blok mag alleen gebruikt worden in een lus.", - "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", - "CONTROLS_IF_TOOLTIP_1": "Als een waarde waar is, voer dan opdrachten uit.", - "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.", - "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.", - "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.", - "CONTROLS_IF_MSG_IF": "als", - "CONTROLS_IF_MSG_ELSEIF": "anders als", - "CONTROLS_IF_MSG_ELSE": "anders", - "CONTROLS_IF_IF_TOOLTIP": "Voeg stukken toe, verwijder of wijzig de volgorde om dit \"als\"-blok te wijzigen.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Voeg een voorwaarde toe aan het als-blok.", - "CONTROLS_IF_ELSE_TOOLTIP": "Voeg een laatste, vang-alles conditie toe aan het als-statement.", - "LOGIC_COMPARE_HELPURL": "https://nl.wikipedia.org/wiki/Ongelijkheid_(wiskunde)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Geeft \"waar\", als beide waarden gelijk aan elkaar zijn.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Geeft \"waar\" terug als de waarden niet gelijk zijn aan elkaar.", - "LOGIC_COMPARE_TOOLTIP_LT": "Geeft \"waar\" als de eerste invoer kleiner is dan de tweede invoer.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Geeft \"waar\" terug als de eerste invoer kleiner of gelijk is aan de tweede invoer.", - "LOGIC_COMPARE_TOOLTIP_GT": "Geeft \"waar\" terug als de eerste invoer meer is dan de tweede invoer.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Geeft \"waar\" terug als de eerste invoer groter is of gelijk aan de tweede invoer.", - "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", - "LOGIC_OPERATION_TOOLTIP_AND": "Geeft waar als beide waarden waar zijn.", - "LOGIC_OPERATION_AND": "en", - "LOGIC_OPERATION_TOOLTIP_OR": "Geeft \"waar\" terug als in ieder geval één van de waarden waar is.", - "LOGIC_OPERATION_OR": "of", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", - "LOGIC_NEGATE_TITLE": "niet %1", - "LOGIC_NEGATE_TOOLTIP": "Geeft \"waar\" terug als de invoer \"onwaar\" is. Geeft \"onwaar\" als de invoer \"waar\" is.", - "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", - "LOGIC_BOOLEAN_TRUE": "waar", - "LOGIC_BOOLEAN_FALSE": "onwaar", - "LOGIC_BOOLEAN_TOOLTIP": "Geeft \"waar\" of \"onwaar\" terug.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "niets", - "LOGIC_NULL_TOOLTIP": "Geeft niets terug.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "als waar", - "LOGIC_TERNARY_IF_FALSE": "als onwaar", - "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.", - "MATH_NUMBER_HELPURL": "https://nl.wikipedia.org/wiki/Getal_%28wiskunde%29", - "MATH_NUMBER_TOOLTIP": "Een getal.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "arctan", - "MATH_ARITHMETIC_HELPURL": "https://nl.wikipedia.org/wiki/Rekenen", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Geeft de som van 2 getallen.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Geeft het verschil van de twee getallen.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Geeft het product terug van de twee getallen.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Geeft de gedeelde waarde van twee getallen.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Geeft het eerste getal tot de macht van het tweede getal.", - "MATH_SINGLE_HELPURL": "https://nl.wikipedia.org/wiki/Vierkantswortel", - "MATH_SINGLE_OP_ROOT": "wortel", - "MATH_SINGLE_TOOLTIP_ROOT": "Geeft de wortel van een getal.", - "MATH_SINGLE_OP_ABSOLUTE": "absoluut", - "MATH_SINGLE_TOOLTIP_ABS": "Geeft de absolute waarde van een getal.", - "MATH_SINGLE_TOOLTIP_NEG": "Geeft de negatief van een getal.", - "MATH_SINGLE_TOOLTIP_LN": "Geeft het natuurlijk logaritme van een getal.", - "MATH_SINGLE_TOOLTIP_LOG10": "Geeft het logaritme basis 10 van een getal.", - "MATH_SINGLE_TOOLTIP_EXP": "Geeft e tot de macht van een getal.", - "MATH_SINGLE_TOOLTIP_POW10": "Geeft 10 tot de macht van een getal.", - "MATH_TRIG_HELPURL": "https://nl.wikipedia.org/wiki/Goniometrische_functie", - "MATH_TRIG_TOOLTIP_SIN": "Geeft de sinus van een graad (geen radialen).", - "MATH_TRIG_TOOLTIP_COS": "Geeft de cosinus van een graad (geen radialen).", - "MATH_TRIG_TOOLTIP_TAN": "Geeft de tangens van een graad (geen radialen).", - "MATH_TRIG_TOOLTIP_ASIN": "Geeft de arcsinus van een getal.", - "MATH_TRIG_TOOLTIP_ACOS": "Geeft de arccosinus van een getal.", - "MATH_TRIG_TOOLTIP_ATAN": "Geeft de arctangens van een getal.", - "MATH_CONSTANT_HELPURL": "https://nl.wikipedia.org/wiki/Wiskundige_constante", - "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).", - "MATH_IS_EVEN": "is even", - "MATH_IS_ODD": "is oneven", - "MATH_IS_PRIME": "is priemgetal", - "MATH_IS_WHOLE": "is geheel getal", - "MATH_IS_POSITIVE": "is positief", - "MATH_IS_NEGATIVE": "is negatief", - "MATH_IS_DIVISIBLE_BY": "is deelbaar door", - "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\".", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "%1 wijzigen met %2", - "MATH_CHANGE_TOOLTIP": "Voegt een getal toe aan variabele \"%1\".", - "MATH_ROUND_HELPURL": "https://nl.wikipedia.org/wiki/Afronden", - "MATH_ROUND_TOOLTIP": "Rondt een getal af omhoog of naar beneden.", - "MATH_ROUND_OPERATOR_ROUND": "afronden", - "MATH_ROUND_OPERATOR_ROUNDUP": "omhoog afronden", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "naar beneden afronden", - "MATH_ONLIST_OPERATOR_SUM": "som van lijst", - "MATH_ONLIST_TOOLTIP_SUM": "Geeft de som van alle getallen in de lijst.", - "MATH_ONLIST_OPERATOR_MIN": "laagste uit lijst", - "MATH_ONLIST_TOOLTIP_MIN": "Geeft het kleinste getal uit een lijst.", - "MATH_ONLIST_OPERATOR_MAX": "hoogste uit lijst", - "MATH_ONLIST_TOOLTIP_MAX": "Geeft het grootste getal in een lijst.", - "MATH_ONLIST_OPERATOR_AVERAGE": "gemiddelde van lijst", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Geeft het gemiddelde terug van de numerieke waardes in een lijst.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediaan van lijst", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Geeft de mediaan in de lijst.", - "MATH_ONLIST_OPERATOR_MODE": "modi van lijst", - "MATH_ONLIST_TOOLTIP_MODE": "Geeft een lijst van de meest voorkomende onderdelen in de lijst.", - "MATH_ONLIST_OPERATOR_STD_DEV": "standaarddeviatie van lijst", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Geeft de standaardafwijking van de lijst.", - "MATH_ONLIST_OPERATOR_RANDOM": "willekeurige item van lijst", - "MATH_ONLIST_TOOLTIP_RANDOM": "Geeft een willekeurig item uit de lijst terug.", - "MATH_MODULO_HELPURL": "https://nl.wikipedia.org/wiki/Modulair_rekenen", - "MATH_MODULO_TITLE": "restgetal van %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Geeft het restgetal van het resultaat van de deling van de twee getallen.", - "MATH_CONSTRAIN_TITLE": "beperk %1 van minimaal %2 tot maximaal %3", - "MATH_CONSTRAIN_TOOLTIP": "Beperk een getal tussen de twee opgegeven limieten (inclusief).", - "MATH_RANDOM_INT_HELPURL": "https://nl.wikipedia.org/wiki/Toevalsgenerator", - "MATH_RANDOM_INT_TITLE": "willekeurig geheel getal van %1 tot %2", - "MATH_RANDOM_INT_TOOLTIP": "Geeft een willekeurig getal tussen de 2 opgegeven limieten in, inclusief.", - "MATH_RANDOM_FLOAT_HELPURL": "https://nl.wikipedia.org/wiki/Toevalsgenerator", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "willekeurige fractie", - "MATH_RANDOM_FLOAT_TOOLTIP": "Geeft een willekeurige fractie tussen 0.0 (inclusief) en 1.0 (exclusief).", - "TEXT_TEXT_HELPURL": "https://nl.wikipedia.org/wiki/String_%28informatica%29", - "TEXT_TEXT_TOOLTIP": "Een letter, woord of een regel tekst.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", - "TEXT_JOIN_TITLE_CREATEWITH": "maak tekst met", - "TEXT_JOIN_TOOLTIP": "Maakt een stuk tekst door één of meer items samen te voegen.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "samenvoegen", - "TEXT_CREATE_JOIN_TOOLTIP": "Toevoegen, verwijderen of volgorde wijzigen van secties om dit tekstblok opnieuw in te stellen.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Voegt een item aan de tekst toe.", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", - "TEXT_APPEND_TO": "voeg toe aan", - "TEXT_APPEND_APPENDTEXT": "tekst", - "TEXT_APPEND_TOOLTIP": "Voeg tekst toe aan de variabele \"%1\".", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", - "TEXT_LENGTH_TITLE": "lengte van %1", - "TEXT_LENGTH_TOOLTIP": "Geeft het aantal tekens terug (inclusief spaties) in de opgegeven tekst.", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", - "TEXT_ISEMPTY_TITLE": "%1 is leeg", - "TEXT_ISEMPTY_TOOLTIP": "Geeft \"waar\" terug, als de opgegeven tekst leeg is.", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", - "TEXT_INDEXOF_TOOLTIP": "Geeft de index terug van de eerste/laatste aanwezigheid van de eerste tekst in de tweede tekst. Geeft 0 terug als de tekst niet gevonden is.", - "TEXT_INDEXOF_INPUT_INTEXT": "in tekst", - "TEXT_INDEXOF_OPERATOR_FIRST": "zoek eerste voorkomen van tekst", - "TEXT_INDEXOF_OPERATOR_LAST": "zoek het laatste voorkomen van tekst", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", - "TEXT_CHARAT_INPUT_INTEXT": "in tekst", - "TEXT_CHARAT_FROM_START": "haal letter # op", - "TEXT_CHARAT_FROM_END": "haal letter # op vanaf einde", - "TEXT_CHARAT_FIRST": "haal eerste letter op", - "TEXT_CHARAT_LAST": "haal laatste letter op", - "TEXT_CHARAT_RANDOM": "haal willekeurige letter op", - "TEXT_CHARAT_TOOLTIP": "Geeft de letter op de opgegeven positie terug.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Geeft het opgegeven onderdeel van de tekst terug.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in tekst", - "TEXT_GET_SUBSTRING_START_FROM_START": "haal subtekst op vanaf letter #", - "TEXT_GET_SUBSTRING_START_FROM_END": "haal subtekst op vanaf letter # vanaf einde", - "TEXT_GET_SUBSTRING_START_FIRST": "haal subtekst op van eerste letter", - "TEXT_GET_SUBSTRING_END_FROM_START": "naar letter #", - "TEXT_GET_SUBSTRING_END_FROM_END": "van letter # tot einde", - "TEXT_GET_SUBSTRING_END_LAST": "naar laatste letter", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", - "TEXT_CHANGECASE_TOOLTIP": "Geef een kopie van de tekst met veranderde hoofdletters terug.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "naar HOOFDLETTERS", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "naar kleine letters", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "naar Hoofdletter Per Woord", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", - "TEXT_TRIM_TOOLTIP": "Geeft een kopie van de tekst met verwijderde spaties van één of beide kanten.", - "TEXT_TRIM_OPERATOR_BOTH": "spaties van beide kanten afhalen van", - "TEXT_TRIM_OPERATOR_LEFT": "spaties van de linkerkant verwijderen van", - "TEXT_TRIM_OPERATOR_RIGHT": "spaties van de rechterkant verwijderen van", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", - "TEXT_PRINT_TITLE": "tekst weergeven: %1", - "TEXT_PRINT_TOOLTIP": "Drukt de opgegeven tekst, getal of een andere waarde af.", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", - "TEXT_PROMPT_TYPE_TEXT": "vraagt om invoer met bericht", - "TEXT_PROMPT_TYPE_NUMBER": "vraagt de gebruiker om een getal met de tekst", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Vraagt de gebruiker om een getal in te voeren.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Vraagt de gebruiker om invoer.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "maak een lege lijst", - "LISTS_CREATE_EMPTY_TOOLTIP": "Geeft een lijst terug met lengte 0, zonder items", - "LISTS_CREATE_WITH_TOOLTIP": "Maak een lijst met een willekeurig aantal items.", - "LISTS_CREATE_WITH_INPUT_WITH": "maak een lijst met", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lijst", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Voeg stukken toe, verwijder ze of wijzig de volgorde om dit lijstblok aan te passen.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Voeg iets toe aan de lijst.", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_REPEAT_TOOLTIP": "Maakt een lijst die bestaat uit de opgegeven waarde, het opgegeven aantal keer herhaald.", - "LISTS_REPEAT_TITLE": "Maak lijst met item %1, %2 keer herhaald", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", - "LISTS_LENGTH_TITLE": "lengte van %1", - "LISTS_LENGTH_TOOLTIP": "Geeft de lengte van een lijst terug.", - "LISTS_ISEMPTY_TITLE": "%1 is leeg", - "LISTS_ISEMPTY_TOOLTIP": "Geeft waar terug als de lijst leeg is.", - "LISTS_INLIST": "in lijst", - "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", - "LISTS_INDEX_OF_FIRST": "zoek eerste voorkomen van item", - "LISTS_INDEX_OF_LAST": "zoek laatste voorkomen van item", - "LISTS_INDEX_OF_TOOLTIP": "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft 0 terug als het item niet is gevonden.", - "LISTS_GET_INDEX_GET": "haal op", - "LISTS_GET_INDEX_GET_REMOVE": "haal op en verwijder", - "LISTS_GET_INDEX_REMOVE": "verwijder", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# van einde", - "LISTS_GET_INDEX_FIRST": "eerste", - "LISTS_GET_INDEX_LAST": "laatste", - "LISTS_GET_INDEX_RANDOM": "willekeurig", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Geeft het item op de opgegeven positie in een lijst. Item 1 is het eerste item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Geeft het item op de opgegeven positie in een lijst terug. Item 1 is het laatste item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Geeft het eerste item in een lijst terug.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Geeft het laatste item in een lijst terug.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Geeft een willekeurig item uit een lijst.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Geeft het item op de opgegeven positie in een lijst terug en verwijdert het. Item 1 is het eerste item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Verwijdert en geeft het item op de opgegeven positie in de lijst. Item 1 is het laatste item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Geeft het laatste item in een lijst terug en verwijdert het.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Geeft het laatste item uit een lijst terug en verwijdert het.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Geeft een willekeurig item in een lijst terug en verwijdert het.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Verwijdert het item op de opgegeven positie in een lijst. Item 1 is het eerste item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Verwijdert een item op de opgegeven positie in een lijst. Item 1 is het laatste item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Verwijdert het eerste item in een lijst.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Verwijdert het laatste item uit een lijst.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Verwijdert een willekeurig item uit een lijst.", - "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", - "LISTS_SET_INDEX_SET": "stel in", - "LISTS_SET_INDEX_INSERT": "tussenvoegen op", - "LISTS_SET_INDEX_INPUT_TO": "als", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Stelt het item op de opgegeven positie in de lijst in. Item 1 is het eerste item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Stelt het item op een opgegeven positie in de lijst in. Item 1 is het laatste item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Stelt het eerste item in een lijst in.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Stelt het laatste item van een lijst in.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Stelt een willekeurig item uit de lijst in.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Voegt het item op een opgegeven positie in een lijst in. Item 1 is het eerste item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Voegt het item op de opgegeven positie toe aan een lijst in. Item 1 is het laatste item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Voegt het item toe aan het begin van de lijst.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Voeg het item aan het einde van een lijst toe.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Voegt het item op een willekeurige positie in de lijst in.", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", - "LISTS_GET_SUBLIST_START_FROM_START": "haal sublijst op vanaf positie", - "LISTS_GET_SUBLIST_START_FROM_END": "haal sublijst op van positie vanaf einde", - "LISTS_GET_SUBLIST_START_FIRST": "haal sublijst op vanaf eerste", - "LISTS_GET_SUBLIST_END_FROM_START": "naar item", - "LISTS_GET_SUBLIST_END_FROM_END": "naar # vanaf einde", - "LISTS_GET_SUBLIST_END_LAST": "naar laatste", - "LISTS_GET_SUBLIST_TOOLTIP": "Maakt een kopie van het opgegeven deel van de lijst.", - "LISTS_SPLIT_LIST_FROM_TEXT": "lijst maken van tekst", - "LISTS_SPLIT_TEXT_FROM_LIST": "tekst maken van lijst", - "LISTS_SPLIT_WITH_DELIMITER": "met scheidingsteken", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Tekst splitsen in een tekst van tekst op basis van een scheidingsteken.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Lijst van tekstdelen samenvoegen in één stuk tekst, waarbij de tekstdelen gescheiden zijn door een scheidingsteken.", - "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", - "VARIABLES_GET_TOOLTIP": "Geeft de waarde van deze variabele.", - "VARIABLES_GET_CREATE_SET": "Maak \"verander %1\"", - "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", - "VARIABLES_SET": "stel %1 in op %2", - "VARIABLES_SET_TOOLTIP": "Verandert de waarde van de variabele naar de waarde van de invoer.", - "VARIABLES_SET_CREATE_GET": "Maak 'opvragen van %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://nl.wikipedia.org/wiki/Subprogramma", - "PROCEDURES_DEFNORETURN_TITLE": "om", - "PROCEDURES_DEFNORETURN_PROCEDURE": "doe iets", - "PROCEDURES_BEFORE_PARAMS": "met:", - "PROCEDURES_CALL_BEFORE_PARAMS": "met:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Maakt een functie zonder uitvoer.", - "PROCEDURES_DEFRETURN_HELPURL": "https://nl.wikipedia.org/wiki/Subprogramma", - "PROCEDURES_DEFRETURN_RETURN": "uitvoeren", - "PROCEDURES_DEFRETURN_TOOLTIP": "Maakt een functie met een uitvoer.", - "PROCEDURES_ALLOW_STATEMENTS": "statements toestaan", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Waarschuwing: deze functie heeft parameters met dezelfde naam.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://nl.wikipedia.org/wiki/Subprogramma", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Voer de door de gebruiker gedefinieerde functie \"%1\" uit.", - "PROCEDURES_CALLRETURN_HELPURL": "https://nl.wikipedia.org/wiki/Subprogramma", - "PROCEDURES_CALLRETURN_TOOLTIP": "Voer de door de gebruiker gedefinieerde functie \"%1\" uit en gebruik de uitvoer.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "ingangen", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Invoer van deze functie toevoegen, verwijderen of herordenen.", - "PROCEDURES_MUTATORARG_TITLE": "invoernaam:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Een invoer aan de functie toevoegen.", - "PROCEDURES_HIGHLIGHT_DEF": "Accentueer functiedefinitie", - "PROCEDURES_CREATE_DO": "Maak \"%1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Als de eerste waarde \"waar\" is, geef dan de tweede waarde terug.", - "PROCEDURES_IFRETURN_WARNING": "Waarschuwing: dit blok mag alleen gebruikt worden binnen de definitie van een functie." -} diff --git a/msg/json/oc.json b/msg/json/oc.json deleted file mode 100644 index 1e505fe207..0000000000 --- a/msg/json/oc.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Cedric31" - ] - }, - "VARIABLES_DEFAULT_NAME": "element", - "DUPLICATE_BLOCK": "Duplicar", - "ADD_COMMENT": "Apondre un comentari", - "REMOVE_COMMENT": "Suprimir un comentari", - "EXTERNAL_INPUTS": "Entradas extèrnas", - "INLINE_INPUTS": "Entradas en linha", - "DELETE_BLOCK": "Suprimir lo blòt", - "DELETE_X_BLOCKS": "Suprimir %1 blòts", - "DELETE_ALL_BLOCKS": "Suprimir totes los %1 blòts ?", - "COLLAPSE_BLOCK": "Redusir lo blòt", - "COLLAPSE_ALL": "Redusir los blòts", - "EXPAND_BLOCK": "Desvolopar lo blòt", - "EXPAND_ALL": "Desvolopar los blòts", - "DISABLE_BLOCK": "Desactivar lo blòt", - "ENABLE_BLOCK": "Activar lo blòt", - "HELP": "Ajuda", - "ME": "Ieu", - "CHANGE_VALUE_TITLE": "Modificar la valor :", - "NEW_VARIABLE": "Variabla novèla…", - "NEW_VARIABLE_TITLE": "Nom de la novèla variabla :", - "RENAME_VARIABLE": "Renomenar la variabla…", - "COLOUR_PICKER_HELPURL": "https://oc.wikipedia.org/wiki/Color", - "COLOUR_RANDOM_TITLE": "color aleatòria", - "COLOUR_RANDOM_TOOLTIP": "Causir una color a l'azard.", - "COLOUR_RGB_TITLE": "colorar amb", - "COLOUR_RGB_RED": "roge", - "COLOUR_RGB_GREEN": "verd", - "COLOUR_RGB_BLUE": "blau", - "COLOUR_BLEND_TITLE": "mesclar", - "COLOUR_BLEND_COLOUR1": "color 1", - "COLOUR_BLEND_COLOUR2": "color 2", - "COLOUR_BLEND_RATIO": "ratio", - "CONTROLS_REPEAT_HELPURL": "https://oc.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "repetir %1 còps", - "CONTROLS_REPEAT_INPUT_DO": "far", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repetir tant que", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repetir fins a", - "CONTROLS_FOR_TITLE": "comptar amb %1 de %2 a %3 per %4", - "CONTROLS_FOREACH_TITLE": "per cada element %1 dins la lista %2", - "CONTROLS_IF_MSG_IF": "se", - "CONTROLS_IF_MSG_ELSEIF": "siquenon se", - "CONTROLS_IF_MSG_ELSE": "siquenon", - "LOGIC_OPERATION_AND": "e", - "LOGIC_OPERATION_OR": "o", - "LOGIC_NEGATE_TITLE": "pas %1", - "LOGIC_BOOLEAN_TRUE": "verai", - "LOGIC_BOOLEAN_FALSE": "fals", - "LOGIC_NULL": "nul", - "LOGIC_NULL_TOOLTIP": "Renvia nul.", - "LOGIC_TERNARY_CONDITION": "tèst", - "LOGIC_TERNARY_IF_TRUE": "se verai", - "LOGIC_TERNARY_IF_FALSE": "se fals", - "MATH_NUMBER_HELPURL": "https://oc.wikipedia.org/wiki/Nombre", - "MATH_NUMBER_TOOLTIP": "Un nombre.", - "MATH_ARITHMETIC_HELPURL": "https://oc.wikipedia.org/wiki/Aritmetica", - "MATH_SINGLE_OP_ROOT": "raiç carrada", - "MATH_SINGLE_OP_ABSOLUTE": "absolut", - "MATH_IS_EVEN": "es par", - "MATH_IS_ODD": "es impar", - "MATH_IS_PRIME": "es primièr", - "MATH_IS_WHOLE": "es entièr", - "MATH_IS_POSITIVE": "es positiu", - "MATH_IS_NEGATIVE": "es negatiu", - "MATH_IS_DIVISIBLE_BY": "es devesible per", - "MATH_CHANGE_TITLE": "incrementar %1 per %2", - "MATH_ROUND_OPERATOR_ROUND": "arredondir", - "MATH_ROUND_OPERATOR_ROUNDUP": "arredondir al superior", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "arredondir a l’inferior", - "MATH_ONLIST_OPERATOR_SUM": "soma de la lista", - "MATH_ONLIST_OPERATOR_MIN": "minimum de la lista", - "MATH_ONLIST_OPERATOR_MAX": "maximum de la lista", - "MATH_ONLIST_OPERATOR_AVERAGE": "mejana de la lista", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana de la lista", - "TEXT_APPEND_TO": "a", - "TEXT_APPEND_APPENDTEXT": "apondre lo tèxte", - "TEXT_LENGTH_TITLE": "longor de %1", - "TEXT_ISEMPTY_TITLE": "%1 es void", - "TEXT_INDEXOF_INPUT_INTEXT": "dins lo tèxte", - "TEXT_CHARAT_INPUT_INTEXT": "dins lo tèxte", - "TEXT_CHARAT_FROM_START": "obténer la letra #", - "TEXT_CHARAT_FROM_END": "obténer la letra # dempuèi la fin", - "TEXT_CHARAT_FIRST": "obténer la primièra letra", - "TEXT_CHARAT_LAST": "obténer la darrièra letra", - "TEXT_CHARAT_RANDOM": "obténer una letra a l'azard", - "TEXT_CHARAT_TOOLTIP": "Renvia la letra a la posicion indicada.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "dins lo tèxte", - "TEXT_GET_SUBSTRING_END_FROM_START": "fins a la letra #", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "en MAJUSCULAS", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "en minusculas", - "TEXT_PRINT_TITLE": "afichar %1", - "LISTS_CREATE_WITH_INPUT_WITH": "crear una lista amb", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_INLIST": "dins la lista", - "LISTS_GET_INDEX_GET": "obténer", - "LISTS_GET_INDEX_GET_REMOVE": "obténer e suprimir", - "LISTS_GET_INDEX_REMOVE": "suprimit", - "LISTS_GET_INDEX_FROM_END": "# dempuèi la fin", - "LISTS_GET_INDEX_FIRST": "primièr", - "LISTS_GET_INDEX_LAST": "darrièr", - "LISTS_GET_INDEX_RANDOM": "aleatòri", - "LISTS_SET_INDEX_SET": "metre", - "LISTS_SET_INDEX_INSERT": "inserir en", - "LISTS_SET_INDEX_INPUT_TO": "coma", - "LISTS_GET_SUBLIST_END_FROM_START": "fins a #", - "LISTS_GET_SUBLIST_END_FROM_END": "fins a # dempuèi la fin", - "LISTS_GET_SUBLIST_END_LAST": "fins a la fin", - "VARIABLES_GET_CREATE_SET": "Crear 'fixar %1'", - "VARIABLES_SET": "fixar %1 a %2", - "PROCEDURES_DEFNORETURN_TITLE": "a", - "PROCEDURES_DEFNORETURN_PROCEDURE": "far quicòm", - "PROCEDURES_BEFORE_PARAMS": "amb :", - "PROCEDURES_CALL_BEFORE_PARAMS": "amb :", - "PROCEDURES_DEFRETURN_RETURN": "retorn", - "PROCEDURES_MUTATORCONTAINER_TITLE": "entradas", - "PROCEDURES_MUTATORARG_TITLE": "nom de l’entrada :", - "PROCEDURES_CREATE_DO": "Crear '%1'" -} diff --git a/msg/json/pl.json b/msg/json/pl.json deleted file mode 100644 index e52ed484e8..0000000000 --- a/msg/json/pl.json +++ /dev/null @@ -1,337 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Cotidianis", - "Faren", - "Vengir", - "Pbz", - "Pio387", - "아라", - "Mateon1", - "Expert3222" - ] - }, - "VARIABLES_DEFAULT_NAME": "element", - "TODAY": "Dzisiaj", - "DUPLICATE_BLOCK": "Powiel", - "ADD_COMMENT": "Dodaj komentarz", - "REMOVE_COMMENT": "Usuń Komentarz", - "EXTERNAL_INPUTS": "Zewnętrzne wejścia", - "INLINE_INPUTS": "Wbudowane wejścia", - "DELETE_BLOCK": "Usuń blok", - "DELETE_X_BLOCKS": "Usunąć %1 bloki(ów)", - "DELETE_ALL_BLOCKS": "Usunąć wszystkie %1 bloki?", - "CLEAN_UP": "Uporządkuj bloki", - "COLLAPSE_BLOCK": "Zwiń blok", - "COLLAPSE_ALL": "Zwiń bloki", - "EXPAND_BLOCK": "Rozwiń blok", - "EXPAND_ALL": "Rozwiń bloki", - "DISABLE_BLOCK": "Wyłącz blok", - "ENABLE_BLOCK": "Włącz blok", - "HELP": "Pomoc", - "CHAT": "Rozmawiaj z swoim współpracownikiem, pisząc w tym polu!", - "AUTH": "Proszę autoryzować ten program, aby można było zapisać swoją pracę i umożliwić Ci dzielenie się nią.", - "ME": "Ja", - "CHANGE_VALUE_TITLE": "Zmień wartość:", - "NEW_VARIABLE": "Nowa zmienna...", - "NEW_VARIABLE_TITLE": "Nowa nazwa zmiennej:", - "RENAME_VARIABLE": "Zmień nazwę zmiennej...", - "RENAME_VARIABLE_TITLE": "Zmień nazwy wszystkich '%1' zmiennych na:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Wybierz kolor z palety.", - "COLOUR_RANDOM_TITLE": "losowy kolor", - "COLOUR_RANDOM_TOOLTIP": "Wybierz kolor w sposób losowy.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "kolor z", - "COLOUR_RGB_RED": "czerwony", - "COLOUR_RGB_GREEN": "zielony", - "COLOUR_RGB_BLUE": "niebieski", - "COLOUR_RGB_TOOLTIP": "Połącz czerwony, zielony i niebieski w odpowiednich proporcjach, tak aby powstał nowy kolor. Zawartość każdego z nich określa liczba z przedziału od 0 do 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "wymieszaj", - "COLOUR_BLEND_COLOUR1": "kolor 1", - "COLOUR_BLEND_COLOUR2": "kolor 2", - "COLOUR_BLEND_RATIO": "proporcja", - "COLOUR_BLEND_TOOLTIP": "Miesza dwa kolory w danej proporcji (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "powtórz %1 razy", - "CONTROLS_REPEAT_INPUT_DO": "wykonaj", - "CONTROLS_REPEAT_TOOLTIP": "Wykonaj niektóre instrukcje kilka razy.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "powtarzaj dopóki", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "powtarzaj aż", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Gdy wartość jest prawdziwa, wykonaj kilka instrukcji.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Gdy wartość jest nieprawdziwa, wykonaj kilka instrukcji.", - "CONTROLS_FOR_TOOLTIP": "Przypisuje zmiennej %1 wartości od numeru startowego do numeru końcowego, licząc co określony interwał, wykonując określone bloki.", - "CONTROLS_FOR_TITLE": "licz z %1 od %2 do %3 co %4 (wartość kroku)", - "CONTROLS_FOREACH_TITLE": "dla każdego elementu %1 na liście %2", - "CONTROLS_FOREACH_TOOLTIP": "Dla każdego elementu z listy przyporządkuj zmienną '%1', a następnie wykonaj kilka instrukcji.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "wyjdź z pętli", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "przejdź do kolejnej iteracji pętli", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Wyjdź z zawierającej pętli.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Pomiń resztę pętli i kontynuuj w kolejnej iteracji.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Ostrzeżenie: Ten blok może być użyty tylko w pętli.", - "CONTROLS_IF_TOOLTIP_1": "Jeśli wartość jest prawdziwa, to wykonaj kilka instrukcji.", - "CONTROLS_IF_TOOLTIP_2": "Jeśli wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, wykonaj drugi blok instrukcji.", - "CONTROLS_IF_TOOLTIP_3": "Jeśli pierwsza wartość jest prawdziwa, to wykonaj pierwszy blok instrukcji. W przeciwnym razie, jeśli druga wartość jest prawdziwa, to wykonaj drugi blok instrukcji.", - "CONTROLS_IF_TOOLTIP_4": "Jeśli pierwsza wartość jest prawdziwa, wykonaj pierwszy blok instrukcji. W przeciwnym razie jeśli druga wartość jest prawdziwa, wykonaj drugi blok instrukcji. Jeżeli żadna z wartości nie jest prawdziwa, wykonaj ostatni blok instrukcji.", - "CONTROLS_IF_MSG_IF": "jeśli", - "CONTROLS_IF_MSG_ELSEIF": "w przeciwnym razie jeśli", - "CONTROLS_IF_MSG_ELSE": "w przeciwnym razie", - "CONTROLS_IF_IF_TOOLTIP": "Dodaj, usuń lub zmień kolejność bloków, żeby zmodyfikować ten blok „jeśli”.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodaj warunek do bloku „jeśli”.", - "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj ostatni warunek do bloku „jeśli”, gdy żaden wcześniejszy nie był spełniony.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Zwróć \"prawda\", jeśli oba wejścia są sobie równe.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Zwróć \"prawda\", jeśli oba wejścia są sobie nierówne.", - "LOGIC_COMPARE_TOOLTIP_LT": "Zwróć \"prawda\" jeśli pierwsze wejście jest większe od drugiego.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Zwróć \"prawda\", jeśli pierwsze wejście jest większe lub równe drugiemu.", - "LOGIC_COMPARE_TOOLTIP_GT": "Zwróć \"prawda\" jeśli pierwsze wejście jest większe od drugiego.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Zwróć \"prawda\", jeśli pierwsze wejście jest większe lub równe drugiemu.", - "LOGIC_OPERATION_TOOLTIP_AND": "Zwróć \"prawda\" jeśli oba dane elementy mają wartość \"prawda\".", - "LOGIC_OPERATION_AND": "i", - "LOGIC_OPERATION_TOOLTIP_OR": "Zwróć \"prawda\" jeśli co najmniej jeden dany element ma wartość \"prawda\".", - "LOGIC_OPERATION_OR": "lub", - "LOGIC_NEGATE_TITLE": "nie %1", - "LOGIC_NEGATE_TOOLTIP": "Zwraca \"prawda\", jeśli dane wejściowe są fałszywe. Zwraca \"fałsz\", jeśli dana wejściowa jest prawdziwa.", - "LOGIC_BOOLEAN_TRUE": "prawda", - "LOGIC_BOOLEAN_FALSE": "fałsz", - "LOGIC_BOOLEAN_TOOLTIP": "Zwraca 'prawda' lub 'fałsz'.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "nic", - "LOGIC_NULL_TOOLTIP": "Zwraca nic.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "jeśli prawda", - "LOGIC_TERNARY_IF_FALSE": "jeśli fałsz", - "LOGIC_TERNARY_TOOLTIP": "Sprawdź warunek w „test”. Jeśli warunek jest prawdziwy, to zwróci „jeśli prawda”; jeśli nie jest prawdziwy to zwróci „jeśli fałsz”.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Liczba.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "/", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tg", - "MATH_TRIG_ASIN": "arcsin", - "MATH_TRIG_ACOS": "arccos", - "MATH_TRIG_ATAN": "arctg", - "MATH_ARITHMETIC_HELPURL": "https://pl.wikipedia.org/wiki/Arytmetyka", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Zwróć sumę dwóch liczb.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Zwróć różnicę dwóch liczb.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Zwróć iloczyn dwóch liczb.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Zwróć iloraz dwóch liczb.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Zwróć pierwszą liczbę podniesioną do potęgi o wykładniku drugiej liczby.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "pierwiastek kwadratowy", - "MATH_SINGLE_TOOLTIP_ROOT": "Zwróć pierwiastek kwadratowy danej liczby.", - "MATH_SINGLE_OP_ABSOLUTE": "wartość bezwzględna", - "MATH_SINGLE_TOOLTIP_ABS": "Zwróć wartość bezwzględną danej liczby.", - "MATH_SINGLE_TOOLTIP_NEG": "Zwróć negację danej liczby.", - "MATH_SINGLE_TOOLTIP_LN": "Zwróć logarytm naturalny danej liczby.", - "MATH_SINGLE_TOOLTIP_LOG10": "Zwraca logarytm dziesiętny danej liczby.", - "MATH_SINGLE_TOOLTIP_EXP": "Zwróć e do potęgi danej liczby.", - "MATH_SINGLE_TOOLTIP_POW10": "Zwróć 10 do potęgi danej liczby.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Zwróć wartość sinusa o stopniu (nie radianach).", - "MATH_TRIG_TOOLTIP_COS": "Zwróć wartość cosinusa o stopniu (nie radianach).", - "MATH_TRIG_TOOLTIP_TAN": "Zwróć tangens o stopniu (nie radianach).", - "MATH_TRIG_TOOLTIP_ASIN": "Zwróć arcus sinus danej liczby.", - "MATH_TRIG_TOOLTIP_ACOS": "Zwróć arcus cosinus danej liczby.", - "MATH_TRIG_TOOLTIP_ATAN": "Zwróć arcus tangens danej liczby.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Zwróć jedną wspólną stałą: π (3.141), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) lub ∞ (nieskończoność).", - "MATH_IS_EVEN": "jest parzysta", - "MATH_IS_ODD": "jest nieparzysta", - "MATH_IS_PRIME": "jest liczbą pierwszą", - "MATH_IS_WHOLE": "jest liczbą całkowitą", - "MATH_IS_POSITIVE": "jest dodatnia", - "MATH_IS_NEGATIVE": "jest ujemna", - "MATH_IS_DIVISIBLE_BY": "jest podzielna przez", - "MATH_IS_TOOLTIP": "Sprawdź, czy liczba jest parzysta, nieparzysta, pierwsza, całkowita, dodatnia, ujemna, lub czy jest podzielna przez podaną liczbę. Zwraca wartość \"prawda\" lub \"fałsz\".", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "zmień %1 o %2", - "MATH_CHANGE_TOOLTIP": "Dodaj liczbę do zmiennej '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Zaokrąglij w górę lub w dół.", - "MATH_ROUND_OPERATOR_ROUND": "zaokrąglij", - "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrąglij w górę", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokrąglij w dół", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "suma elementów listy", - "MATH_ONLIST_TOOLTIP_SUM": "Zwróć sumę wszystkich liczb z listy.", - "MATH_ONLIST_OPERATOR_MIN": "minimalna wartość z listy", - "MATH_ONLIST_TOOLTIP_MIN": "Zwróć najmniejszą liczbę w liście.", - "MATH_ONLIST_OPERATOR_MAX": "maksymalna wartość z listy", - "MATH_ONLIST_TOOLTIP_MAX": "Zwróć największą liczbę w liście.", - "MATH_ONLIST_OPERATOR_AVERAGE": "średnia elementów listy", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Zwróć średnią (średnią arytmetyczną) wartości liczbowych z listy.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana listy", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Zwróć medianę listy.", - "MATH_ONLIST_OPERATOR_MODE": "dominanty listy", - "MATH_ONLIST_TOOLTIP_MODE": "Zwróć listę najczęściej występujących elementów w liście.", - "MATH_ONLIST_OPERATOR_STD_DEV": "odchylenie standardowe listy", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Zwróć odchylenie standardowe listy.", - "MATH_ONLIST_OPERATOR_RANDOM": "losowy element z listy", - "MATH_ONLIST_TOOLTIP_RANDOM": "Zwróć losowy element z listy.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "reszta z dzielenia %1 przez %2", - "MATH_MODULO_TOOLTIP": "Zwróć resztę z dzielenia dwóch liczb przez siebie.", - "MATH_CONSTRAIN_TITLE": "ogranicz %1 z dołu %2 z góry %3", - "MATH_CONSTRAIN_TOOLTIP": "Ogranicz liczbę, aby była w określonych granicach (włącznie).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "losowa liczba całkowita od %1 do %2", - "MATH_RANDOM_INT_TOOLTIP": "Zwróć losową liczbę całkowitą w ramach dwóch wyznaczonych granic, włącznie.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "losowy ułamek", - "MATH_RANDOM_FLOAT_TOOLTIP": "Zwróć losowy ułamek między 0.0 (włącznie), a 1.0 (wyłącznie).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Litera, wyraz lub linia tekstu.", - "TEXT_JOIN_TITLE_CREATEWITH": "utwórz tekst z", - "TEXT_JOIN_TOOLTIP": "Tworzy fragment tekstu, łącząc ze sobą dowolną liczbę tekstów.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "połącz", - "TEXT_CREATE_JOIN_TOOLTIP": "Dodaj, usuń lub zmień kolejność sekcji, aby zmodyfikować blok tekstowy.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Dodaj element do tekstu.", - "TEXT_APPEND_TO": "do", - "TEXT_APPEND_APPENDTEXT": "dołącz tekst", - "TEXT_APPEND_TOOLTIP": "Dołącz tekst do zmiennej '%1'.", - "TEXT_LENGTH_TITLE": "długość %1", - "TEXT_LENGTH_TOOLTIP": "Zwraca liczbę liter (łącznie ze spacjami) w podanym tekście.", - "TEXT_ISEMPTY_TITLE": "%1 jest pusty", - "TEXT_ISEMPTY_TOOLTIP": "Zwraca prawda (true), jeśli podany tekst jest pusty.", - "TEXT_INDEXOF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość 0, jeśli tekst nie został znaleziony.", - "TEXT_INDEXOF_INPUT_INTEXT": "w tekście", - "TEXT_INDEXOF_OPERATOR_FIRST": "znajdź pierwsze wystąpienie tekstu", - "TEXT_INDEXOF_OPERATOR_LAST": "znajdź ostatnie wystąpienie tekstu", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_INPUT_INTEXT": "z tekstu", - "TEXT_CHARAT_FROM_START": "pobierz literę #", - "TEXT_CHARAT_FROM_END": "pobierz literę # od końca", - "TEXT_CHARAT_FIRST": "pobierz pierwszą literę", - "TEXT_CHARAT_LAST": "pobierz ostatnią literę", - "TEXT_CHARAT_RANDOM": "pobierz losową literę", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "Zwraca literę z określonej pozycji.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Zwraca określoną część tekstu.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "w tekście", - "TEXT_GET_SUBSTRING_START_FROM_START": "pobierz podciąg od litery #", - "TEXT_GET_SUBSTRING_START_FROM_END": "pobierz podciąg od litery # od końca", - "TEXT_GET_SUBSTRING_START_FIRST": "pobierz podciąg od pierwszej litery", - "TEXT_GET_SUBSTRING_END_FROM_START": "do litery #", - "TEXT_GET_SUBSTRING_END_FROM_END": "do litery # od końca", - "TEXT_GET_SUBSTRING_END_LAST": "do ostatniej litery", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "Zwraca kopię tekstu z inną wielkością liter.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "zmień na WIELKIE LITERY", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "zmień na małe litery", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "zmień na od Wielkich Liter", - "TEXT_TRIM_TOOLTIP": "Zwraca kopię tekstu z usuniętymi spacjami z jednego lub z obu końców tekstu.", - "TEXT_TRIM_OPERATOR_BOTH": "usuń spacje po obu stronach", - "TEXT_TRIM_OPERATOR_LEFT": "usuń spacje z lewej strony", - "TEXT_TRIM_OPERATOR_RIGHT": "usuń spacje z prawej strony", - "TEXT_PRINT_TITLE": "wydrukuj %1", - "TEXT_PRINT_TOOLTIP": "Drukuj określony tekst, liczbę lub coś innego.", - "TEXT_PROMPT_TYPE_TEXT": "poproś o tekst z tą wiadomością", - "TEXT_PROMPT_TYPE_NUMBER": "poproś o liczbę z tą wiadomością", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Zapytaj użytkownika o liczbę.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Zapytaj użytkownika o jakiś tekst.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "utwórz pustą listę", - "LISTS_CREATE_EMPTY_TOOLTIP": "Zwraca listę, o długości 0, nie zawierającą rekordów z danymi", - "LISTS_CREATE_WITH_TOOLTIP": "Utwórz listę z dowolną ilością elementów.", - "LISTS_CREATE_WITH_INPUT_WITH": "Tworzenie listy z", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Dodać, usunąć lub zmienić kolejność sekcji żeby zrekonfigurować blok tej listy.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Dodaj element do listy.", - "LISTS_REPEAT_TOOLTIP": "Tworzy listę składającą się z podanej wartości powtórzonej odpowiednią liczbę razy.", - "LISTS_REPEAT_TITLE": "stwórz listę, powtarzając element %1 %2 razy", - "LISTS_LENGTH_TITLE": "długość %1", - "LISTS_LENGTH_TOOLTIP": "Zwraca długość listy.", - "LISTS_ISEMPTY_TITLE": "%1 jest pusty", - "LISTS_ISEMPTY_TOOLTIP": "Zwraca \"prawda\" jeśli lista jest pusta.", - "LISTS_INLIST": "na liście", - "LISTS_INDEX_OF_FIRST": "znaleźć pierwsze wystąpienie elementu", - "LISTS_INDEX_OF_LAST": "znajduje ostatanie wystąpienie elementu", - "LISTS_INDEX_OF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia elementu na liście. Zwraca wartość 0, jeśli tekst nie zostanie znaleziony.", - "LISTS_GET_INDEX_GET": "pobierz", - "LISTS_GET_INDEX_GET_REMOVE": "Pobierz i usuń", - "LISTS_GET_INDEX_REMOVE": "usuń", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# od końca", - "LISTS_GET_INDEX_FIRST": "pierwszy", - "LISTS_GET_INDEX_LAST": "ostatni", - "LISTS_GET_INDEX_RANDOM": "losowy", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Zwraca element z konkretnej pozycji na liście. #1 to pierwszy element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Zwraca element z określonej pozycji na liście. #1 to ostatni element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Zwraca pierwszy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Zwraca ostatni element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Zwraca losowy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Usuwa i zwraca element z określonej pozycji na liście. #1 to pierwszy element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Usuwa i zwraca element z określonej pozycji na liście. #1 to ostatni element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Usuwa i zwraca pierwszy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Usuwa i zwraca ostatni element z listy.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Usuwa i zwraca losowy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Usuwa element z określonej pozycji na liście. #1 to pierwszy element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Usuwa element z określonej pozycji na liście. #1 to ostatni element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Usuwa pierwszy element z listy.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Usuwa ostatni element z listy.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Usuwa losowy element z listy.", - "LISTS_SET_INDEX_SET": "ustaw", - "LISTS_SET_INDEX_INSERT": "wstaw w", - "LISTS_SET_INDEX_INPUT_TO": "jako", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Ustawia element w odpowiednie miejsce na liście. #1 to pierwszy element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Ustawia element w odpowiednie miejsce na liście. #1 to ostatni element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Ustawia pierwszy element na liście.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Ustawia ostatni element na liście.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Ustawia losowy element na liście.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Wstawia element w odpowiednim miejscu na liście. #1 to pierwszy element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Wstawia element w odpowiednim miejscu na liście. #1 to ostatni element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Wstawia element na początku listy.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Dodaj element na koniec listy.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Wstawia element w losowym miejscu na liście.", - "LISTS_GET_SUBLIST_START_FROM_START": "Pobierz listę podrzędną z #", - "LISTS_GET_SUBLIST_START_FROM_END": "Pobierz listę podrzędną z # od końca", - "LISTS_GET_SUBLIST_START_FIRST": "Pobierz listę podrzędną z pierwszego", - "LISTS_GET_SUBLIST_END_FROM_START": "do #", - "LISTS_GET_SUBLIST_END_FROM_END": "do # od końca", - "LISTS_GET_SUBLIST_END_LAST": "do ostatniego", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "Tworzy kopię z określoną część listy.", - "LISTS_SPLIT_LIST_FROM_TEXT": "stwórz listę z tekstu", - "LISTS_SPLIT_TEXT_FROM_LIST": "stwórz tekst z listy", - "LISTS_SPLIT_WITH_DELIMITER": "z separatorem", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Rozdziela tekst na listę mniejszych tekstów, dzieląc na każdym separatorze.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Łączy listę tekstów w jeden tekst, rozdzielany separatorem.", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_TOOLTIP": "Zwraca wartość tej zmiennej.", - "VARIABLES_GET_CREATE_SET": "Utwórz blok 'ustaw %1'", - "VARIABLES_SET": "przypisz %1 wartość %2", - "VARIABLES_SET_TOOLTIP": "Nadaj tej zmiennej wartość.", - "VARIABLES_SET_CREATE_GET": "Utwórz blok 'pobierz %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "do", - "PROCEDURES_DEFNORETURN_PROCEDURE": "zrób coś", - "PROCEDURES_BEFORE_PARAMS": "z:", - "PROCEDURES_CALL_BEFORE_PARAMS": "z:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Tworzy funkcję bez wyniku.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "zwróć", - "PROCEDURES_DEFRETURN_TOOLTIP": "Tworzy funkcję z wynikiem.", - "PROCEDURES_ALLOW_STATEMENTS": "zezwól na instrukcje", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Ostrzeżenie: Ta funkcja ma powtórzone parametry.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Uruchom funkcję zdefiniowaną przez użytkownika '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Uruchom funkcję zdefiniowaną przez użytkownika '%1' i skorzystaj z jej wyniku.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "wejścia", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Dodaj, usuń lub zmień kolejność danych wejściowych dla tej funkcji.", - "PROCEDURES_MUTATORARG_TITLE": "nazwa wejścia:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Dodaj dane wejściowe do funkcji.", - "PROCEDURES_HIGHLIGHT_DEF": "Podświetl definicję funkcji", - "PROCEDURES_CREATE_DO": "Stwórz '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Jeśli wartość jest prawdziwa, zwróć drugą wartość.", - "PROCEDURES_IFRETURN_WARNING": "Ostrzeżenie: Ten blok może być używany tylko w definicji funkcji." -} diff --git a/msg/json/pms.json b/msg/json/pms.json deleted file mode 100644 index 84ae288a7f..0000000000 --- a/msg/json/pms.json +++ /dev/null @@ -1,305 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Borichèt" - ] - }, - "VARIABLES_DEFAULT_NAME": "element", - "TODAY": "Ancheuj", - "DUPLICATE_BLOCK": "Dupliché", - "ADD_COMMENT": "Gionté un coment", - "REMOVE_COMMENT": "Scancelé un coment", - "EXTERNAL_INPUTS": "Imission esterne", - "INLINE_INPUTS": "Imission an linia", - "DELETE_BLOCK": "Scancelé ël blòch", - "DELETE_X_BLOCKS": "Scancelé %1 blòch", - "DELETE_ALL_BLOCKS": "Scancelé tuti ij %1 blòch?", - "CLEAN_UP": "Dëscancelé ij blòch", - "COLLAPSE_BLOCK": "Arduve ël blòch", - "COLLAPSE_ALL": "Arduve ij blòch", - "EXPAND_BLOCK": "Dësvlupé ël blòch", - "EXPAND_ALL": "Dësvlupé ij blòch", - "DISABLE_BLOCK": "Disativé ël blòch", - "ENABLE_BLOCK": "Ativé ël blòch", - "HELP": "Agiut", - "CHAT": "Ch'a ciaciara con sò colaborator an scrivend an costa casela!", - "AUTH": "Për piasì, ch'a autorisa costa aplicassion a përmëtte ëd salvé sò travaj e a autoriselo a esse partagià da chiel.", - "ME": "Mi", - "CHANGE_VALUE_TITLE": "Modifiché ël valor:", - "NEW_VARIABLE": "Neuva variàbil...", - "NEW_VARIABLE_TITLE": "Nòm ëd la neuva variàbil:", - "RENAME_VARIABLE": "Arnomé la variàbil...", - "RENAME_VARIABLE_TITLE": "Arnomé tute le variàbij '%1' 'me:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Serne un color ant la taulòssa.", - "COLOUR_RANDOM_TITLE": "color a asar", - "COLOUR_RANDOM_TOOLTIP": "Serne un color a asar.", - "COLOUR_RGB_TITLE": "coloré con", - "COLOUR_RGB_RED": "ross", - "COLOUR_RGB_GREEN": "verd", - "COLOUR_RGB_BLUE": "bleu", - "COLOUR_RGB_TOOLTIP": "Creé un color con la quantità spessificà ëd ross, verd e bleu. Tuti ij valor a devo esse antra 0 e 100.", - "COLOUR_BLEND_TITLE": "mës-cé", - "COLOUR_BLEND_COLOUR1": "color 1", - "COLOUR_BLEND_COLOUR2": "color 2", - "COLOUR_BLEND_RATIO": "rapòrt", - "COLOUR_BLEND_TOOLTIP": "A mës-cia doi color ansema con un rapòrt dàit (0,0 - 1,0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "arpete %1 vire", - "CONTROLS_REPEAT_INPUT_DO": "fé", - "CONTROLS_REPEAT_TOOLTIP": "Eseguì chèiche anstrussion vàire vire.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "arpete antramentre che", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "arpete fin-a a", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Cand un valor a l'é ver, eseguì chèiche anstrussion.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Cand un valor a l'é fàuss, eseguì chèiche anstrussion.", - "CONTROLS_FOR_TOOLTIP": "Fé an manera che la variàbil \"%1\" a pija ij valor dal nùmer inissial fin-a al nùmer final, an contand për l'antërval ëspessificà, e eseguì ij bloch ëspessificà.", - "CONTROLS_FOR_TITLE": "conté con %1 da %2 a %3 për %4", - "CONTROLS_FOREACH_TITLE": "për minca n'element %1 ant la lista %2", - "CONTROLS_FOREACH_TOOLTIP": "Për minca element an na lista, dé ël valor ëd l'element a la variàbil '%1', peui eseguì chèiche anstrussion.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "seurte da la liassa", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continué con l'iterassion sucessiva dla liassa", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Seurte da la liassa anglobanta.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sauté ël rest ëd sa liassa, e continué con l'iterassion apress.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Atension: Ës blòch a peul mach esse dovrà andrinta a na liassa.", - "CONTROLS_IF_TOOLTIP_1": "Si un valor a l'é ver, antlora eseguì chèiche anstrussion.", - "CONTROLS_IF_TOOLTIP_2": "Si un valor a l'é ver, antlora eseguì ël prim blòch d'anstrussion. Dësnò, eseguì ël second blòch d'anstrussion.", - "CONTROLS_IF_TOOLTIP_3": "Si ël prim valor a l'é ver, antlora fé andé ël prim blòch d'anstrussion. Dësnò, si ël second valor a l'é ver, fé andé ël second blòch d'anstrussion.", - "CONTROLS_IF_TOOLTIP_4": "Si ël prim valor a l'é ver, antlora fé andé ël prim blòch d'anstrussion. Dësnò, si ël second valor a l'é ver, fé andé ël second blòcj d'anstrussion. Si gnun dij valor a l'é ver, fé andé l'ùltim blòch d'anstrussion.", - "CONTROLS_IF_MSG_IF": "si", - "CONTROLS_IF_MSG_ELSEIF": "dësnò si", - "CONTROLS_IF_MSG_ELSE": "dësnò", - "CONTROLS_IF_IF_TOOLTIP": "Gionté, gavé o riordiné le session për cinfiguré torna ës blòch si.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Gionté na condission al blòch si.", - "CONTROLS_IF_ELSE_TOOLTIP": "Gionté na condission final ch'a cheuj tut al blòch si.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Rësponde ver si le doe imission a son uguaj.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Rësponde ver si le doe imission a son nen uguaj.", - "LOGIC_COMPARE_TOOLTIP_LT": "Rësponde ver si la prima imission a l'é pi cita dla sconda.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Rësponde ver si la prima imission a l'é pi cita o ugual a la sconda.", - "LOGIC_COMPARE_TOOLTIP_GT": "Rësponde ver si la prima imission a l'é pi granda che la sconda.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Rësponde ver si la prima imission a l'é pi granda o ugual a la sconda.", - "LOGIC_OPERATION_TOOLTIP_AND": "Rësponde ver se tute doe j'imission a son vere.", - "LOGIC_OPERATION_AND": "e", - "LOGIC_OPERATION_TOOLTIP_OR": "Rësponde ver se almanch un-a d'imission a l'é vera.", - "LOGIC_OPERATION_OR": "o", - "LOGIC_NEGATE_TITLE": "nen %1", - "LOGIC_NEGATE_TOOLTIP": "A rëspond ver se l'imission a l'é fàussa. A rëspond fàuss se l'imission a l'é vera.", - "LOGIC_BOOLEAN_TRUE": "ver", - "LOGIC_BOOLEAN_FALSE": "fàuss", - "LOGIC_BOOLEAN_TOOLTIP": "A rëspond ver o fàuss.", - "LOGIC_NULL": "gnente", - "LOGIC_NULL_TOOLTIP": "A rëspond gnente.", - "LOGIC_TERNARY_CONDITION": "preuva", - "LOGIC_TERNARY_IF_TRUE": "se ver", - "LOGIC_TERNARY_IF_FALSE": "se fàuss", - "LOGIC_TERNARY_TOOLTIP": "Controlé la condission an 'preuva'. Se la condission a l'é vera, a rëspond con ël valor 'se ver'; dësnò a rëspond con ël valor 'se fàuss'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Un nùmer.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "A smon la soma ëd doi nùmer.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "A smon la diferensa dij doi nùmer.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "A smon ël prodot dij doi nùmer.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "A smon ël cossient dij doi nùmer.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "A smon ël prim nùmer alvà a la potensa dël second.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "rèis quadra", - "MATH_SINGLE_TOOLTIP_ROOT": "A smon la rèis quadra d'un nùmer.", - "MATH_SINGLE_OP_ABSOLUTE": "assolù", - "MATH_SINGLE_TOOLTIP_ABS": "A smon ël valor assolù d'un nùmer.", - "MATH_SINGLE_TOOLTIP_NEG": "A smon l'opòst d'un nùmer.", - "MATH_SINGLE_TOOLTIP_LN": "A smon ël logaritm natural d'un nùmer.", - "MATH_SINGLE_TOOLTIP_LOG10": "A smon ël logaritm an base 10 d'un nùmer.", - "MATH_SINGLE_TOOLTIP_EXP": "A smon e a la potensa d'un nùmer.", - "MATH_SINGLE_TOOLTIP_POW10": "A smon 10 a la potensa d'un nùmer.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "A smon ël sen ëd n'àngol an gré (pa an radiant).", - "MATH_TRIG_TOOLTIP_COS": "A smon ël cosen ëd n'àngol an gré (pa an radiant).", - "MATH_TRIG_TOOLTIP_TAN": "A smon la tangenta ëd n'àngol an gré (pa an radiant).", - "MATH_TRIG_TOOLTIP_ASIN": "A smon l'arch-sen d'un nùmer.", - "MATH_TRIG_TOOLTIP_ACOS": "A smon l'arch-cosen d'un nùmer.", - "MATH_TRIG_TOOLTIP_ATAN": "A smon l'arch-tangenta d'un nùmer.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "A smon un-a dle costante comun-e π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) o ∞ (infinì).", - "MATH_IS_EVEN": "a l'é cobi", - "MATH_IS_ODD": "a l'é dëscobi", - "MATH_IS_PRIME": "a l'é prim", - "MATH_IS_WHOLE": "a l'é antregh", - "MATH_IS_POSITIVE": "a l'é positiv", - "MATH_IS_NEGATIVE": "a l'é negativ", - "MATH_IS_DIVISIBLE_BY": "a l'é divisìbil për", - "MATH_IS_TOOLTIP": "A contròla si un nùmer a l'é cobi, dëscobi, prim, antreghm positiv, negativ, o s'a l'é divisìbil për un nùmer dàit. A rëspond ver o fàuss.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "ancrementé %1 për %2", - "MATH_CHANGE_TOOLTIP": "Gionté un nùmer a la variàbil '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "A arionda un nùmer për difet o ecess.", - "MATH_ROUND_OPERATOR_ROUND": "ariondé", - "MATH_ROUND_OPERATOR_ROUNDUP": "ariondé për ecess", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "ariondé për difet", - "MATH_ONLIST_OPERATOR_SUM": "soma dla lista", - "MATH_ONLIST_TOOLTIP_SUM": "A smon la soma ëd tuti ij nùmer ant la lista.", - "MATH_ONLIST_OPERATOR_MIN": "mìnim ëd la lista", - "MATH_ONLIST_TOOLTIP_MIN": "A smon ël pi cit nùmer ëd la lista.", - "MATH_ONLIST_OPERATOR_MAX": "màssim ëd la lista", - "MATH_ONLIST_TOOLTIP_MAX": "A smon ël pi gròss nùmer ëd la lista.", - "MATH_ONLIST_OPERATOR_AVERAGE": "media dla lista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "A smon la media (aritmética) dij valor numérich ant la lista.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mesan-a dla lista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "A smon ël nùmer mesan ëd la lista.", - "MATH_ONLIST_OPERATOR_MODE": "mòde dla lista", - "MATH_ONLIST_TOOLTIP_MODE": "A smon na lista dj'element pi frequent ëd la lista.", - "MATH_ONLIST_OPERATOR_STD_DEV": "deviassion ëstàndard ëd la lista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "A smon la deviassion ëstàndard ëd la lista.", - "MATH_ONLIST_OPERATOR_RANDOM": "element a l'ancàpit ëd la lista", - "MATH_ONLIST_TOOLTIP_RANDOM": "A smon n'element a l'ancàpit da la lista.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "resta ëd %1:%2", - "MATH_MODULO_TOOLTIP": "A smon la resta ëd la division dij doi nùmer.", - "MATH_CONSTRAIN_TITLE": "limité %1 antra %2 e %3", - "MATH_CONSTRAIN_TOOLTIP": "Limité un nùmer a esse antra le limitassion ëspessificà (comprèise).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "antregh aleatòri antra %1 e %2", - "MATH_RANDOM_INT_TOOLTIP": "A smon n'antregh aleatòri antra ij doi lìmit ëspessificà, comprèis.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "frassion aleatòria", - "MATH_RANDOM_FLOAT_TOOLTIP": "A smon na frassion aleatòria antra 0,0 (comprèis) e 1,0 (esclus).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Na litra, na paròla o na linia ëd test.", - "TEXT_JOIN_TITLE_CREATEWITH": "creé ël test con", - "TEXT_JOIN_TOOLTIP": "Creé un tòch ëd test an gionzend un nùmer qualsëssìa d'element.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "gionze", - "TEXT_CREATE_JOIN_TOOLTIP": "Gionté, gavé o riordiné le session për configuré torna ës blòch ëd test.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Gionté n'element al test.", - "TEXT_APPEND_TO": "a", - "TEXT_APPEND_APPENDTEXT": "taché ël test", - "TEXT_APPEND_TOOLTIP": "Taché dël test a la variàbil '%1'.", - "TEXT_LENGTH_TITLE": "longheur ëd %1", - "TEXT_LENGTH_TOOLTIP": "A smon ël nùmer ëd litre (spassi comprèis) ant ël test fornì.", - "TEXT_ISEMPTY_TITLE": "%1 a l'é veuid", - "TEXT_ISEMPTY_TOOLTIP": "A smon ver se ël test fornì a l'é veuid.", - "TEXT_INDEXOF_TOOLTIP": "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon 0 se ël test a l'é nen trovà.", - "TEXT_INDEXOF_INPUT_INTEXT": "ant ël test", - "TEXT_INDEXOF_OPERATOR_FIRST": "trové la prima ocorensa dël test", - "TEXT_INDEXOF_OPERATOR_LAST": "trové l'ùltima ocorensa dël test", - "TEXT_CHARAT_INPUT_INTEXT": "ant ël test", - "TEXT_CHARAT_FROM_START": "oten-e la litra #", - "TEXT_CHARAT_FROM_END": "oten-e la litra # da la fin", - "TEXT_CHARAT_FIRST": "oten-e la prima litra", - "TEXT_CHARAT_LAST": "oten-e l'ùltima litra", - "TEXT_CHARAT_RANDOM": "oten-e na litra a l'ancàpit", - "TEXT_CHARAT_TOOLTIP": "A smon la litra ant la posission ëspessificà.", - "TEXT_GET_SUBSTRING_TOOLTIP": "A smon un tòch ëspessificà dël test.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ant ël test", - "TEXT_GET_SUBSTRING_START_FROM_START": "oten-e la sota-stringa da la litra #", - "TEXT_GET_SUBSTRING_START_FROM_END": "oten-e la sota-stringa da la litra # da la fin", - "TEXT_GET_SUBSTRING_START_FIRST": "oten-e la sota-stringa da la prima litra", - "TEXT_GET_SUBSTRING_END_FROM_START": "fin-a a la litra #", - "TEXT_GET_SUBSTRING_END_FROM_END": "fin-a a la litra # da la fin", - "TEXT_GET_SUBSTRING_END_LAST": "fin-a a l'ùltima litra", - "TEXT_CHANGECASE_TOOLTIP": "A smon na còpia dël test ant un caràter diferent.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "an MAJÙSCOL", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "an minùscul", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "an Majùscol A L'Ancamin Ëd Minca Paròla", - "TEXT_TRIM_TOOLTIP": "A smon na còpia dël test con jë spassi gavà da n'estremità o da tute doe.", - "TEXT_TRIM_OPERATOR_BOTH": "gavé jë spassi da le doe bande ëd", - "TEXT_TRIM_OPERATOR_LEFT": "gavé jë spassi da la banda snistra ëd", - "TEXT_TRIM_OPERATOR_RIGHT": "gavé jë spassi da la banda drita ëd", - "TEXT_PRINT_TITLE": "smon-e %1", - "TEXT_PRINT_TOOLTIP": "Smon-e ël test, ël nùmer o n'àutr valor ëspessificà.", - "TEXT_PROMPT_TYPE_TEXT": "anvit për un test con un mëssagi", - "TEXT_PROMPT_TYPE_NUMBER": "anvit për un nùmer con un mëssagi", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Ciamé un nùmer a l'utent.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Ciamé un test a l'utent.", - "LISTS_CREATE_EMPTY_TITLE": "creé na lista veuida", - "LISTS_CREATE_EMPTY_TOOLTIP": "Smon-e na lista, ëd longheur 0, ch'a conten gnun-a argistrassion", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Creé na lista con un nùmer qualsëssìa d'element.", - "LISTS_CREATE_WITH_INPUT_WITH": "creé na lista con", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Gionté, gavé o riordiné le session për configuré torna cost blòch ëd lista.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Gionté n'element a la lista.", - "LISTS_REPEAT_TOOLTIP": "A crea na lista ch'a consist dël valor dàit arpetù ël nùmer ëspessificà ëd vire.", - "LISTS_REPEAT_TITLE": "creé na lista con l'element %1 arpetù %2 vire", - "LISTS_LENGTH_TITLE": "longheur ëd %1", - "LISTS_LENGTH_TOOLTIP": "A smon la longheur ¨d na lista.", - "LISTS_ISEMPTY_TITLE": "%1 a l'é veuid", - "LISTS_ISEMPTY_TOOLTIP": "A smon ver se la lista a l'é veuida.", - "LISTS_INLIST": "ant la lista", - "LISTS_INDEX_OF_FIRST": "trové la prima ocorensa dl'element", - "LISTS_INDEX_OF_LAST": "trové l'ùltima ocorensa dl'element", - "LISTS_INDEX_OF_TOOLTIP": "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon 0 se l'element a l'é nen trovà.", - "LISTS_GET_INDEX_GET": "oten-e", - "LISTS_GET_INDEX_GET_REMOVE": "oten-e e eliminé", - "LISTS_GET_INDEX_REMOVE": "eliminé", - "LISTS_GET_INDEX_FROM_END": "# da la fin", - "LISTS_GET_INDEX_FIRST": "prim", - "LISTS_GET_INDEX_LAST": "ùltim", - "LISTS_GET_INDEX_RANDOM": "a l'ancàpit", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "A smon l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "A smon l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "A smon ël prim element an na lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "A smon l'ùltim element an na lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "A smon n'element a l'ancàpit an na lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "A gava e a smon l'element a la posission ëspessificà an na lista. #1 a l'é 'l prim element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "A gava e a smon l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "A gava e a smon ël prim element an na lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "A gava e a smon l'ùltim element an na lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "A gava e a smon n'element a l'ancàpit an na lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "A gava l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "A gava l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "A gava ël prim element an na lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "A gava l'ùltim element an na lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "A gava n'element a l'ancàpit da na lista.", - "LISTS_SET_INDEX_SET": "buté", - "LISTS_SET_INDEX_INSERT": "anserì an", - "LISTS_SET_INDEX_INPUT_TO": "tanme", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "A fissa l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "A fissa l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "A fissa ël prim element an na lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "A fissa l'ùltim element an na lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "A fissa n'element a l'ancàpit an na lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "A anseriss l'element a la posission ëspessificà an na lista. #1 a l'é ël prim element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "A anseriss l'element a la posission ëspessificà an na lista. #1 a l'é l'ùltim element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "A anseriss l'element al prinsipi ëd na lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Gionté l'element a la fin ëd na lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "A anseriss l'element a l'ancàpit an na lista.", - "LISTS_GET_SUBLIST_START_FROM_START": "oten-e la sot-lista da #", - "LISTS_GET_SUBLIST_START_FROM_END": "oten-e la sot-lista da # da la fin", - "LISTS_GET_SUBLIST_START_FIRST": "oten-e la sot-lista dal prim", - "LISTS_GET_SUBLIST_END_FROM_START": "fin-a a #", - "LISTS_GET_SUBLIST_END_FROM_END": "fin-a a # da la fin", - "LISTS_GET_SUBLIST_END_LAST": "fin-a a l'ùltim", - "LISTS_GET_SUBLIST_TOOLTIP": "A crea na còpia dël tòch ëspessificà ëd na lista.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "fé na lista da 'n test", - "LISTS_SPLIT_TEXT_FROM_LIST": "fé 'n test da na lista", - "LISTS_SPLIT_WITH_DELIMITER": "con ël separator", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Divide un test an na lista ëd test, tajand a minca 'n separator.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Gionze na lista ëd test ant un test sol, separandje con un separator.", - "VARIABLES_GET_TOOLTIP": "A smon ël valor ëd sa variàbil.", - "VARIABLES_GET_CREATE_SET": "Creé 'fissé %1'", - "VARIABLES_SET": "fissé %1 a %2", - "VARIABLES_SET_TOOLTIP": "Fissé costa variàbil ugual al valor d'imission.", - "VARIABLES_SET_CREATE_GET": "Creé 'oten-e %1'", - "PROCEDURES_DEFNORETURN_TITLE": "a", - "PROCEDURES_DEFNORETURN_PROCEDURE": "fé cheicòs", - "PROCEDURES_BEFORE_PARAMS": "con:", - "PROCEDURES_CALL_BEFORE_PARAMS": "con:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "A crea na fonsion sensa surtìa.", - "PROCEDURES_DEFRETURN_RETURN": "artorn", - "PROCEDURES_DEFRETURN_TOOLTIP": "A crea na fonsion con na surtìa.", - "PROCEDURES_ALLOW_STATEMENTS": "përmëtte le diciairassion", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Atension: Costa fonsion a l'ha dij paràmeter duplicà.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Eseguì la fonsion '%1' definìa da l'utent.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Eseguì la fonsion '%1' definìa da l'utent e dovré sò arzultà.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "imission", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Gionté, gavé o riordiné j'imission ëd sa fonsion.", - "PROCEDURES_MUTATORARG_TITLE": "nòm ëd l'imission:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Gionté n'imission a la fonsion.", - "PROCEDURES_HIGHLIGHT_DEF": "Sot-ligné la definission dla fonsion", - "PROCEDURES_CREATE_DO": "Creé '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Se un valor a l'é ver, antlora smon-e un second valor.", - "PROCEDURES_IFRETURN_WARNING": "Atension: Ës blòch a podria esse dovrà mach an na definission ëd fonsion." -} diff --git a/msg/json/pt-br.json b/msg/json/pt-br.json deleted file mode 100644 index b0b8feb2ee..0000000000 --- a/msg/json/pt-br.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Espertus", - "Prilopes", - "Mordecaista", - "Amgauna", - "TheGabrielZaum", - "Cainamarques", - "Tuliouel", - "Rodrigo codignoli", - "Webysther", - "Fasouzafreitas", - "Almondega" - ] - }, - "VARIABLES_DEFAULT_NAME": "item", - "TODAY": "Hoje", - "DUPLICATE_BLOCK": "Duplicar", - "ADD_COMMENT": "Adicionar comentário", - "REMOVE_COMMENT": "Remover comentário", - "EXTERNAL_INPUTS": "Entradas externas", - "INLINE_INPUTS": "Entradas incorporadas", - "DELETE_BLOCK": "Remover bloco", - "DELETE_X_BLOCKS": "Remover %1 blocos", - "DELETE_ALL_BLOCKS": "Apagar todos os %1 blocos?", - "CLEAN_UP": "Limpar blocos", - "COLLAPSE_BLOCK": "Recolher bloco", - "COLLAPSE_ALL": "Recolher blocos", - "EXPAND_BLOCK": "Expandir bloco", - "EXPAND_ALL": "Expandir blocos", - "DISABLE_BLOCK": "Desabilitar bloco", - "ENABLE_BLOCK": "Habilitar bloco", - "HELP": "Ajuda", - "CHAT": "Converse com o seu colaborador digitando nesta caixa!", - "AUTH": "Por favor autorize este aplicativo para permitir que o seu trabalho seja gravado e que ele seja compartilhado por você.", - "ME": "Eu", - "CHANGE_VALUE_TITLE": "Mudar valor:", - "NEW_VARIABLE": "Nova variável...", - "NEW_VARIABLE_TITLE": "Nome da nova variável:", - "RENAME_VARIABLE": "Renomear variável...", - "RENAME_VARIABLE_TITLE": "Renomear todas as variáveis '%1' para:", - "COLOUR_PICKER_HELPURL": "https://pt.wikipedia.org/wiki/Cor", - "COLOUR_PICKER_TOOLTIP": "Escolher uma cor da palheta de cores.", - "COLOUR_RANDOM_TITLE": "cor aleatória", - "COLOUR_RANDOM_TOOLTIP": "Escolher cor de forma aleatória.", - "COLOUR_RGB_TITLE": "colorir com", - "COLOUR_RGB_RED": "vermelho", - "COLOUR_RGB_GREEN": "verde", - "COLOUR_RGB_BLUE": "azul", - "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.", - "COLOUR_BLEND_TITLE": "misturar", - "COLOUR_BLEND_COLOUR1": "cor 1", - "COLOUR_BLEND_COLOUR2": "cor 2", - "COLOUR_BLEND_RATIO": "proporção", - "COLOUR_BLEND_TOOLTIP": "Mistura duas cores em uma dada proporção (0,0 - 1,0).", - "CONTROLS_REPEAT_HELPURL": "https://pt.wikipedia.org/wiki/Estrutura_de_repeti%C3%A7%C3%A3o#Repeti.C3.A7.C3.A3o_com_vari.C3.A1vel_de_controle", - "CONTROLS_REPEAT_TITLE": "repita %1 vezes", - "CONTROLS_REPEAT_INPUT_DO": "faça", - "CONTROLS_REPEAT_TOOLTIP": "Faça algumas instruções várias vezes.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repita enquanto", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repita até", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Enquanto um valor for verdadeiro, então faça algumas instruções.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Enquanto um valor for falso, então faça algumas instruções.", - "CONTROLS_FOR_TOOLTIP": "Faz com que a variável '%1' assuma os valores do número inicial ao número final, contando de acordo com o intervalo especificado e executa os blocos especificados.", - "CONTROLS_FOR_TITLE": "contar com %1 de %2 até %3 por %4", - "CONTROLS_FOREACH_TITLE": "para cada item %1 na lista %2", - "CONTROLS_FOREACH_TOOLTIP": "Para cada item em uma lista, atribui o item à variável '%1' e então realiza algumas instruções.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "encerra o laço", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continua com a próxima iteração do laço", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Encerra o laço.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Ignora o resto deste laço, e continua com a próxima iteração.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Atenção: Este bloco só pode ser usado dentro de um laço.", - "CONTROLS_IF_TOOLTIP_1": "Se um valor for verdadeiro, então realize algumas instruções.", - "CONTROLS_IF_TOOLTIP_2": "Se um valor for verdadeiro, então realize o primeiro bloco de instruções. Senão, realize o segundo bloco de instruções.", - "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.", - "CONTROLS_IF_TOOLTIP_4": "Se o primeiro valor for 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.", - "CONTROLS_IF_MSG_IF": "se", - "CONTROLS_IF_MSG_ELSEIF": "senão se", - "CONTROLS_IF_MSG_ELSE": "senão", - "CONTROLS_IF_IF_TOOLTIP": "Acrescente, remova ou reordene seções para reconfigurar este bloco.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Acrescente uma condição para o bloco se.", - "CONTROLS_IF_ELSE_TOOLTIP": "Acrescente uma condição final para o bloco se.", - "LOGIC_COMPARE_HELPURL": "https://pt.wikipedia.org/wiki/Inequa%C3%A7%C3%A3o", - "LOGIC_COMPARE_TOOLTIP_EQ": "Retorna verdadeiro se ambas as entradas forem iguais.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Retorna verdadeiro se ambas as entradas forem diferentes.", - "LOGIC_COMPARE_TOOLTIP_LT": "Retorna verdadeiro se a primeira entrada for menor que a segunda entrada.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Retorna verdadeiro se a primeira entrada for menor ou igual à segunda entrada.", - "LOGIC_COMPARE_TOOLTIP_GT": "Retorna verdadeiro se a primeira entrada for maior que a segunda entrada.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Retorna verdadeiro se a primeira entrada for maior ou igual à segunda entrada.", - "LOGIC_OPERATION_TOOLTIP_AND": "Retorna verdadeiro se ambas as entradas forem verdadeiras.", - "LOGIC_OPERATION_AND": "e", - "LOGIC_OPERATION_TOOLTIP_OR": "Retorna verdadeiro se uma das estradas for verdadeira.", - "LOGIC_OPERATION_OR": "ou", - "LOGIC_NEGATE_TITLE": "não %1", - "LOGIC_NEGATE_TOOLTIP": "Retorna verdadeiro se a entrada for falsa. Retorna falsa se a entrada for verdadeira.", - "LOGIC_BOOLEAN_TRUE": "verdadeiro", - "LOGIC_BOOLEAN_FALSE": "falso", - "LOGIC_BOOLEAN_TOOLTIP": "Retorna verdadeiro ou falso.", - "LOGIC_NULL": "nulo", - "LOGIC_NULL_TOOLTIP": "Retorna nulo.", - "LOGIC_TERNARY_CONDITION": "teste", - "LOGIC_TERNARY_IF_TRUE": "se verdadeiro", - "LOGIC_TERNARY_IF_FALSE": "se falso", - "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\".", - "MATH_NUMBER_HELPURL": "https://pt.wikipedia.org/wiki/N%C3%BAmero", - "MATH_NUMBER_TOOLTIP": "Um número.", - "MATH_ARITHMETIC_HELPURL": "https://pt.wikipedia.org/wiki/Aritm%C3%A9tica", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Retorna a soma dos dois números.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Retorna a diferença entre os dois números.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Retorna o produto dos dois números.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Retorna o quociente da divisão dos dois números.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Retorna o primeiro número elevado à potência do segundo número.", - "MATH_SINGLE_HELPURL": "https://pt.wikipedia.org/wiki/Raiz_quadrada", - "MATH_SINGLE_OP_ROOT": "raiz quadrada", - "MATH_SINGLE_TOOLTIP_ROOT": "Retorna a raiz quadrada de um número.", - "MATH_SINGLE_OP_ABSOLUTE": "absoluto", - "MATH_SINGLE_TOOLTIP_ABS": "Retorna o valor absoluto de um número.", - "MATH_SINGLE_TOOLTIP_NEG": "Retorna o oposto de um número.", - "MATH_SINGLE_TOOLTIP_LN": "Retorna o logaritmo natural de um número.", - "MATH_SINGLE_TOOLTIP_LOG10": "Retorna o logaritmo em base 10 de um número.", - "MATH_SINGLE_TOOLTIP_EXP": "Retorna o número e elevado à potência de um número.", - "MATH_SINGLE_TOOLTIP_POW10": "Retorna 10 elevado à potência de um número.", - "MATH_TRIG_HELPURL": "https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_trigonom%C3%A9trica", - "MATH_TRIG_TOOLTIP_SIN": "Retorna o seno de um grau (não radiano).", - "MATH_TRIG_TOOLTIP_COS": "Retorna o cosseno de um grau (não radiano).", - "MATH_TRIG_TOOLTIP_TAN": "Retorna a tangente de um grau (não radiano).", - "MATH_TRIG_TOOLTIP_ASIN": "Retorna o arco seno de um número.", - "MATH_TRIG_TOOLTIP_ACOS": "Retorna o arco cosseno de um número.", - "MATH_TRIG_TOOLTIP_ATAN": "Retorna o arco tangente de um número.", - "MATH_CONSTANT_HELPURL": "https://pt.wikipedia.org/wiki/Anexo:Lista_de_constantes_matem%C3%A1ticas", - "MATH_CONSTANT_TOOLTIP": "Retorna uma das constantes comuns: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infinito).", - "MATH_IS_EVEN": "é par", - "MATH_IS_ODD": "é ímpar", - "MATH_IS_PRIME": "é primo", - "MATH_IS_WHOLE": "é inteiro", - "MATH_IS_POSITIVE": "é positivo", - "MATH_IS_NEGATIVE": "é negativo", - "MATH_IS_DIVISIBLE_BY": "é divisível por", - "MATH_IS_TOOLTIP": "Verifica se um número é par, ímpar, inteiro, positivo, negativo, ou se é divisível por outro número. Retorna verdadeiro ou falso.", - "MATH_CHANGE_HELPURL": "https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o", - "MATH_CHANGE_TITLE": "alterar %1 por %2", - "MATH_CHANGE_TOOLTIP": "Soma um número à variável \"%1\".", - "MATH_ROUND_HELPURL": "https://pt.wikipedia.org/wiki/Arredondamento", - "MATH_ROUND_TOOLTIP": "Arredonda um número para cima ou para baixo.", - "MATH_ROUND_OPERATOR_ROUND": "arredonda", - "MATH_ROUND_OPERATOR_ROUNDUP": "arredonda para cima", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "arredonda para baixo", - "MATH_ONLIST_OPERATOR_SUM": "soma de uma lista", - "MATH_ONLIST_TOOLTIP_SUM": "Retorna a soma de todos os números na lista.", - "MATH_ONLIST_OPERATOR_MIN": "menor da lista", - "MATH_ONLIST_TOOLTIP_MIN": "Retorna o menor número da lista.", - "MATH_ONLIST_OPERATOR_MAX": "maior da lista", - "MATH_ONLIST_TOOLTIP_MAX": "Retorna o maior número da lista.", - "MATH_ONLIST_OPERATOR_AVERAGE": "média da lista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Retorna a média aritmética dos números da lista.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana da lista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Retorna a mediana dos números da lista.", - "MATH_ONLIST_OPERATOR_MODE": "moda da lista", - "MATH_ONLIST_TOOLTIP_MODE": "Retorna uma lista do(s) item(ns) mais comum(ns) da lista.", - "MATH_ONLIST_OPERATOR_STD_DEV": "desvio padrão da lista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Retorna o desvio padrão dos números da lista.", - "MATH_ONLIST_OPERATOR_RANDOM": "item aleatório da lista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Retorna um elemento aleatório da lista.", - "MATH_MODULO_HELPURL": "https://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_m%C3%B3dulo", - "MATH_MODULO_TITLE": "resto da divisão de %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Retorna o resto da divisão de dois números.", - "MATH_CONSTRAIN_TITLE": "restringe %1 inferior %2 superior %3", - "MATH_CONSTRAIN_TOOLTIP": "Restringe um número entre os limites especificados (inclusivo).", - "MATH_RANDOM_INT_HELPURL": "https://pt.wikipedia.org/wiki/Gerador_de_n%C3%BAmeros_pseudoaleat%C3%B3rios", - "MATH_RANDOM_INT_TITLE": "inteiro aleatório entre %1 e %2", - "MATH_RANDOM_INT_TOOLTIP": "Retorna um número inteiro entre os dois limites informados, inclusivo.", - "MATH_RANDOM_FLOAT_HELPURL": "https://pt.wikipedia.org/wiki/Gerador_de_n%C3%BAmeros_pseudoaleat%C3%B3rios", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fração aleatória", - "MATH_RANDOM_FLOAT_TOOLTIP": "Retorna uma fração aleatória entre 0.0 (inclusivo) e 1.0 (exclusivo).", - "TEXT_TEXT_HELPURL": "https://pt.wikipedia.org/wiki/Cadeia_de_caracteres", - "TEXT_TEXT_TOOLTIP": "Uma letra, palavra ou linha de texto.", - "TEXT_JOIN_TITLE_CREATEWITH": "criar texto com", - "TEXT_JOIN_TOOLTIP": "Criar um pedaço de texto juntando qualquer número de itens.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "unir", - "TEXT_CREATE_JOIN_TOOLTIP": "Acrescenta, remove ou reordena seções para reconfigurar este bloco de texto.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Acrescentar um item ao texto.", - "TEXT_APPEND_TO": "para", - "TEXT_APPEND_APPENDTEXT": "acrescentar texto", - "TEXT_APPEND_TOOLTIP": "Acrescentar um pedaço de texto à variável \"%1\".", - "TEXT_LENGTH_TITLE": "tamanho de %1", - "TEXT_LENGTH_TOOLTIP": "Retorna o número de letras (incluindo espaços) no texto fornecido.", - "TEXT_ISEMPTY_TITLE": "%1 é vazio", - "TEXT_ISEMPTY_TOOLTIP": "Retorna verdadeiro se o texto fornecido for vazio.", - "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado.", - "TEXT_INDEXOF_INPUT_INTEXT": "no texto", - "TEXT_INDEXOF_OPERATOR_FIRST": "encontre a primeira ocorrência do item", - "TEXT_INDEXOF_OPERATOR_LAST": "encontre a última ocorrência do texto", - "TEXT_CHARAT_INPUT_INTEXT": "no texto", - "TEXT_CHARAT_FROM_START": "obter letra nº", - "TEXT_CHARAT_FROM_END": "obter letra # a partir do final", - "TEXT_CHARAT_FIRST": "obter primeira letra", - "TEXT_CHARAT_LAST": "obter última letra", - "TEXT_CHARAT_RANDOM": "obter letra aleatória", - "TEXT_CHARAT_TOOLTIP": "Retorna a letra na posição especificada.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Retorna o trecho de texto especificado.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "no texto", - "TEXT_GET_SUBSTRING_START_FROM_START": "obter trecho de letra nº", - "TEXT_GET_SUBSTRING_START_FROM_END": "obter trecho de letra nº a partir do final", - "TEXT_GET_SUBSTRING_START_FIRST": "obter trecho de primeira letra", - "TEXT_GET_SUBSTRING_END_FROM_START": "até letra nº", - "TEXT_GET_SUBSTRING_END_FROM_END": "até letra nº a partir do final", - "TEXT_GET_SUBSTRING_END_LAST": "até última letra", - "TEXT_CHANGECASE_TOOLTIP": "Retorna uma cópia do texto em um formato diferente.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "para MAIÚSCULAS", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "para minúsculas", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "para Nomes Próprios", - "TEXT_TRIM_TOOLTIP": "Retorna uma cópia do texto com os espaços removidos de uma ou ambas extremidades.", - "TEXT_TRIM_OPERATOR_BOTH": "remover espaços de ambos os lados de", - "TEXT_TRIM_OPERATOR_LEFT": "remover espaços à esquerda de", - "TEXT_TRIM_OPERATOR_RIGHT": "remover espaços à direita de", - "TEXT_PRINT_TITLE": "imprime %1", - "TEXT_PRINT_TOOLTIP": "Imprime o texto, número ou valor especificado.", - "TEXT_PROMPT_TYPE_TEXT": "Pede um texto com uma mensagem", - "TEXT_PROMPT_TYPE_NUMBER": "Pede um número com uma mensagem", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Pede ao usuário um número.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Pede ao usuário um texto.", - "LISTS_CREATE_EMPTY_TITLE": "criar lista vazia", - "LISTS_CREATE_EMPTY_TOOLTIP": "Retorna uma lista, de tamanho 0, contendo nenhum registro", - "LISTS_CREATE_WITH_TOOLTIP": "Cria uma lista com a quantidade de itens informada.", - "LISTS_CREATE_WITH_INPUT_WITH": "criar lista com", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Acrescenta, remove ou reordena seções para reconfigurar este bloco de lista.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Acrescenta um item à lista.", - "LISTS_REPEAT_TOOLTIP": "Cria uma lista consistindo no valor informado repetido o número de vezes especificado.", - "LISTS_REPEAT_TITLE": "criar lista com item %1 repetido %2 vezes", - "LISTS_LENGTH_TITLE": "tamanho de %1", - "LISTS_LENGTH_TOOLTIP": "Retorna o tamanho de uma lista.", - "LISTS_ISEMPTY_TITLE": "%1 é vazia", - "LISTS_ISEMPTY_TOOLTIP": "Retona verdadeiro se a lista estiver vazia.", - "LISTS_INLIST": "na lista", - "LISTS_INDEX_OF_FIRST": "encontre a primeira ocorrência do item", - "LISTS_INDEX_OF_LAST": "encontre a última ocorrência do item", - "LISTS_INDEX_OF_TOOLTIP": "Retorna o índice da primeira/última ocorrência do item na lista. Retorna 0 se o item não for encontrado.", - "LISTS_GET_INDEX_GET": "obter", - "LISTS_GET_INDEX_GET_REMOVE": "obter e remover", - "LISTS_GET_INDEX_REMOVE": "remover", - "LISTS_GET_INDEX_FROM_START": "nº", - "LISTS_GET_INDEX_FROM_END": "nº a partir do final", - "LISTS_GET_INDEX_FIRST": "primeiro", - "LISTS_GET_INDEX_LAST": "último", - "LISTS_GET_INDEX_RANDOM": "aleatório", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Retorna o item da lista na posição especificada. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Retorna o item da lista na posição especificada. #1 é o último item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Retorna o primeiro item em uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Retorna o último item em uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Retorna um item aleatório de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Remove e retorna o item na posição especificada em uma lista. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Remove e retorna o item na posição especificada em uma lista. #1 é o último item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Remove e retorna o primeiro item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Remove e retorna o último item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Remove e retorna um item aleatório de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Remove o item na posição especificada em uma lista. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Remove o item na posição especificada em uma lista. #1 é o último item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Remove o primeiro item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Remove o último item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Remove um item aleatório de uma lista.", - "LISTS_SET_INDEX_SET": "definir", - "LISTS_SET_INDEX_INSERT": "inserir em", - "LISTS_SET_INDEX_INPUT_TO": "como", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Define o item da posição especificada de uma lista. #1 é o primeiro item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Define o item da posição especificada de uma lista. #1 é o último item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Define o primeiro item de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Define o último item de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Define um item aleatório de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insere o item na posição especificada em uma lista. #1 é o primeiro item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insere o item na posição especificada em uma lista. #1 é o último item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insere o item no início de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Insere o item no final de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insere o item em uma posição qualquer de uma lista.", - "LISTS_GET_SUBLIST_START_FROM_START": "obtém sublista de nº", - "LISTS_GET_SUBLIST_START_FROM_END": "obtém sublista de nº a partir do final", - "LISTS_GET_SUBLIST_START_FIRST": "obtém sublista a partir do primeiro", - "LISTS_GET_SUBLIST_END_FROM_START": "até nº", - "LISTS_GET_SUBLIST_END_FROM_END": "até nº a partir do final", - "LISTS_GET_SUBLIST_END_LAST": "até último", - "LISTS_GET_SUBLIST_TOOLTIP": "Cria uma cópia da porção especificada de uma lista.", - "LISTS_SPLIT_LIST_FROM_TEXT": "Fazer uma lista a partir do texto", - "LISTS_SPLIT_TEXT_FROM_LIST": "fazer um texto a partir da lista", - "LISTS_SPLIT_WITH_DELIMITER": "com delimitador", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividir o texto em uma lista de textos, separando-o em cada delimitador.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Juntar uma lista de textos em um único texto, separado por um delimitador.", - "VARIABLES_GET_TOOLTIP": "Retorna o valor desta variável.", - "VARIABLES_GET_CREATE_SET": "Criar \"definir %1\"", - "VARIABLES_SET": "definir %1 para %2", - "VARIABLES_SET_TOOLTIP": "Define esta variável para o valor da entrada.", - "VARIABLES_SET_CREATE_GET": "Criar \"obter %1\"", - "PROCEDURES_DEFNORETURN_TITLE": "para", - "PROCEDURES_DEFNORETURN_PROCEDURE": "faça algo", - "PROCEDURES_BEFORE_PARAMS": "com:", - "PROCEDURES_CALL_BEFORE_PARAMS": "com:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Cria uma função que não tem retorno.", - "PROCEDURES_DEFRETURN_RETURN": "retorna", - "PROCEDURES_DEFRETURN_TOOLTIP": "Cria uma função que possui um valor de retorno.", - "PROCEDURES_ALLOW_STATEMENTS": "permitir declarações", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Atenção: Esta função tem parâmetros duplicados.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://pt.wikipedia.org/wiki/Sub-rotina", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Executa a função definida pelo usuário \"%1\".", - "PROCEDURES_CALLRETURN_HELPURL": "https://pt.wikipedia.org/wiki/Sub-rotina", - "PROCEDURES_CALLRETURN_TOOLTIP": "Executa a função definida pelo usuário \"%1\" e usa seu retorno.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "entradas", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Adiciona, remove, ou reordena as entradas para esta função.", - "PROCEDURES_MUTATORARG_TITLE": "nome da entrada:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Adiciona uma entrada para esta função", - "PROCEDURES_HIGHLIGHT_DEF": "Destacar definição da função", - "PROCEDURES_CREATE_DO": "Criar \"%1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Se um valor é verdadeiro, então retorna um valor.", - "PROCEDURES_IFRETURN_WARNING": "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função." -} diff --git a/msg/json/pt.json b/msg/json/pt.json deleted file mode 100644 index 47d47135bd..0000000000 --- a/msg/json/pt.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Imperadeiro98", - "Waldir", - "Vitorvicentevalente", - "아라", - "Nicola Nascimento" - ] - }, - "VARIABLES_DEFAULT_NAME": "item", - "TODAY": "Hoje", - "DUPLICATE_BLOCK": "Duplicar", - "ADD_COMMENT": "Adicionar Comentário", - "REMOVE_COMMENT": "Remover Comentário", - "EXTERNAL_INPUTS": "Entradas externas", - "INLINE_INPUTS": "Entradas Internas", - "DELETE_BLOCK": "Remover Bloco", - "DELETE_X_BLOCKS": "Remover %1 Blocos", - "COLLAPSE_BLOCK": "Colapsar Bloco", - "COLLAPSE_ALL": "Recolher Blocos", - "EXPAND_BLOCK": "Expandir Bloco", - "EXPAND_ALL": "Expandir Blocos", - "DISABLE_BLOCK": "Desabilitar Bloco", - "ENABLE_BLOCK": "Habilitar Bloco", - "HELP": "Ajuda", - "CHAT": "Converse com o seu colaborador, ao digitar nesta caixa!", - "AUTH": "Por favor autorize esta aplicação para permitir que o seu trabalho seja gravado e que o possa partilhar.", - "ME": "Eu", - "CHANGE_VALUE_TITLE": "Alterar valor:", - "NEW_VARIABLE": "Nova variável...", - "NEW_VARIABLE_TITLE": "Nome da nova variável:", - "RENAME_VARIABLE": "Renomear variável...", - "RENAME_VARIABLE_TITLE": "Renomear todas as variáveis '%1' para:", - "COLOUR_PICKER_HELPURL": "http://pt.wikipedia.org/wiki/Cor", - "COLOUR_PICKER_TOOLTIP": "Escolhe uma cor da paleta de cores.", - "COLOUR_RANDOM_TITLE": "cor aleatória", - "COLOUR_RANDOM_TOOLTIP": "Escolher cor de forma aleatória.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "pinte com", - "COLOUR_RGB_RED": "vermelho", - "COLOUR_RGB_GREEN": "verde", - "COLOUR_RGB_BLUE": "azul", - "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.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "misturar", - "COLOUR_BLEND_COLOUR1": "cor 1", - "COLOUR_BLEND_COLOUR2": "cor 2", - "COLOUR_BLEND_RATIO": "proporção", - "COLOUR_BLEND_TOOLTIP": "Mistura duas cores dada uma proporção (0.0 - 1.0).", - "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", - "CONTROLS_REPEAT_TITLE": "repita %1 vez", - "CONTROLS_REPEAT_INPUT_DO": "faça", - "CONTROLS_REPEAT_TOOLTIP": "Faça algumas instruções várias vezes.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repita enquanto", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repita até", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Enquanto um valor for verdadeiro, então faça algumas instruções.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Enquanto um valor for falso, então faça algumas instruções.", - "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.", - "CONTROLS_FOR_TITLE": "contar com %1 de %2 até %3 de %3 em %4", - "CONTROLS_FOREACH_TITLE": "para cada item %1 na lista %2", - "CONTROLS_FOREACH_TOOLTIP": "Para cada item numa lista, define a variável \"%1\" para o item e então faz algumas instruções.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "sair do ciclo", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continuar com a próxima iteração do ciclo", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Sair do ciclo que está contido.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Ignora o resto deste ciclo e continua na próxima iteração.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Atenção: Este bloco só pode ser usado dentro de um ciclo.", - "CONTROLS_IF_TOOLTIP_1": "Se um valor é verdadeiro, então realize alguns passos.", - "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", - "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.", - "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.", - "CONTROLS_IF_MSG_IF": "se", - "CONTROLS_IF_MSG_ELSEIF": "senão se", - "CONTROLS_IF_MSG_ELSE": "senão", - "CONTROLS_IF_IF_TOOLTIP": "Acrescente, remova ou reordene secções para reconfigurar este bloco se.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Acrescente uma condição ao bloco se.", - "CONTROLS_IF_ELSE_TOOLTIP": "Acrescente uma condição de excepação final para o bloco se.", - "LOGIC_COMPARE_HELPURL": "http://pt.wikipedia.org/wiki/Inequa%C3%A7%C3%A3o", - "LOGIC_COMPARE_TOOLTIP_EQ": "Retorna verdadeiro se ambas as entradas forem iguais entre si.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Retorna verdadeiro se ambas as entradas forem diferentes entre si.", - "LOGIC_COMPARE_TOOLTIP_LT": "Retorna verdadeiro se a primeira entrada for menor que a segunda entrada.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Retorna verdadeiro se a primeira entrada for menor ou igual à segunda entrada.", - "LOGIC_COMPARE_TOOLTIP_GT": "Retorna verdadeiro se a primeira entrada for maior que a segunda entrada.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Retorna verdadeiro se a primeira entrada for maior ou igual à segunda entrada.", - "LOGIC_OPERATION_TOOLTIP_AND": "Retorna verdadeiro se ambas as entradas forem verdadeiras.", - "LOGIC_OPERATION_AND": "e", - "LOGIC_OPERATION_TOOLTIP_OR": "Retorna verdadeiro se pelo menos uma das estradas for verdadeira.", - "LOGIC_OPERATION_OR": "ou", - "LOGIC_NEGATE_TITLE": "não %1", - "LOGIC_NEGATE_TOOLTIP": "Retorna verdadeiro se a entrada for falsa. Retorna falso se a entrada for verdadeira.", - "LOGIC_BOOLEAN_TRUE": "verdadeiro", - "LOGIC_BOOLEAN_FALSE": "falso", - "LOGIC_BOOLEAN_TOOLTIP": "Retorna verdadeiro ou falso.", - "LOGIC_NULL_HELPURL": "http://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "nulo", - "LOGIC_NULL_TOOLTIP": "Retorna nulo.", - "LOGIC_TERNARY_HELPURL": "http://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "teste", - "LOGIC_TERNARY_IF_TRUE": "se verdadeiro", - "LOGIC_TERNARY_IF_FALSE": "se falso", - "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\".", - "MATH_NUMBER_HELPURL": "http://pt.wikipedia.org/wiki/N%C3%BAmero", - "MATH_NUMBER_TOOLTIP": "Um número.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "http://pt.wikipedia.org/wiki/Aritm%C3%A9tica", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Retorna a soma de dois números.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Retorna a diferença de dois números.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Retorna o produto de dois números.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Retorna o quociente da divisão de dois números.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Retorna o primeiro número elevado à potência do segundo número.", - "MATH_SINGLE_HELPURL": "http://pt.wikipedia.org/wiki/Raiz_quadrada", - "MATH_SINGLE_OP_ROOT": "raíz quadrada", - "MATH_SINGLE_TOOLTIP_ROOT": "Retorna a raiz quadrada de um número.", - "MATH_SINGLE_OP_ABSOLUTE": "absoluto", - "MATH_SINGLE_TOOLTIP_ABS": "Retorna o valor absoluto de um número.", - "MATH_SINGLE_TOOLTIP_NEG": "Retorna o oposto de um número.", - "MATH_SINGLE_TOOLTIP_LN": "Retorna o logarítmo natural de um número.", - "MATH_SINGLE_TOOLTIP_LOG10": "Retorna o logarítmo em base 10 de um número.", - "MATH_SINGLE_TOOLTIP_EXP": "Retorna o número e elevado à potência de um número.", - "MATH_SINGLE_TOOLTIP_POW10": "Retorna 10 elevado à potência de um número.", - "MATH_TRIG_HELPURL": "http://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_trigonom%C3%A9trica", - "MATH_TRIG_TOOLTIP_SIN": "Retorna o seno de um grau (não radiano).", - "MATH_TRIG_TOOLTIP_COS": "Retorna o cosseno de um grau (não radiano).", - "MATH_TRIG_TOOLTIP_TAN": "Retorna a tangente de um grau (não radiano).", - "MATH_TRIG_TOOLTIP_ASIN": "Retorna o arco seno de um número.", - "MATH_TRIG_TOOLTIP_ACOS": "Retorna o arco cosseno de um número.", - "MATH_TRIG_TOOLTIP_ATAN": "Retorna o arco tangente de um número.", - "MATH_CONSTANT_HELPURL": "http://pt.wikipedia.org/wiki/Anexo:Lista_de_constantes_matem%C3%A1ticas", - "MATH_CONSTANT_TOOLTIP": "Retorna uma das constantes comuns: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infinito).", - "MATH_IS_EVEN": "é par", - "MATH_IS_ODD": "é impar", - "MATH_IS_PRIME": "é primo", - "MATH_IS_WHOLE": "é inteiro", - "MATH_IS_POSITIVE": "é positivo", - "MATH_IS_NEGATIVE": "é negativo", - "MATH_IS_DIVISIBLE_BY": "é divisível por", - "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.", - "MATH_CHANGE_HELPURL": "http://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o", - "MATH_CHANGE_TITLE": "alterar %1 por %2", - "MATH_CHANGE_TOOLTIP": "Soma um número à variável \"%1\".", - "MATH_ROUND_HELPURL": "http://pt.wikipedia.org/wiki/Arredondamento", - "MATH_ROUND_TOOLTIP": "Arredonda um número para cima ou para baixo.", - "MATH_ROUND_OPERATOR_ROUND": "arredonda", - "MATH_ROUND_OPERATOR_ROUNDUP": "arredonda para cima", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "arredonda para baixo", - "MATH_ONLIST_OPERATOR_SUM": "soma da lista", - "MATH_ONLIST_TOOLTIP_SUM": "Retorna a soma de todos os números da lista.", - "MATH_ONLIST_OPERATOR_MIN": "menor de uma lista", - "MATH_ONLIST_TOOLTIP_MIN": "Retorna o menor número da lista.", - "MATH_ONLIST_OPERATOR_MAX": "maior de uma lista", - "MATH_ONLIST_TOOLTIP_MAX": "Retorna o maior número da lista.", - "MATH_ONLIST_OPERATOR_AVERAGE": "média de uma lista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Retorna a média aritmética dos valores números da lista.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana de uma lista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Retorna a mediana da lista.", - "MATH_ONLIST_OPERATOR_MODE": "moda de uma lista", - "MATH_ONLIST_TOOLTIP_MODE": "Retorna a lista de item(ns) mais comum(ns) da lista.", - "MATH_ONLIST_OPERATOR_STD_DEV": "desvio padrão de uma lista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Retorna o desvio padrão dos números da lista.", - "MATH_ONLIST_OPERATOR_RANDOM": "item aleatório de uma lista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Retorna um elemento aleatório da lista.", - "MATH_MODULO_HELPURL": "http://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_m%C3%B3dulo", - "MATH_MODULO_TITLE": "resto da divisão de %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Retorna o resto da divisão de dois números.", - "MATH_CONSTRAIN_TITLE": "restringe %1 inferior %2 superior %3", - "MATH_CONSTRAIN_TOOLTIP": "Restringe um número entre os limites especificados (inclusive).", - "MATH_RANDOM_INT_HELPURL": "http://pt.wikipedia.org/wiki/N%C3%BAmero_aleat%C3%B3rio", - "MATH_RANDOM_INT_TITLE": "inteiro aleatório entre %1 e %2", - "MATH_RANDOM_INT_TOOLTIP": "Retorna um número inteiro entre os dois limites especificados, inclusive.", - "MATH_RANDOM_FLOAT_HELPURL": "http://pt.wikipedia.org/wiki/N%C3%BAmero_aleat%C3%B3rio", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fração aleatória", - "MATH_RANDOM_FLOAT_TOOLTIP": "Insere uma fração aleatória entre 0.0 (inclusive) e 1.0 (exclusive).", - "TEXT_TEXT_HELPURL": "http://pt.wikipedia.org/wiki/Cadeia_de_caracteres", - "TEXT_TEXT_TOOLTIP": "Uma letra, palavra ou linha de texto.", - "TEXT_JOIN_TITLE_CREATEWITH": "criar texto com", - "TEXT_JOIN_TOOLTIP": "Criar um pedaço de texto juntando qualquer número de itens.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "unir", - "TEXT_CREATE_JOIN_TOOLTIP": "Acrescenta, remove ou reordena seções para reconfigurar este bloco de texto.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Acrescentar um item ao texto.", - "TEXT_APPEND_TO": "para", - "TEXT_APPEND_APPENDTEXT": "acrescentar texto", - "TEXT_APPEND_TOOLTIP": "Acrescentar um pedaço de texto à variável \"%1\".", - "TEXT_LENGTH_TITLE": "tamanho de %1", - "TEXT_LENGTH_TOOLTIP": "Devolve o número de letras (incluindo espaços) do texto fornecido.", - "TEXT_ISEMPTY_TITLE": "%1 está vazio", - "TEXT_ISEMPTY_TOOLTIP": "Retorna verdadeiro se o texto fornecido estiver vazio.", - "TEXT_INDEXOF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna 0 se o texto não for encontrado.", - "TEXT_INDEXOF_INPUT_INTEXT": "no texto", - "TEXT_INDEXOF_OPERATOR_FIRST": "primeira ocorrência do texto", - "TEXT_INDEXOF_OPERATOR_LAST": "última ocorrência do texto", - "TEXT_CHARAT_INPUT_INTEXT": "no texto", - "TEXT_CHARAT_FROM_START": "obter letra nº", - "TEXT_CHARAT_FROM_END": "obter letra nº a partir do final", - "TEXT_CHARAT_FIRST": "obter primeira letra", - "TEXT_CHARAT_LAST": "obter última letra", - "TEXT_CHARAT_RANDOM": "obter letra aleatória", - "TEXT_CHARAT_TOOLTIP": "Retorna a letra na posição especificada.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Retorna a parte especificada do texto.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "no texto", - "TEXT_GET_SUBSTRING_START_FROM_START": "obter subsequência de tamanho #", - "TEXT_GET_SUBSTRING_START_FROM_END": "obter subsequência de tamanho # a partir do final", - "TEXT_GET_SUBSTRING_START_FIRST": "obter subsequência a partir da primeira letra", - "TEXT_GET_SUBSTRING_END_FROM_START": "até letra nº", - "TEXT_GET_SUBSTRING_END_FROM_END": "até letra nº a partir do final", - "TEXT_GET_SUBSTRING_END_LAST": "até última letra", - "TEXT_CHANGECASE_TOOLTIP": "Retorna uma cópia do texto em formato diferente.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "para MAIÚSCULAS", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "para minúsculas", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "para Iniciais Maiúsculas", - "TEXT_TRIM_TOOLTIP": "Retorna uma cópia do texto com os espaços removidos de uma ou ambas as extremidades.", - "TEXT_TRIM_OPERATOR_BOTH": "remover espaços de ambos os lados", - "TEXT_TRIM_OPERATOR_LEFT": "remover espaços à esquerda de", - "TEXT_TRIM_OPERATOR_RIGHT": "remover espaços à direita", - "TEXT_PRINT_TITLE": "imprime %1", - "TEXT_PRINT_TOOLTIP": "Imprime o texto, número ou outro valor especificado.", - "TEXT_PROMPT_TYPE_TEXT": "Pede um texto com a mensagem", - "TEXT_PROMPT_TYPE_NUMBER": "pede um número com a mensagem", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Pede ao utilizador um número.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Pede ao utilizador um texto.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "criar lista vazia", - "LISTS_CREATE_EMPTY_TOOLTIP": "Retorna uma lista, de tamanho 0, contendo nenhum registo", - "LISTS_CREATE_WITH_TOOLTIP": "Cria uma lista com qualquer número de itens.", - "LISTS_CREATE_WITH_INPUT_WITH": "criar lista com", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Acrescente, remova ou reordene as seções para reconfigurar este bloco lista.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Acrescenta um item à lista.", - "LISTS_REPEAT_TOOLTIP": "Cria uma lista constituída por um dado valor repetido o número de vezes especificado.", - "LISTS_REPEAT_TITLE": "criar lista com o item %1 repetido %2 vezes", - "LISTS_LENGTH_TITLE": "tamanho de %1", - "LISTS_LENGTH_TOOLTIP": "Retorna o tamanho de uma lista.", - "LISTS_ISEMPTY_TITLE": "%1 está vazia", - "LISTS_ISEMPTY_TOOLTIP": "Retona verdadeiro se a lista estiver vazia.", - "LISTS_INLIST": "na lista", - "LISTS_INDEX_OF_FIRST": "encontre a primeira ocorrência do item", - "LISTS_INDEX_OF_LAST": "encontre a última ocorrência do item", - "LISTS_INDEX_OF_TOOLTIP": "Retorna a posição da primeira/última ocorrência do item na lista. Retorna 0 se o texto não for encontrado.", - "LISTS_GET_INDEX_GET": "obter", - "LISTS_GET_INDEX_GET_REMOVE": "obter e remover", - "LISTS_GET_INDEX_REMOVE": "remover", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# a partir do final", - "LISTS_GET_INDEX_FIRST": "primeiro", - "LISTS_GET_INDEX_LAST": "último", - "LISTS_GET_INDEX_RANDOM": "aleatório", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Retorna o item na posição especificada da lista . #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Retorna o item da lista na posição especificada. #1 é o último item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Retorna o primeiro item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Retorna o último item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Retorna um item aleatório de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Remove e retorna o item na posição especificada de uma lista. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Remove e retorna o item na posição especificada de uma lista. #1 é o último item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Remove e retorna o primeiro item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Remove e retorna o último item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Remove e retorna um item aleatório de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Remove o item de uma posição especifica da lista. #1 é o primeiro item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Remove o item na posição especificada de uma lista. #1 é o ultimo item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Remove o primeiro item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Remove o último item de uma lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Remove um item aleatório de uma lista.", - "LISTS_SET_INDEX_SET": "definir", - "LISTS_SET_INDEX_INSERT": "inserir em", - "LISTS_SET_INDEX_INPUT_TO": "como", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Define o item na posição especificada de uma lista. #1 é o primeiro item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Define o item na posição especificada de uma lista. #1 é o último item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Define o primeiro item de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Define o último item de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Define um item aleatório de uma lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insere o item numa posição especificada numa lista. #1 é o primeiro item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insere o item numa posição especificada de uma lista. #1 é o último item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insere o item no início da lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Insere o item no final da lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insere o item numa posição aleatória de uma lista.", - "LISTS_GET_SUBLIST_START_FROM_START": "obtem sublista de #", - "LISTS_GET_SUBLIST_START_FROM_END": "obtem sublista de # a partir do final", - "LISTS_GET_SUBLIST_START_FIRST": "obtem sublista da primeira lista", - "LISTS_GET_SUBLIST_END_FROM_START": "até #", - "LISTS_GET_SUBLIST_END_FROM_END": "até #, a partir do final", - "LISTS_GET_SUBLIST_END_LAST": "para o último", - "LISTS_GET_SUBLIST_TOOLTIP": "Cria uma cópia da porção especificada de uma lista.", - "LISTS_SPLIT_LIST_FROM_TEXT": "fazer lista a partir de texto", - "LISTS_SPLIT_TEXT_FROM_LIST": "fazer texto a partir da lista", - "LISTS_SPLIT_WITH_DELIMITER": "com delimitador", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividir o texto numa lista de textos, separando-o em cada delimitador.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Juntar uma lista de textos num único texto, separado por um delimitador.", - "VARIABLES_GET_TOOLTIP": "Retorna o valor desta variável.", - "VARIABLES_GET_CREATE_SET": "Criar \"definir %1\"", - "VARIABLES_SET": "definir %1 para %2", - "VARIABLES_SET_TOOLTIP": "Define esta variável para o valor inserido.", - "VARIABLES_SET_CREATE_GET": "Criar \"obter %1\"", - "PROCEDURES_DEFNORETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "para", - "PROCEDURES_DEFNORETURN_PROCEDURE": "faz algo", - "PROCEDURES_BEFORE_PARAMS": "com:", - "PROCEDURES_CALL_BEFORE_PARAMS": "com:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Cria uma função que não tem retorno.", - "PROCEDURES_DEFRETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "retorna", - "PROCEDURES_DEFRETURN_TOOLTIP": "Cria uma função que possui um valor de retorno.", - "PROCEDURES_ALLOW_STATEMENTS": "permitir declarações", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Atenção: Esta função tem parâmetros duplicados.", - "PROCEDURES_CALLNORETURN_HELPURL": "http://pt.wikipedia.org/wiki/Sub-rotina", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Executa a função \"%1\".", - "PROCEDURES_CALLRETURN_HELPURL": "http://pt.wikipedia.org/wiki/Sub-rotina", - "PROCEDURES_CALLRETURN_TOOLTIP": "Executa a função \"%1\" e usa o seu retorno.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "entradas", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Adicionar, remover ou reordenar as entradas para esta função.", - "PROCEDURES_MUTATORARG_TITLE": "nome da entrada:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Adicionar uma entrada para a função.", - "PROCEDURES_HIGHLIGHT_DEF": "Destacar definição da função", - "PROCEDURES_CREATE_DO": "Criar \"%1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "se o valor é verdadeiro, então retorna um segundo valor.", - "PROCEDURES_IFRETURN_WARNING": "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função." -} diff --git a/msg/json/qqq.json b/msg/json/qqq.json index 703a06a06a..37b487e90f 100644 --- a/msg/json/qqq.json +++ b/msg/json/qqq.json @@ -1,13 +1,6 @@ { - "@metadata": { - "authors": [ - "Espertus", - "Liuxinyu970226", - "Shirayuki" - ] - }, "VARIABLES_DEFAULT_NAME": "default name - A simple, general default name for a variable, preferably short. For more context, see [[Translating:Blockly#infrequent_message_types]].\n{{Identical|Item}}", - "TODAY": "button text - Botton that sets a calendar to today's date.\n{{Identical|Today}}", + "TODAY": "button text - Button that sets a calendar to today's date.\n{{Identical|Today}}", "DUPLICATE_BLOCK": "context menu - Make a copy of the selected block (and any blocks it contains).\n{{Identical|Duplicate}}", "ADD_COMMENT": "context menu - Add a descriptive comment to the selected block.", "REMOVE_COMMENT": "context menu - Remove the descriptive comment from the selected block.", @@ -24,6 +17,8 @@ "DISABLE_BLOCK": "context menu - Make the selected block have no effect (unless reenabled).", "ENABLE_BLOCK": "context menu - Make the selected block have effect (after having been disabled earlier).", "HELP": "context menu - Provide helpful information about the selected block.\n{{Identical|Help}}", + "UNDO": "context menu - Undo the previous action.\n{{Identical|Undo}}", + "REDO": "context menu - Undo the previous undo action.\n{{Identical|Redo}}", "CHAT": "collaboration instruction - Tell the user that they can talk with other users.", "AUTH": "authorization instruction - Ask the user to authorize this app so it can be saved and shared by them.", "ME": "First person singular - objective case", @@ -90,15 +85,15 @@ "LOGIC_COMPARE_TOOLTIP_GTE": "tooltip - Describes the greater than or equals (≥) block.", "LOGIC_OPERATION_HELPURL": "url - Information about the Boolean conjunction ('and') and disjunction ('or') operators. Consider using the translation of [https://en.wikipedia.org/wiki/Boolean_logic https://en.wikipedia.org/wiki/Boolean_logic], if it exists in your language.", "LOGIC_OPERATION_TOOLTIP_AND": "tooltip - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction].", - "LOGIC_OPERATION_AND": "block text - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction].", + "LOGIC_OPERATION_AND": "block text - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction].\n{{Identical|And}}", "LOGIC_OPERATION_TOOLTIP_OR": "block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction].", - "LOGIC_OPERATION_OR": "block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction].", + "LOGIC_OPERATION_OR": "block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction].\n{{Identical|Or}}", "LOGIC_NEGATE_HELPURL": "url - Information about logical negation. The translation of [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation] is recommended if it exists in the target language.", "LOGIC_NEGATE_TITLE": "block text - This is a unary operator that returns ''false'' when the input is ''true'', and ''true'' when the input is ''false''. \n\nParameters:\n* %1 - the input (which should be either the value 'true' or 'false')", "LOGIC_NEGATE_TOOLTIP": "tooltip - See [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation].", "LOGIC_BOOLEAN_HELPURL": "url - Information about the logic values ''true'' and ''false''. Consider using the translation of [https://en.wikipedia.org/wiki/Truth_value https://en.wikipedia.org/wiki/Truth_value] if it exists in your language.", - "LOGIC_BOOLEAN_TRUE": "block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''true''.", - "LOGIC_BOOLEAN_FALSE": "block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''false''.", + "LOGIC_BOOLEAN_TRUE": "block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''true''.\n{{Identical|True}}", + "LOGIC_BOOLEAN_FALSE": "block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''false''.\n{{Identical|False}}", "LOGIC_BOOLEAN_TOOLTIP": "tooltip - Indicates that the block returns either of the two possible [https://en.wikipedia.org/wiki/Truth_value logical values].", "LOGIC_NULL_HELPURL": "url - Provide a link to the translation of [https://en.wikipedia.org/wiki/Nullable_type https://en.wikipedia.org/wiki/Nullable_type], if it exists in your language; otherwise, do not worry about translating this advanced concept.", "LOGIC_NULL": "block text - In computer languages, ''null'' is a special value that indicates that no value has been set. You may use your language's word for 'nothing' or 'invalid'.", @@ -322,6 +317,14 @@ "LISTS_GET_SUBLIST_END_LAST": "dropdown - Indicates that the '''last''' item in the given list should be [https://github.com/google/blockly/wiki/Lists#getting-a-sublist the end of the selected sublist]. [[File:Blockly-get-sublist.png]]", "LISTS_GET_SUBLIST_TAIL": "block text - This appears in the rightmost position ('tail') of the sublist block, as described at [https://github.com/google/blockly/wiki/Lists#getting-a-sublist https://github.com/google/blockly/wiki/Lists#getting-a-sublist]. In English and most other languages, this is the empty string. [[File:Blockly-get-sublist.png]]", "LISTS_GET_SUBLIST_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-sublist https://github.com/google/blockly/wiki/Lists#getting-a-sublist] for more information. [[File:Blockly-get-sublist.png]]", + "LISTS_SORT_HELPURL": "url - Information describing sorting a list.", + "LISTS_SORT_TITLE": "Sort as type %1 (numeric or alphabetic) in order %2 (ascending or descending) a list of items %3.", + "LISTS_SORT_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#sorting-a-list].", + "LISTS_SORT_ORDER_ASCENDING": "sorting order or direction from low to high value for numeric, or A-Z for alphabetic.", + "LISTS_SORT_ORDER_DESCENDING": "sorting order or direction from high to low value for numeric, or Z-A for alphabetic.", + "LISTS_SORT_TYPE_NUMERIC": "sort by treating each item as a number.", + "LISTS_SORT_TYPE_TEXT": "sort by treating each item alphabetically, case-sensitive.", + "LISTS_SORT_TYPE_IGNORECASE": "sort by treating each item alphabetically, ignoring differences in case.", "LISTS_SPLIT_HELPURL": "url - Information describing splitting text into a list, or joining a list into text.", "LISTS_SPLIT_LIST_FROM_TEXT": "dropdown - Indicates that text will be split up into a list (e.g. 'a-b-c' -> ['a', 'b', 'c']).", "LISTS_SPLIT_TEXT_FROM_LIST": "dropdown - Indicates that a list will be joined together to form text (e.g. ['a', 'b', 'c'] -> 'a-b-c').", diff --git a/msg/json/ro.json b/msg/json/ro.json deleted file mode 100644 index b3ad25bdb9..0000000000 --- a/msg/json/ro.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Minisarm", - "Ely en", - "Hugbear", - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "element", - "TODAY": "Astăzi", - "DUPLICATE_BLOCK": "Duplicati", - "ADD_COMMENT": "Adaugă un comentariu", - "REMOVE_COMMENT": "Elimină comentariu", - "EXTERNAL_INPUTS": "Intrări externe", - "INLINE_INPUTS": "Intrări în linie", - "DELETE_BLOCK": "Șterge Bloc", - "DELETE_X_BLOCKS": "Ștergeți %1 Blocuri", - "DELETE_ALL_BLOCKS": "Ștergi toate cele %1 (de) blocuri?", - "COLLAPSE_BLOCK": "Restrange blocul", - "COLLAPSE_ALL": "Restrange blocurile", - "EXPAND_BLOCK": "Extinde bloc", - "EXPAND_ALL": "Extinde blocuri", - "DISABLE_BLOCK": "Dezactivaţi bloc", - "ENABLE_BLOCK": "Permite bloc", - "HELP": "Ajutor", - "CHAT": "Discută cu colaboratorul tău tastând în cadrul acestei zone!", - "AUTH": "Va rugăm să autorizați această aplicație să permită salvarea activității dumneavoastră și să permită distribuirea acesteia de către dumneavoastră.", - "ME": "Eu", - "CHANGE_VALUE_TITLE": "Schimbaţi valoarea:", - "NEW_VARIABLE": "Variabilă nouă...", - "NEW_VARIABLE_TITLE": "Noul nume de variabilă:", - "RENAME_VARIABLE": "Redenumirea variabilei...", - "RENAME_VARIABLE_TITLE": "Redenumeşte toate variabilele '%1' în:", - "COLOUR_PICKER_HELPURL": "https://ro.wikipedia.org/wiki/Culoare", - "COLOUR_PICKER_TOOLTIP": "Alege o culoare din paleta de culori.", - "COLOUR_RANDOM_TITLE": "culoare aleatorie", - "COLOUR_RANDOM_TOOLTIP": "Alege o culoare la întâmplare.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "colorează cu", - "COLOUR_RGB_RED": "roşu", - "COLOUR_RGB_GREEN": "verde", - "COLOUR_RGB_BLUE": "albastru", - "COLOUR_RGB_TOOLTIP": "Creează o culoare cu suma specificată de roşu, verde şi albastru. Toate valorile trebuie să fie între 0 şi 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "amestec", - "COLOUR_BLEND_COLOUR1": "culoare 1", - "COLOUR_BLEND_COLOUR2": "culoare 2", - "COLOUR_BLEND_RATIO": "Raport", - "COLOUR_BLEND_TOOLTIP": "Amestecă două culori cu un raport dat (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "repetă de %1 ori", - "CONTROLS_REPEAT_INPUT_DO": "fă", - "CONTROLS_REPEAT_TOOLTIP": "Face unele afirmaţii de mai multe ori.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repetă în timp ce", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "Repetaţi până când", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "În timp ce o valoare este adevărat, atunci face unele declaraţii.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "În timp ce o valoare este adevărat, atunci face unele declaraţii.", - "CONTROLS_FOR_TOOLTIP": "Cu variablia \"%1\" ia o valoare din numărul început la numărul final, numara in intervalul specificat, apoi face blocurile specificate.", - "CONTROLS_FOR_TITLE": "numără cu %1 de la %2 la %3 prin %4", - "CONTROLS_FOREACH_TITLE": "pentru fiecare element %1 în listă %2", - "CONTROLS_FOREACH_TOOLTIP": "Pentru fiecare element din listă, setaţi variabila '%1' ca valoarea elementului, şi apoi faceţi unele declaraţii.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ieşi din bucla", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continuă cu următoarea iterație a buclei", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Ieși din bucla care conţine.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sari peste restul aceastei bucle, şi continuă cu urmatoarea iteratie.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Avertisment: Acest bloc pote fi utilizat numai în interiorul unei bucle.", - "CONTROLS_IF_TOOLTIP_1": "Dacă o valoare este adevărată, atunci fa unele declaraţii.", - "CONTROLS_IF_TOOLTIP_2": "Dacă o valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, face al doilea bloc de declaraţii.", - "CONTROLS_IF_TOOLTIP_3": "Dacă prima valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declaraţii.", - "CONTROLS_IF_TOOLTIP_4": "Dacă prima valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declaraţii. În cazul în care niciuna din valorilor nu este adevărat, face ultimul bloc de declaraţii.", - "CONTROLS_IF_MSG_IF": "dacă", - "CONTROLS_IF_MSG_ELSEIF": "altfel dacă", - "CONTROLS_IF_MSG_ELSE": "altfel", - "CONTROLS_IF_IF_TOOLTIP": "Adaugă, elimină sau reordonează secţiuni pentru a reconfigura acest bloc if.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Adăugaţi o condiţie in blocul if.", - "CONTROLS_IF_ELSE_TOOLTIP": "Adauga o stare finala, cuprinde toata conditia din blocul if.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Returnează adevărat dacă ambele intrări sunt egale.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Returnează adevărat daca cele două intrări nu sunt egale.", - "LOGIC_COMPARE_TOOLTIP_LT": "Returnează adevărat dacă prima intrare este mai mică decât a doua intrare.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Returnează adevărat dacă prima intrare este mai mică sau egală cu a doua intrare.", - "LOGIC_COMPARE_TOOLTIP_GT": "Returnează adevărat dacă prima intrare este mai mare decât a doua intrare.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Returnează adevărat dacă prima intrare este mai mare sau egală cu a doua intrare.", - "LOGIC_OPERATION_TOOLTIP_AND": "Returnează adevărat daca ambele intrări sunt adevărate.", - "LOGIC_OPERATION_AND": "şi", - "LOGIC_OPERATION_TOOLTIP_OR": "Returnează adevărat dacă cel puţin una din intrări este adevărată.", - "LOGIC_OPERATION_OR": "sau", - "LOGIC_NEGATE_TITLE": "non %1", - "LOGIC_NEGATE_TOOLTIP": "Returnează adevărat dacă intrarea este falsă. Returnează fals dacă intrarea este adevărată.", - "LOGIC_BOOLEAN_TRUE": "adevărat", - "LOGIC_BOOLEAN_FALSE": "fals", - "LOGIC_BOOLEAN_TOOLTIP": "Returnează adevărat sau fals.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "nul", - "LOGIC_NULL_TOOLTIP": "returnează nul.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "dacă este adevărat", - "LOGIC_TERNARY_IF_FALSE": "dacă este fals", - "LOGIC_TERNARY_TOOLTIP": "Verifică condiţia din \"test\". Dacă condiţia este adevărată, returnează valoarea \"în cazul în care adevărat\"; în caz contrar întoarce valoarea \"în cazul în care e fals\".", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Un număr.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tg", - "MATH_TRIG_ASIN": "arcsin", - "MATH_TRIG_ACOS": "arccos", - "MATH_TRIG_ATAN": "arctg", - "MATH_ARITHMETIC_HELPURL": "https://ro.wikipedia.org/wiki/Aritmetic%C4%83", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Returnează suma a două numere.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Returneaza diferenţa dintre cele două numere.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Returnează produsul celor două numere.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Returnează câtul celor două numere.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Returneaza numărul rezultat prin ridicarea primului număr la puterea celui de-al doilea.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "rădăcina pătrată", - "MATH_SINGLE_TOOLTIP_ROOT": "Returnează rădăcina pătrată a unui număr.", - "MATH_SINGLE_OP_ABSOLUTE": "absolută", - "MATH_SINGLE_TOOLTIP_ABS": "Returnează valoarea absolută a unui număr.", - "MATH_SINGLE_TOOLTIP_NEG": "Returnează negaţia unui număr.", - "MATH_SINGLE_TOOLTIP_LN": "Întoarce logaritmul natural al unui număr.", - "MATH_SINGLE_TOOLTIP_LOG10": "Returnează logaritmul în baza 10 a unui număr.", - "MATH_SINGLE_TOOLTIP_EXP": "Returnează e la puterea unui număr.", - "MATH_SINGLE_TOOLTIP_POW10": "Returnează 10 la puterea unui număr.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Întoarce cosinusul unui grad (nu radianul).", - "MATH_TRIG_TOOLTIP_COS": "Întoarce cosinusul unui grad (nu radianul).", - "MATH_TRIG_TOOLTIP_TAN": "Întoarce tangenta unui grad (nu radianul).", - "MATH_TRIG_TOOLTIP_ASIN": "Returnează arcsinusul unui număr.", - "MATH_TRIG_TOOLTIP_ACOS": "Returnează arccosinusul unui număr.", - "MATH_TRIG_TOOLTIP_ATAN": "Returnează arctangenta unui număr.", - "MATH_CONSTANT_HELPURL": "https://ro.wikipedia.org/wiki/Constant%C4%83_matematic%C4%83", - "MATH_CONSTANT_TOOLTIP": "Întoarcă una din constantele comune: π (3.141...), e (2.718...), φ (1,618...), sqrt(2) (1.414...), sqrt(½) (0.707...) sau ∞ (infinitate).", - "MATH_IS_EVEN": "este par", - "MATH_IS_ODD": "este impar", - "MATH_IS_PRIME": "este prim", - "MATH_IS_WHOLE": "este întreg", - "MATH_IS_POSITIVE": "este pozitiv", - "MATH_IS_NEGATIVE": "este negativ", - "MATH_IS_DIVISIBLE_BY": "este divizibil cu", - "MATH_IS_TOOLTIP": "Verifică dacă un număr este un par, impar, prim, întreg, pozitiv, negativ, sau dacă este divizibil cu un anumit număr. Returnează true sau false.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "schimbă %1 de %2", - "MATH_CHANGE_TOOLTIP": "Adaugă un număr variabilei '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Rotunjirea unui număr în sus sau în jos.", - "MATH_ROUND_OPERATOR_ROUND": "rotund", - "MATH_ROUND_OPERATOR_ROUNDUP": "rotunjește în sus", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "rotunjit", - "MATH_ONLIST_OPERATOR_SUM": "suma listei", - "MATH_ONLIST_TOOLTIP_SUM": "Returnează suma tuturor numerelor din lista.", - "MATH_ONLIST_OPERATOR_MIN": "minimul listei", - "MATH_ONLIST_TOOLTIP_MIN": "Returnează cel mai mic număr din listă.", - "MATH_ONLIST_OPERATOR_MAX": "maximul listei", - "MATH_ONLIST_TOOLTIP_MAX": "Întoarce cel mai mare număr din listă.", - "MATH_ONLIST_OPERATOR_AVERAGE": "media listei", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Întoarce media (aritmetică) a valorilor numerice în listă.", - "MATH_ONLIST_OPERATOR_MEDIAN": "media listei", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Întoarce numărul median în listă.", - "MATH_ONLIST_OPERATOR_MODE": "moduri de listă", - "MATH_ONLIST_TOOLTIP_MODE": "Returnează o listă cu cel(e) mai frecvent(e) element(e) din listă.", - "MATH_ONLIST_OPERATOR_STD_DEV": "deviația standard a listei", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Întoarce deviația standard a listei.", - "MATH_ONLIST_OPERATOR_RANDOM": "element aleatoriu din lista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Returnează un element aleatoriu din listă.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "restul la %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Întoarce restul din împărţirea celor două numere.", - "MATH_CONSTRAIN_TITLE": "constrânge %1 redus %2 ridicat %3", - "MATH_CONSTRAIN_TOOLTIP": "Constrânge un număr să fie între limitele specificate (inclusiv).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "un număr întreg aleator de la %1 la %2", - "MATH_RANDOM_INT_TOOLTIP": "Returnează un număr întreg aleator aflat între cele două limite specificate, inclusiv.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fracții aleatorii", - "MATH_RANDOM_FLOAT_TOOLTIP": "Returnează o fracţie aleatoare între 0.0 (inclusiv) si 1.0 (exclusiv).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "O literă, cuvânt sau linie de text.", - "TEXT_JOIN_TITLE_CREATEWITH": "crează text cu", - "TEXT_JOIN_TOOLTIP": "Creaţi o bucată de text prin unirea oricărui număr de elemente.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "alăturaţi-vă", - "TEXT_CREATE_JOIN_TOOLTIP": "Adaugă, elimină sau reordonează secțiuni ca să reconfigureze blocul text.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Adaugă un element în text.", - "TEXT_APPEND_TO": "la", - "TEXT_APPEND_APPENDTEXT": "Adăugaţi text", - "TEXT_APPEND_TOOLTIP": "Adăugaţi text la variabila '%1'.", - "TEXT_LENGTH_TITLE": "lungime de %1", - "TEXT_LENGTH_TOOLTIP": "Returnează numărul de litere (inclusiv spaţiile) în textul furnizat.", - "TEXT_ISEMPTY_TITLE": "%1 este gol", - "TEXT_ISEMPTY_TOOLTIP": "Returnează adevărat dacă textul furnizat este gol.", - "TEXT_INDEXOF_TOOLTIP": "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează 0 dacă textul nu este găsit.", - "TEXT_INDEXOF_INPUT_INTEXT": "în text", - "TEXT_INDEXOF_OPERATOR_FIRST": "găseşte prima apariţie a textului", - "TEXT_INDEXOF_OPERATOR_LAST": "găseşte ultima apariţie a textului", - "TEXT_CHARAT_INPUT_INTEXT": "în text", - "TEXT_CHARAT_FROM_START": "obtine litera #", - "TEXT_CHARAT_FROM_END": "obţine litera # de la sfârșit", - "TEXT_CHARAT_FIRST": "obţine prima litera", - "TEXT_CHARAT_LAST": "obţine o litera oarecare", - "TEXT_CHARAT_RANDOM": "obtine o litera oarecare", - "TEXT_CHARAT_TOOLTIP": "Returnează litera la poziția specificată.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Returnează o anumită parte din text.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "în text", - "TEXT_GET_SUBSTRING_START_FROM_START": "obține subșir de la litera #", - "TEXT_GET_SUBSTRING_START_FROM_END": "obține un subșir de la litera # de la sfârșit", - "TEXT_GET_SUBSTRING_START_FIRST": "obţine un subșir de la prima literă", - "TEXT_GET_SUBSTRING_END_FROM_START": "la litera #", - "TEXT_GET_SUBSTRING_END_FROM_END": "la litera # de la sfarsit", - "TEXT_GET_SUBSTRING_END_LAST": "la ultima literă", - "TEXT_CHANGECASE_TOOLTIP": "Întoarce o copie a textului într-un caz diferit.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "la MAJUSCULE", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "la litere mici", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "către Titlul de caz", - "TEXT_TRIM_TOOLTIP": "Returnează o copie a textului fără spațiile de la unul sau ambele capete.", - "TEXT_TRIM_OPERATOR_BOTH": "taie spațiile de pe ambele părți ale", - "TEXT_TRIM_OPERATOR_LEFT": "tăiaţi spațiile din partea stângă a", - "TEXT_TRIM_OPERATOR_RIGHT": "taie spațiile din partea dreaptă a", - "TEXT_PRINT_TITLE": "imprimare %1", - "TEXT_PRINT_TOOLTIP": "Afișează textul specificat, numărul sau altă valoare.", - "TEXT_PROMPT_TYPE_TEXT": "solicită pentru text cu mesaj", - "TEXT_PROMPT_TYPE_NUMBER": "solicită pentru număr cu mesaj", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Solicită utilizatorul pentru un număr.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Solicită utilizatorul pentru text.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "creează listă goală", - "LISTS_CREATE_EMPTY_TOOLTIP": "Returnează o listă, de lungime 0, care nu conţine înregistrări de date", - "LISTS_CREATE_WITH_TOOLTIP": "Creaţi o listă cu orice număr de elemente.", - "LISTS_CREATE_WITH_INPUT_WITH": "creează listă cu", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "listă", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Adaugă, elimină sau reordonează secţiuni ca să reconfiguraţi aceste blocuri de listă.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Adăugaţi un element la listă.", - "LISTS_REPEAT_TOOLTIP": "Creează o listă alcătuită dintr-o anumită valoare repetată de numărul specificat de ori.", - "LISTS_REPEAT_TITLE": "creaza lista cu %1 elemente repetate de %2 ori", - "LISTS_LENGTH_TITLE": "lungime de %1", - "LISTS_LENGTH_TOOLTIP": "Returnează lungimea unei liste.", - "LISTS_ISEMPTY_TITLE": "%1 este gol", - "LISTS_ISEMPTY_TOOLTIP": "Returnează adevărat dacă lista este goală.", - "LISTS_INLIST": "în listă", - "LISTS_INDEX_OF_FIRST": "Găseşte prima apariţie a elementului", - "LISTS_INDEX_OF_LAST": "găseşte ultima apariţie a elementului", - "LISTS_INDEX_OF_TOOLTIP": "Revine la indexul de la prima/ultima apariție a elementului din listă. Returnează 0 dacă elementul nu este găsit.", - "LISTS_GET_INDEX_GET": "obţine", - "LISTS_GET_INDEX_GET_REMOVE": "obţine şi elimină", - "LISTS_GET_INDEX_REMOVE": "elimină", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# de la sfârșit", - "LISTS_GET_INDEX_FIRST": "primul", - "LISTS_GET_INDEX_LAST": "ultimul", - "LISTS_GET_INDEX_RANDOM": "aleator", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Returneaza elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Returneaza elementul la poziţia specificată într-o listă. #1 este ultimul element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returnează primul element dintr-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returnează ultimul element într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returneaza un element aleatoriu într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Elimină şi returneaza elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Elimină şi returneaza elementul la poziţia specificată într-o listă. #1 este ultimul element.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Elimină şi returnează primul element într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Elimină şi returnează ultimul element într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Elimină şi returnează un element aleatoriu într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Elimină elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Elimină elementul la poziţia specificată într-o listă. #1 este ultimul element.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Elimină primul element într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Elimină ultimul element într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Elimină un element aleatoriu într-o listă.", - "LISTS_SET_INDEX_SET": "seteaza", - "LISTS_SET_INDEX_INSERT": "introduceţi la", - "LISTS_SET_INDEX_INPUT_TO": "ca", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Setează elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Setează elementul la poziţia specificată într-o listă. #1 este ultimul element.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setează primul element într-o listă.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setează ultimul element într-o listă.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setează un element aleator într-o listă.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Inserează elementul la poziţia specificată într-o listă. #1 este primul element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Inserează elementul la poziţia specificată într-o listă. #1 este ultimul element.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Inserează elementul la începutul unei liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Adăugă elementul la sfârşitul unei liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Inserează elementul aleatoriu într-o listă.", - "LISTS_GET_SUBLIST_START_FROM_START": "obţine sub-lista de la #", - "LISTS_GET_SUBLIST_START_FROM_END": "obţine sub-lista de la # de la sfârşitul", - "LISTS_GET_SUBLIST_START_FIRST": "obţine sub-lista de la primul", - "LISTS_GET_SUBLIST_END_FROM_START": "la #", - "LISTS_GET_SUBLIST_END_FROM_END": "la # de la sfarsit", - "LISTS_GET_SUBLIST_END_LAST": "la ultima", - "LISTS_GET_SUBLIST_TOOLTIP": "Creează o copie a porţiunii specificate dintr-o listă.", - "LISTS_SPLIT_LIST_FROM_TEXT": "convertește textul în listă", - "LISTS_SPLIT_TEXT_FROM_LIST": "convertește lista în text", - "LISTS_SPLIT_WITH_DELIMITER": "cu separatorul", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Împarte textul într-o listă de texte, despărțite prin fiecare separator", - "LISTS_SPLIT_TOOLTIP_JOIN": "Concatenează o listă de texte (alternate cu separatorul) într-un text unic", - "VARIABLES_GET_TOOLTIP": "Returnează valoarea acestei variabile.", - "VARIABLES_GET_CREATE_SET": "Crează 'set %1'", - "VARIABLES_SET": "seteaza %1 la %2", - "VARIABLES_SET_TOOLTIP": "Setează această variabilă sa fie egală la intrare.", - "VARIABLES_SET_CREATE_GET": "Crează 'get %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "la", - "PROCEDURES_DEFNORETURN_PROCEDURE": "fă ceva", - "PROCEDURES_BEFORE_PARAMS": "cu:", - "PROCEDURES_CALL_BEFORE_PARAMS": "cu:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Crează o funcţie cu nici o ieşire.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "returnează", - "PROCEDURES_DEFRETURN_TOOLTIP": "Creează o funcţie cu o ieşire.", - "PROCEDURES_ALLOW_STATEMENTS": "permite declarațiile", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Atenţie: Această funcţie are parametri duplicaţi.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Executați funcția '%1 'definită de utilizator.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Executați funcția '%1 'definită de utilizator şi folosiţi producţia sa.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "intrări", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Adăugă, șterge sau reordonează parametrii de intrare ai acestei funcții.", - "PROCEDURES_MUTATORARG_TITLE": "nume de intrare:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Adaugă un parametru de intrare pentru funcție.", - "PROCEDURES_HIGHLIGHT_DEF": "Evidenţiază definiţia funcţiei", - "PROCEDURES_CREATE_DO": "Creaţi '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Dacă o valoare este adevărată, atunci returnează valoarea a doua.", - "PROCEDURES_IFRETURN_WARNING": "Avertisment: Acest bloc poate fi utilizat numai în definiţia unei funcţii." -} diff --git a/msg/json/ru.json b/msg/json/ru.json deleted file mode 100644 index 1937d594fc..0000000000 --- a/msg/json/ru.json +++ /dev/null @@ -1,310 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Espertus", - "MS", - "Okras", - "RedFox" - ] - }, - "VARIABLES_DEFAULT_NAME": "элемент", - "TODAY": "Сегодня", - "DUPLICATE_BLOCK": "Скопировать", - "ADD_COMMENT": "Добавить комментарий", - "REMOVE_COMMENT": "Удалить комментарий", - "EXTERNAL_INPUTS": "Вставки снаружи", - "INLINE_INPUTS": "Вставки внутри", - "DELETE_BLOCK": "Удалить блок", - "DELETE_X_BLOCKS": "Удалить %1 блоков", - "DELETE_ALL_BLOCKS": "Удалить все блоки (%1)?", - "CLEAN_UP": "Убрать блоки", - "COLLAPSE_BLOCK": "Свернуть блок", - "COLLAPSE_ALL": "Свернуть блоки", - "EXPAND_BLOCK": "Развернуть блок", - "EXPAND_ALL": "Развернуть блоки", - "DISABLE_BLOCK": "Отключить блок", - "ENABLE_BLOCK": "Включить блок", - "HELP": "Справка", - "CHAT": "Общайтесь со своим коллегой, печатая в этом поле!", - "AUTH": "Пожалуйста, авторизуйте это приложение, чтоб можно было сохранять вашу работу и чтобы дать возможность вам делиться ей.", - "ME": "Мне", - "CHANGE_VALUE_TITLE": "Измените значение:", - "NEW_VARIABLE": "Новая переменная…", - "NEW_VARIABLE_TITLE": "Имя новой переменной:", - "RENAME_VARIABLE": "Переименовать переменную…", - "RENAME_VARIABLE_TITLE": "Переименовать все переменные '%1' в:", - "COLOUR_PICKER_HELPURL": "https://ru.wikipedia.org/wiki/Цвет", - "COLOUR_PICKER_TOOLTIP": "Выберите цвет из палитры.", - "COLOUR_RANDOM_TITLE": "случайный цвет", - "COLOUR_RANDOM_TOOLTIP": "Выбирает цвет случайным образом.", - "COLOUR_RGB_TITLE": "цвет из", - "COLOUR_RGB_RED": "красного", - "COLOUR_RGB_GREEN": "зелёного", - "COLOUR_RGB_BLUE": "синего", - "COLOUR_RGB_TOOLTIP": "Создаёт цвет с указанной пропорцией красного, зеленого и синего. Все значения должны быть между 0 и 100.", - "COLOUR_BLEND_TITLE": "смешать", - "COLOUR_BLEND_COLOUR1": "цвет 1", - "COLOUR_BLEND_COLOUR2": "цвет 2", - "COLOUR_BLEND_RATIO": "доля цвета 1", - "COLOUR_BLEND_TOOLTIP": "Смешивает два цвета в заданном соотношении (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://ru.wikipedia.org/wiki/Цикл_(программирование)", - "CONTROLS_REPEAT_TITLE": "повторить %1 раз", - "CONTROLS_REPEAT_INPUT_DO": "выполнить", - "CONTROLS_REPEAT_TOOLTIP": "Выполняет некоторые команды несколько раз.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "повторять, пока", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "повторять, пока не", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Пока значение истинно, выполняет команды.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Пока значение ложно, выполняет команды", - "CONTROLS_FOR_TOOLTIP": "Присваивает переменной '%1' значения от начального до конечного с заданным шагом и выполняет указанные команды.", - "CONTROLS_FOR_TITLE": "цикл по %1 от %2 до %3 с шагом %4", - "CONTROLS_FOREACH_TITLE": "для каждого элемента %1 в списке %2", - "CONTROLS_FOREACH_TOOLTIP": "Для каждого элемента в списке, присваивает переменной '%1' значение элемента и выполняет указанные команды.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "выйти из цикла", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "перейти к следующему шагу цикла", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Прерывает этот цикл.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Пропускает остаток цикла и переходит к следующему шагу.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Предупреждение: этот блок может использоваться только внутри цикла.", - "CONTROLS_IF_TOOLTIP_1": "Если условие истинно, выполняет команды.", - "CONTROLS_IF_TOOLTIP_2": "Если условие истинно, выполняет первый блок команд. Иначе выполняется второй блок команд.", - "CONTROLS_IF_TOOLTIP_3": "Если первое условие истинно, то выполняет первый блок команд. Иначе, если второе условие истинно, выполняет второй блок команд.", - "CONTROLS_IF_TOOLTIP_4": "Если первое условие истинно, то выполняет первый блок команд. В противном случае, если второе условие истинно, выполняет второй блок команд. Если ни одно из условий не истинно, выполняет последний блок команд.", - "CONTROLS_IF_MSG_IF": "если", - "CONTROLS_IF_MSG_ELSEIF": "иначе если", - "CONTROLS_IF_MSG_ELSE": "иначе", - "CONTROLS_IF_IF_TOOLTIP": "Добавьте, удалите, переставьте фрагменты для переделки блока \"если\".", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Добавляет условие к блоку \"если\"", - "CONTROLS_IF_ELSE_TOOLTIP": "Добавить заключительный подблок для случая, когда все условия ложны.", - "LOGIC_COMPARE_HELPURL": "https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE", - "LOGIC_COMPARE_TOOLTIP_EQ": "Возвращает значение истина, если вставки равны.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Возвращает значение истина, если вставки не равны.", - "LOGIC_COMPARE_TOOLTIP_LT": "Возвращает значение истина, если первая вставка меньше второй.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Возвращает значение истина, если первая вставка меньше или равна второй.", - "LOGIC_COMPARE_TOOLTIP_GT": "Возвращает значение истина, если первая вставка больше второй.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Возвращает значение истина, если первая вставка больше или равна второй.", - "LOGIC_OPERATION_TOOLTIP_AND": "Возвращает значение истина, если обе вставки истинны.", - "LOGIC_OPERATION_AND": "и", - "LOGIC_OPERATION_TOOLTIP_OR": "Возвращает значение истина, если хотя бы одна из вставок истинна.", - "LOGIC_OPERATION_OR": "или", - "LOGIC_NEGATE_TITLE": "не %1", - "LOGIC_NEGATE_TOOLTIP": "Возвращает значение истина, если вставка ложна. Возвращает значение ложь, если вставка истинна.", - "LOGIC_BOOLEAN_TRUE": "истина", - "LOGIC_BOOLEAN_FALSE": "ложь", - "LOGIC_BOOLEAN_TOOLTIP": "Возвращает значение истина или ложь.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "ничто", - "LOGIC_NULL_TOOLTIP": "Возвращает ничто.", - "LOGIC_TERNARY_HELPURL": "https://ru.wikipedia.org/wiki/Тернарная_условная_операция", - "LOGIC_TERNARY_CONDITION": "выбрать по", - "LOGIC_TERNARY_IF_TRUE": "если истина", - "LOGIC_TERNARY_IF_FALSE": "если ложь", - "LOGIC_TERNARY_TOOLTIP": "Проверяет условие выбора. Если условие истинно, возвращает первое значение, в противном случае возвращает второе значение.", - "MATH_NUMBER_HELPURL": "https://ru.wikipedia.org/wiki/Число", - "MATH_NUMBER_TOOLTIP": "Число.", - "MATH_ARITHMETIC_HELPURL": "https://ru.wikipedia.org/wiki/Арифметика", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Возвращает сумму двух чисел.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Возвращает разность двух чисел.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Возвращает произведение двух чисел.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Возвращает частное от деления первого числа на второе.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Возвращает первое число, возведённое в степень второго числа.", - "MATH_SINGLE_HELPURL": "https://ru.wikipedia.org/wiki/Квадратный_корень", - "MATH_SINGLE_OP_ROOT": "квадратный корень", - "MATH_SINGLE_TOOLTIP_ROOT": "Возвращает квадратный корень числа.", - "MATH_SINGLE_OP_ABSOLUTE": "модуль", - "MATH_SINGLE_TOOLTIP_ABS": "Возвращает модуль числа", - "MATH_SINGLE_TOOLTIP_NEG": "Возвращает противоположное число.", - "MATH_SINGLE_TOOLTIP_LN": "Возвращает натуральный логарифм числа.", - "MATH_SINGLE_TOOLTIP_LOG10": "Возвращает десятичный логарифм числа.", - "MATH_SINGLE_TOOLTIP_EXP": "Возвращает е в указанной степени.", - "MATH_SINGLE_TOOLTIP_POW10": "Возвращает 10 в указанной степени.", - "MATH_TRIG_HELPURL": "https://ru.wikipedia.org/wiki/Тригонометрические_функции", - "MATH_TRIG_TOOLTIP_SIN": "Возвращает синус угла в градусах.", - "MATH_TRIG_TOOLTIP_COS": "Возвращает косинус угла в градусах.", - "MATH_TRIG_TOOLTIP_TAN": "Возвращает тангенс угла в градусах.", - "MATH_TRIG_TOOLTIP_ASIN": "Возвращает арксинус (в градусах).", - "MATH_TRIG_TOOLTIP_ACOS": "Возвращает арккосинус (в градусах).", - "MATH_TRIG_TOOLTIP_ATAN": "Возвращает арктангенс (в градусах)", - "MATH_CONSTANT_HELPURL": "https://ru.wikipedia.org/wiki/Математическая_константа", - "MATH_CONSTANT_TOOLTIP": "Возвращает одну из распространённых констант: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) или ∞ (бесконечность).", - "MATH_IS_EVEN": "чётное", - "MATH_IS_ODD": "нечётное", - "MATH_IS_PRIME": "простое", - "MATH_IS_WHOLE": "целое", - "MATH_IS_POSITIVE": "положительное", - "MATH_IS_NEGATIVE": "отрицательное", - "MATH_IS_DIVISIBLE_BY": "делится на", - "MATH_IS_TOOLTIP": "Проверяет, является ли число чётным, нечётным, простым, целым, положительным, отрицательным или оно кратно определённому числу. Возвращает значение истина или ложь.", - "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", - "MATH_CHANGE_TITLE": "увеличить %1 на %2", - "MATH_CHANGE_TOOLTIP": "Добавляет число к переменной '%1'.", - "MATH_ROUND_HELPURL": "https://ru.wikipedia.org/wiki/Округление", - "MATH_ROUND_TOOLTIP": "Округляет число до большего или меньшего.", - "MATH_ROUND_OPERATOR_ROUND": "округлить", - "MATH_ROUND_OPERATOR_ROUNDUP": "округлить к большему", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "округлить к меньшему", - "MATH_ONLIST_OPERATOR_SUM": "сумма списка", - "MATH_ONLIST_TOOLTIP_SUM": "Возвращает сумму всех чисел в списке.", - "MATH_ONLIST_OPERATOR_MIN": "наименьшее в списке", - "MATH_ONLIST_TOOLTIP_MIN": "Возвращает наименьшее число списка.", - "MATH_ONLIST_OPERATOR_MAX": "наибольшее в списке", - "MATH_ONLIST_TOOLTIP_MAX": "Возвращает наибольшее число списка.", - "MATH_ONLIST_OPERATOR_AVERAGE": "среднее арифметическое списка", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Возвращает среднее арифметическое списка.", - "MATH_ONLIST_OPERATOR_MEDIAN": "медиана списка", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Возвращает медиану списка.", - "MATH_ONLIST_OPERATOR_MODE": "моды списка", - "MATH_ONLIST_TOOLTIP_MODE": "Возвращает список наиболее часто встречающихся элементов списка.", - "MATH_ONLIST_OPERATOR_STD_DEV": "стандартное отклонение списка", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Возвращает стандартное отклонение списка.", - "MATH_ONLIST_OPERATOR_RANDOM": "случайный элемент списка", - "MATH_ONLIST_TOOLTIP_RANDOM": "Возвращает случайный элемент списка.", - "MATH_MODULO_HELPURL": "https://ru.wikipedia.org/wiki/Деление_с_остатком", - "MATH_MODULO_TITLE": "остаток от %1 : %2", - "MATH_MODULO_TOOLTIP": "Возвращает остаток от деления двух чисел.", - "MATH_CONSTRAIN_TITLE": "ограничить %1 снизу %2 сверху %3", - "MATH_CONSTRAIN_TOOLTIP": "Ограничивает число нижней и верхней границами (включительно).", - "MATH_RANDOM_INT_HELPURL": "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел", - "MATH_RANDOM_INT_TITLE": "случайное целое число от %1 для %2", - "MATH_RANDOM_INT_TOOLTIP": "Возвращает случайное число между двумя заданными пределами (включая и их).", - "MATH_RANDOM_FLOAT_HELPURL": "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "случайное число от 0 (включительно) до 1", - "MATH_RANDOM_FLOAT_TOOLTIP": "Возвращает случайное число от 0.0 (включительно) до 1.0.", - "TEXT_TEXT_HELPURL": "https://ru.wikipedia.org/wiki/Строковый_тип", - "TEXT_TEXT_TOOLTIP": "Буква, слово или строка текста.", - "TEXT_JOIN_TITLE_CREATEWITH": "создать текст из", - "TEXT_JOIN_TOOLTIP": "Создаёт фрагмент текста, объединяя любое число элементов", - "TEXT_CREATE_JOIN_TITLE_JOIN": "соединить", - "TEXT_CREATE_JOIN_TOOLTIP": "Добавьте, удалите, переставьте фрагменты для переделки текстового блока.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Добавить элемент к тексту.", - "TEXT_APPEND_TO": "к", - "TEXT_APPEND_APPENDTEXT": "добавить текст", - "TEXT_APPEND_TOOLTIP": "Добавить текст к переменной «%1».", - "TEXT_LENGTH_TITLE": "длина %1", - "TEXT_LENGTH_TOOLTIP": "Возвращает число символов (включая пробелы) в заданном тексте.", - "TEXT_ISEMPTY_TITLE": "%1 пуст", - "TEXT_ISEMPTY_TOOLTIP": "Возвращает значение истина, если предоставленный текст пуст.", - "TEXT_INDEXOF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает 0, если текст не найден.", - "TEXT_INDEXOF_INPUT_INTEXT": "в тексте", - "TEXT_INDEXOF_OPERATOR_FIRST": "найти первое вхождение текста", - "TEXT_INDEXOF_OPERATOR_LAST": "найти последнее вхождение текста", - "TEXT_CHARAT_INPUT_INTEXT": "в тексте", - "TEXT_CHARAT_FROM_START": "взять букву №", - "TEXT_CHARAT_FROM_END": "взять букву № с конца", - "TEXT_CHARAT_FIRST": "взять первую букву", - "TEXT_CHARAT_LAST": "взять последнюю букву", - "TEXT_CHARAT_RANDOM": "взять случайную букву", - "TEXT_CHARAT_TOOLTIP": "Возвращает букву в указанной позиции.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Возвращает указанную часть текста.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "в тексте", - "TEXT_GET_SUBSTRING_START_FROM_START": "взять подстроку с буквы №", - "TEXT_GET_SUBSTRING_START_FROM_END": "взять подстроку с буквы № с конца", - "TEXT_GET_SUBSTRING_START_FIRST": "взять подстроку с первой буквы", - "TEXT_GET_SUBSTRING_END_FROM_START": "по букву №", - "TEXT_GET_SUBSTRING_END_FROM_END": "по букву № с конца", - "TEXT_GET_SUBSTRING_END_LAST": "по последнюю букву", - "TEXT_CHANGECASE_TOOLTIP": "Возвращает копию текста с ЗАГЛАВНЫМИ или строчными буквами.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "в ЗАГЛАВНЫЕ БУКВЫ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "в строчные буквы", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "в Заглавные Начальные Буквы", - "TEXT_TRIM_TOOLTIP": "Возвращает копию текста с пробелами, удалеными с одного или обоих концов.", - "TEXT_TRIM_OPERATOR_BOTH": "обрезать пробелы с двух сторон", - "TEXT_TRIM_OPERATOR_LEFT": "обрезать пробелы слева", - "TEXT_TRIM_OPERATOR_RIGHT": "обрезать пробелы справа", - "TEXT_PRINT_TITLE": "напечатать %1", - "TEXT_PRINT_TOOLTIP": "Печатает текст, число или другой объект.", - "TEXT_PROMPT_TYPE_TEXT": "запросить текст с подсказкой", - "TEXT_PROMPT_TYPE_NUMBER": "запросить число с подсказкой", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Запросить у пользователя число.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Запросить у пользователя текст.", - "LISTS_CREATE_EMPTY_TITLE": "создать пустой список", - "LISTS_CREATE_EMPTY_TOOLTIP": "Возвращает список длины 0, не содержащий данных", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Создаёт список с любым числом элементов.", - "LISTS_CREATE_WITH_INPUT_WITH": "создать список из", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "список", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Добавьте, удалите, переставьте элементы для переделки блока списка.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Добавляет элемент к списку.", - "LISTS_REPEAT_TOOLTIP": "Создаёт список, состоящий из заданного числа копий элемента.", - "LISTS_REPEAT_TITLE": "создать список из элемента %1, повторяющегося %2 раз", - "LISTS_LENGTH_TITLE": "длина %1", - "LISTS_LENGTH_TOOLTIP": "Возвращает длину списка.", - "LISTS_ISEMPTY_TITLE": "%1 пуст", - "LISTS_ISEMPTY_TOOLTIP": "Возвращает значение истина, если список пуст.", - "LISTS_INLIST": "в списке", - "LISTS_INDEX_OF_FIRST": "найти первое вхождение элемента", - "LISTS_INDEX_OF_LAST": "найти последнее вхождение элемента", - "LISTS_INDEX_OF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает 0, если элемент не найден.", - "LISTS_GET_INDEX_GET": "взять", - "LISTS_GET_INDEX_GET_REMOVE": "взять и удалить", - "LISTS_GET_INDEX_REMOVE": "удалить", - "LISTS_GET_INDEX_FROM_END": "№ с конца", - "LISTS_GET_INDEX_FIRST": "первый", - "LISTS_GET_INDEX_LAST": "последний", - "LISTS_GET_INDEX_RANDOM": "произвольный", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Возвращает элемент в указанной позиции списка (№1 - первый элемент).", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Возвращает элемент в указанной позиции списка (№1 - последний элемент).", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Возвращает первый элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Возвращает последний элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Возвращает случайный элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Удаляет и возвращает элемент в указанной позиции списка (№1 - первый элемент).", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Удаляет и возвращает элемент в указанной позиции списка (№1 - последний элемент).", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Удаляет и возвращает первый элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Удаляет и возвращает последний элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Удаляет и возвращает случайный элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Удаляет элемент в указанной позиции списка (№1 - первый элемент).", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Удаляет элемент в указанной позиции списка (№1 - последний элемент).", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Удаляет первый элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Удаляет последний элемент списка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Удаляет случайный элемент списка.", - "LISTS_SET_INDEX_SET": "присвоить", - "LISTS_SET_INDEX_INSERT": "вставить в", - "LISTS_SET_INDEX_INPUT_TO": "=", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Присваивает значение элементу в указанной позиции списка (№1 - первый элемент).", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Присваивает значение элементу в указанной позиции списка (№1 - последний элемент).", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Присваивает значение первому элементу списка.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Присваивает значение последнему элементу списка.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Присваивает значение случайному элементу списка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Вставляет элемент в указанной позиции списка (№1 - первый элемент).", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Вставляет элемент в указанной позиции списка (№1 - последний элемент).", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Вставляет элемент в начало списка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Добавляет элемент в конец списка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Вставляет элемент в случайное место в списке.", - "LISTS_GET_SUBLIST_START_FROM_START": "взять подсписок с №", - "LISTS_GET_SUBLIST_START_FROM_END": "взять подсписок с № с конца", - "LISTS_GET_SUBLIST_START_FIRST": "взять подсписок с первого", - "LISTS_GET_SUBLIST_END_FROM_START": "по №", - "LISTS_GET_SUBLIST_END_FROM_END": "по № с конца", - "LISTS_GET_SUBLIST_END_LAST": "по последний", - "LISTS_GET_SUBLIST_TOOLTIP": "Создаёт копию указанной части списка.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "сделать список из текста", - "LISTS_SPLIT_TEXT_FROM_LIST": "собрать текст из списка", - "LISTS_SPLIT_WITH_DELIMITER": "с разделителем", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Разбивает текст в список текстов, по разделителям.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Соединяет сптсок текстов в один текст с разделителями.", - "VARIABLES_GET_TOOLTIP": "Возвращает значение этой переменной.", - "VARIABLES_GET_CREATE_SET": "Создать блок \"присвоить\" для %1", - "VARIABLES_SET": "присвоить %1 = %2", - "VARIABLES_SET_TOOLTIP": "Присваивает переменной значение вставки.", - "VARIABLES_SET_CREATE_GET": "Создать вставку %1", - "PROCEDURES_DEFNORETURN_TITLE": "чтобы", - "PROCEDURES_DEFNORETURN_PROCEDURE": "выполнить что-то", - "PROCEDURES_BEFORE_PARAMS": "с:", - "PROCEDURES_CALL_BEFORE_PARAMS": "с:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Создаёт процедуру, не возвращающую значение.", - "PROCEDURES_DEFRETURN_RETURN": "вернуть", - "PROCEDURES_DEFRETURN_TOOLTIP": "Создаёт процедуру, возвращающую значение.", - "PROCEDURES_ALLOW_STATEMENTS": "разрешить операторы", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Предупреждение: эта функция имеет повторяющиеся параметры.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://ru.wikipedia.org/wiki/Функция_%28программирование%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Исполняет определённую пользователем процедуру '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://ru.wikipedia.org/wiki/Функция_%28программирование%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Исполняет определённую пользователем процедуру '%1' и возвращает вычисленное значение.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "параметры", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Добавить, удалить или изменить порядок входных параметров для этой функции.", - "PROCEDURES_MUTATORARG_TITLE": "имя параметра:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Добавить входной параметр в функцию.", - "PROCEDURES_HIGHLIGHT_DEF": "Выделить определение процедуры", - "PROCEDURES_CREATE_DO": "Создать вызов '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Если первое значение истинно, возвращает второе значение.", - "PROCEDURES_IFRETURN_WARNING": "Предупреждение: Этот блок может использоваться только внутри определения функции." -} diff --git a/msg/json/sc.json b/msg/json/sc.json deleted file mode 100644 index ea088b0f2a..0000000000 --- a/msg/json/sc.json +++ /dev/null @@ -1,305 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Via maxima", - "Taxandru", - "Uharteko" - ] - }, - "VARIABLES_DEFAULT_NAME": "item", - "TODAY": "Oe", - "DUPLICATE_BLOCK": "Dùplica", - "ADD_COMMENT": "Agiunghe unu cumentu", - "REMOVE_COMMENT": "Fùlia unu cumentu", - "EXTERNAL_INPUTS": "Intradas esternas", - "INLINE_INPUTS": "Intradas in lìnia", - "DELETE_BLOCK": "Fùlia Blocu", - "DELETE_X_BLOCKS": "Fulia %1 Blocus", - "DELETE_ALL_BLOCKS": "Scancellu su %1 de is brocus?", - "CLEAN_UP": "Lìmpia is brocus", - "COLLAPSE_BLOCK": "Serra e stringi Brocu", - "COLLAPSE_ALL": "Serra e stringi Brocus", - "EXPAND_BLOCK": "Aberi Brocu", - "EXPAND_ALL": "Aberi Brocus", - "DISABLE_BLOCK": "Disabìlita Blocu", - "ENABLE_BLOCK": "Abìlita Blocu", - "HELP": "Agiudu", - "CHAT": "Faedda cun su cumpàngiu tuo iscriende inoghe!", - "AUTH": "Permiti a custa app de sarvare su traballu tuo e de ti lu fàghere cumpartzire.", - "ME": "Deo", - "CHANGE_VALUE_TITLE": "Muda valori:", - "NEW_VARIABLE": "Variabili noa...", - "NEW_VARIABLE_TITLE": "Nòmini de sa variabili noa:", - "RENAME_VARIABLE": "Muda nòmini a variabili...", - "RENAME_VARIABLE_TITLE": "A is variabilis '%1' muda nòmini a:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Scebera unu colori de sa tauledda.", - "COLOUR_RANDOM_TITLE": "Unu colori a brítiu", - "COLOUR_RANDOM_TOOLTIP": "Scebera unu colori a brítiu.", - "COLOUR_RGB_TITLE": "colora cun", - "COLOUR_RGB_RED": "arrùbiu", - "COLOUR_RGB_GREEN": "birdi", - "COLOUR_RGB_BLUE": "blue", - "COLOUR_RGB_TOOLTIP": "Cuncorda unu colori cun su tanti de arrubiu, birdi, e blue. Totu is valoris depint essi intra 0 e 100.", - "COLOUR_BLEND_TITLE": "mestura", - "COLOUR_BLEND_COLOUR1": "colori 1", - "COLOUR_BLEND_COLOUR2": "colori 2", - "COLOUR_BLEND_RATIO": "raportu", - "COLOUR_BLEND_TOOLTIP": "Amestura duus coloris cun unu raportu (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "repiti %1 bortas", - "CONTROLS_REPEAT_INPUT_DO": "fai", - "CONTROLS_REPEAT_TOOLTIP": "Fait pariga de cumandus prus bortas.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repiti interis", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repiti fintzas", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Interis su valori est berus, tandu fai pariga de cumandus.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Interis su valori est frassu, tandu fai pariga de cumandus.", - "CONTROLS_FOR_TOOLTIP": "Fait pigai a sa variàbili \"%1\" i valoris de su primu numeru a s'urtimu, a su passu impostau e fait su brocu.", - "CONTROLS_FOR_TITLE": "po %1 de %2 fintzas %3 a passus de %4", - "CONTROLS_FOREACH_TITLE": "po dònnia item %1 in lista %2", - "CONTROLS_FOREACH_TOOLTIP": "Po dònnia item in sa lista, ponit sa variàbili '%1' pari a s'item, e tandu fait pariga de cumandus.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "sàrtiat a foras de sa lòriga", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "sighit cun su repicu afatànti", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Bessit de sa lòriga.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sartiat su chi abarrat de sa loriga, e sighit cun su repicu afatànti.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Amonestu: Custu brocu ddu podis ponni sceti aintru de una lòriga.", - "CONTROLS_IF_TOOLTIP_1": "Si su valori est berus, tandu fait pariga de cumandus.", - "CONTROLS_IF_TOOLTIP_2": "Si su valori est berus, tandu fai su primu brocu de is cumandus. Sinuncas, fai su segundu brocu de is cumandus.", - "CONTROLS_IF_TOOLTIP_3": "Si su primu valori est beridadi, tandu fai su primu brocu de is cumandus. Sinuncas, si su segundu valori est beridadi, fai su segundu brocu de is cumandus.", - "CONTROLS_IF_TOOLTIP_4": "Si su primu valori est berus, tandu fai su primu brocu de is cumandus. Sinuncas, si su segundu valori est berus, fai su segundu brocu de is cumandus. Si mancu unu valori est berus, tandu fai s'urtimu brocu de is cumandus.", - "CONTROLS_IF_MSG_IF": "si", - "CONTROLS_IF_MSG_ELSEIF": "sinuncas si", - "CONTROLS_IF_MSG_ELSE": "sinuncas", - "CONTROLS_IF_IF_TOOLTIP": "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu si.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Aciungi una cunditzioni a su brocu si.", - "CONTROLS_IF_ELSE_TOOLTIP": "Aciungi una urtima cunditzioni piga-totu a su brocu si.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Torrat berus si is inputs funt unu uguali a s'àteru.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Torrat berus si is inputs non funt unu uguali a s'àteru.", - "LOGIC_COMPARE_TOOLTIP_LT": "Torrat berus si su primu input est prus piticu de s'àteru.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Torrat berus si su primu input est prus piticu o uguali a s'àteru.", - "LOGIC_COMPARE_TOOLTIP_GT": "Torrat berus si su primu input est prus mannu de s'àteru.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Torrat berus si su primu input est prus mannu o uguali a s'àteru.", - "LOGIC_OPERATION_TOOLTIP_AND": "Torrat berus si ambos is inputs funt berus.", - "LOGIC_OPERATION_AND": "and", - "LOGIC_OPERATION_TOOLTIP_OR": "Torrat berus si assumancu unu de is inputs est berus.", - "LOGIC_OPERATION_OR": "or", - "LOGIC_NEGATE_TITLE": "non %1", - "LOGIC_NEGATE_TOOLTIP": "Torrat berus si s'input est frassu. Torrat frassu si s'input est berus.", - "LOGIC_BOOLEAN_TRUE": "berus", - "LOGIC_BOOLEAN_FALSE": "frassu", - "LOGIC_BOOLEAN_TOOLTIP": "Torrat berus o frassu.", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Torrat null.", - "LOGIC_TERNARY_CONDITION": "cumpròa", - "LOGIC_TERNARY_IF_TRUE": "si berus", - "LOGIC_TERNARY_IF_FALSE": "si frassu", - "LOGIC_TERNARY_TOOLTIP": "‎Cumproa sa cunditzioni in 'cumproa'. Si sa cunditzioni est berus, torrat su valori 'si berus'; sinuncas torrat su valori 'si frassu'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Unu numeru", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Torrat sa summa de is duus nùmerus.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Torrat sa diferèntzia de is duus nùmerus.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Torrat su produtu de is duus nùmerus.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Torrat su cuotzienti de is duus nùmerus.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Torrat su primu numeru artziau a sa potenza de su segundu nùmeru.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "arraxina cuadra", - "MATH_SINGLE_TOOLTIP_ROOT": "Torrat s'arraxina cuadra de unu numeru.", - "MATH_SINGLE_OP_ABSOLUTE": "assolutu", - "MATH_SINGLE_TOOLTIP_ABS": "Torrat su valori assolútu de unu numeru.", - "MATH_SINGLE_TOOLTIP_NEG": "Torrat su valori negau de unu numeru.", - "MATH_SINGLE_TOOLTIP_LN": "Torrat su logaritmu naturali de unu numeru.", - "MATH_SINGLE_TOOLTIP_LOG10": "Torrat su logaritmu a basi 10 de unu numeru.", - "MATH_SINGLE_TOOLTIP_EXP": "Torrat (e) a sa potèntzia de unu numeru.", - "MATH_SINGLE_TOOLTIP_POW10": "Torrat (10) a sa potèntzia de unu numeru.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Torrat su sinu de unu gradu (no radianti).", - "MATH_TRIG_TOOLTIP_COS": "Torrat su cosinu de unu gradu (no radianti).", - "MATH_TRIG_TOOLTIP_TAN": "Torrat sa tangenti de unu gradu (no radianti).", - "MATH_TRIG_TOOLTIP_ASIN": "Torrat su arcsinu de unu numeru.", - "MATH_TRIG_TOOLTIP_ACOS": "Torrat su arccosinu de unu numeru.", - "MATH_TRIG_TOOLTIP_ATAN": "Torrat su arctangenti de unu numeru.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Torrat una de is costantis comunas: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), o ∞ (infiniu).", - "MATH_IS_EVEN": "est paris", - "MATH_IS_ODD": "est dísparu", - "MATH_IS_PRIME": "est primu", - "MATH_IS_WHOLE": "est intreu", - "MATH_IS_POSITIVE": "est positivu", - "MATH_IS_NEGATIVE": "est negativu", - "MATH_IS_DIVISIBLE_BY": "fait a ddu dividi po", - "MATH_IS_TOOLTIP": "Cumprova si unu numeru est paris, dìsparis, primu, intreu, positivu, negativu o si fait a ddu dividi po unu numeru giau. Torrat berus o frassu.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "muda %1 de %2", - "MATH_CHANGE_TOOLTIP": "Aciungi unu numeru a sa variabili '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Arretunda unu numeru faci a susu o faci a bàsciu.", - "MATH_ROUND_OPERATOR_ROUND": "arretunda", - "MATH_ROUND_OPERATOR_ROUNDUP": "Arretunda faci a susu", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "arretunda faci a bàsciu.", - "MATH_ONLIST_OPERATOR_SUM": "suma sa lista", - "MATH_ONLIST_TOOLTIP_SUM": "Torrat sa suma de totu is numerus de sa lista.", - "MATH_ONLIST_OPERATOR_MIN": "minimu de sa lista", - "MATH_ONLIST_TOOLTIP_MIN": "Torrat su numeru prus piticu de sa lista.", - "MATH_ONLIST_OPERATOR_MAX": "massimu de sa lista", - "MATH_ONLIST_TOOLTIP_MAX": "Torrat su numeru prus mannu de sa lista", - "MATH_ONLIST_OPERATOR_AVERAGE": "mèdia de sa lista", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Torrat sa mèdia (aritimètica) de is valoris de sa lista.", - "MATH_ONLIST_OPERATOR_MEDIAN": "medianu de sa lista", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Torrat su numeru medianu de sa lista.", - "MATH_ONLIST_OPERATOR_MODE": "modas de sa lista", - "MATH_ONLIST_TOOLTIP_MODE": "Torrat una lista de is itams prus frecuentis de sa lista.", - "MATH_ONLIST_OPERATOR_STD_DEV": "deviadura standard de sa lista", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Torrat sa deviadura standard de sa lista.", - "MATH_ONLIST_OPERATOR_RANDOM": "unu item a brìtiu de sa lista", - "MATH_ONLIST_TOOLTIP_RANDOM": "Torrat unu item a brìtiu de sa lista.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "arrestu de %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Torrat s'arrestu de sa divisioni de duus numerus.", - "MATH_CONSTRAIN_TITLE": "custringi %1 de %2 a %3", - "MATH_CONSTRAIN_TOOLTIP": "Custringi unu numeru aintru de is liminaxus giaus (cumprendius).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "numeru intreu a brítiu de %1 a %2", - "MATH_RANDOM_INT_TOOLTIP": "Torrat unu numeru intreu a brìtiu intra duus nùmerus giaus (cumpresus).", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "una fratzioni a brìtiu", - "MATH_RANDOM_FLOAT_TOOLTIP": "Torrat una fratzioni a brìtiu intra 0.0 (cumpresu) e 1.0 (bogau).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Una lìtera, paràula, o linia de testu.", - "TEXT_JOIN_TITLE_CREATEWITH": "scri testu cun", - "TEXT_JOIN_TOOLTIP": "Fait unu testu ponendi a pari parigas de items.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "auni a pari", - "TEXT_CREATE_JOIN_TOOLTIP": "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu de testu.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Acciungi unu item a su testu.", - "TEXT_APPEND_TO": "a", - "TEXT_APPEND_APPENDTEXT": "acciungi su testu", - "TEXT_APPEND_TOOLTIP": "Aciungit testu a sa variàbili '%1'.", - "TEXT_LENGTH_TITLE": "longària de %1", - "TEXT_LENGTH_TOOLTIP": "Torrat su numeru de lìteras (cun is spàtzius) in su testu giau.", - "TEXT_ISEMPTY_TITLE": "%1 est buidu", - "TEXT_ISEMPTY_TOOLTIP": "Torrat berus si su testu giau est buidu.", - "TEXT_INDEXOF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat 0 si su testu no ddu agatat.", - "TEXT_INDEXOF_INPUT_INTEXT": "in su testu", - "TEXT_INDEXOF_OPERATOR_FIRST": "circa prima ocasioni de su testu", - "TEXT_INDEXOF_OPERATOR_LAST": "circa urtima ocasioni de su testu", - "TEXT_CHARAT_INPUT_INTEXT": "in su testu", - "TEXT_CHARAT_FROM_START": "piga sa lìtera #", - "TEXT_CHARAT_FROM_END": "piga sa lìtera # de sa fini", - "TEXT_CHARAT_FIRST": "piga sa prima lìtera", - "TEXT_CHARAT_LAST": "piga s'urtima lìtera", - "TEXT_CHARAT_RANDOM": "piga una lìtera a brìtiu", - "TEXT_CHARAT_TOOLTIP": "Torrat sa lìtera de su postu giau.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Torrat su testu inditau.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in su testu", - "TEXT_GET_SUBSTRING_START_FROM_START": "piga suta-stringa de sa lìtera #", - "TEXT_GET_SUBSTRING_START_FROM_END": "piga suta-stringa de sa lìtera # fintzas a fini", - "TEXT_GET_SUBSTRING_START_FIRST": "piga suta-stringa de sa primu lìtera", - "TEXT_GET_SUBSTRING_END_FROM_START": "a sa lìtera #", - "TEXT_GET_SUBSTRING_END_FROM_END": "a sa lìtera # de sa fini", - "TEXT_GET_SUBSTRING_END_LAST": "a s'urtima lìtera", - "TEXT_CHANGECASE_TOOLTIP": "Torrat una copia de su testu inditau mudendi mauschínu/minúdu.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "a mauschínu", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "a minúdu", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "cun Primu lìtera a Mauschínu", - "TEXT_TRIM_TOOLTIP": "Torrat una copia de su testu bogaus is spàtzius de unu o de ambus is càbudus.", - "TEXT_TRIM_OPERATOR_BOTH": "bogat spàtzius de ambus càbudus de", - "TEXT_TRIM_OPERATOR_LEFT": "bogat spàtzius de su càbudu de manca de", - "TEXT_TRIM_OPERATOR_RIGHT": "bogat spàtzius de su càbudu de dereta de", - "TEXT_PRINT_TITLE": "scri %1", - "TEXT_PRINT_TOOLTIP": "Scri su testu, numeru o àteru valori.", - "TEXT_PROMPT_TYPE_TEXT": "pregonta po su testu", - "TEXT_PROMPT_TYPE_NUMBER": "pregonta po unu numeru", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Pregonta unu nùmeru a s'impitadore.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Pregonta testu a s'impitadore.", - "LISTS_CREATE_EMPTY_TITLE": "fait una lista buida", - "LISTS_CREATE_EMPTY_TOOLTIP": "Torrat una lista, de longària 0, chena records de datus.", - "LISTS_CREATE_WITH_TOOLTIP": "Fait una lista cun calisiollat numeru de items.", - "LISTS_CREATE_WITH_INPUT_WITH": "fait una lista cun", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu lista.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Acciungi unu item a sa lista.", - "LISTS_REPEAT_TOOLTIP": "Fait una lista cun unu numeru giau repitiu su tanti de is bortas inditadas.", - "LISTS_REPEAT_TITLE": "fait una lista cun item %1 repitiu %2 bortas", - "LISTS_LENGTH_TITLE": "longària de %1", - "LISTS_LENGTH_TOOLTIP": "Torrat sa longària de una lista.", - "LISTS_ISEMPTY_TITLE": "%1 est buidu", - "LISTS_ISEMPTY_TOOLTIP": "Torrat berus si sa lista est buida.", - "LISTS_INLIST": "in lista", - "LISTS_INDEX_OF_FIRST": "circa prima ocasioni de s'item", - "LISTS_INDEX_OF_LAST": "circa urtima ocasioni de s'item", - "LISTS_INDEX_OF_TOOLTIP": "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat 0 si s'item non s'agatat.", - "LISTS_GET_INDEX_GET": "piga", - "LISTS_GET_INDEX_GET_REMOVE": "piga e fùlia", - "LISTS_GET_INDEX_REMOVE": "fùlia", - "LISTS_GET_INDEX_FROM_END": "# de sa fini", - "LISTS_GET_INDEX_FIRST": "primu", - "LISTS_GET_INDEX_LAST": "urtimu", - "LISTS_GET_INDEX_RANDOM": "a brìtiu (random)", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Torrat s'elementu de su postu inditau de una lista. #1 est po su primu elementu.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Torrat s'elementu de su postu inditau de una lista. Postu #1 est po s'urtimu elementu.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Torrat su primu elementu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Torrat s'urtimu elementu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Torrat un'elementu a brìtiu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fùliat e torrat s'elementu de su postu inditau de una lista. #1 est po su primu elementu.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fùliat e torrat s'elementu de su postu inditau de una lista. #1 est po s'urtimu elementu.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fùliat e torrat su primu elementu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fùliat e torrat s'urtimu elementu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fùliat e torrat un'elementu a brìtiu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fùliat s'elementu de su postu inditau de una lista. #1 est po su primu elementu.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fùliat s'elementu de su postu inditau de una lista. #1 est po s'urtimu elementu.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fùliat su primu elementu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fùliat s'urtimu elementu de una lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Fùliat unu elementu a brìtiu de una lista.", - "LISTS_SET_INDEX_SET": "imposta", - "LISTS_SET_INDEX_INSERT": "inserta a", - "LISTS_SET_INDEX_INPUT_TO": "a", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Impostat s'elementu in su postu inditau de una lista. Postu 1 est po su primu elementu.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Impostat s'elementu in su postu inditau de una lista. Postu #1 est po s'urtimu elementu.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Impostat su primu elementu in una lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Impostat s'urtimu elementu in una lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Impostat unu elementu random in una lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Insertat s'elementu in su postu inditau in una lista. Postu #1 est po su primu elementu.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Insertat s'elementu in su postu inditau de una lista. Postu #1 est po s'urtimu elementu.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insertat s'elementu a su cumintzu de sa lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Aciungit s'elementu a sa fini de sa lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Aciungit s'elementu a brítiu in sa lista.", - "LISTS_GET_SUBLIST_START_FROM_START": "bogandi suta-lista de #", - "LISTS_GET_SUBLIST_START_FROM_END": "bogandi suta-lista de # de sa fini.", - "LISTS_GET_SUBLIST_START_FIRST": "bogandi suta-lista de su primu", - "LISTS_GET_SUBLIST_END_FROM_START": "fintzas a #", - "LISTS_GET_SUBLIST_END_FROM_END": "a # de sa fini", - "LISTS_GET_SUBLIST_END_LAST": "a s'urtimu", - "LISTS_GET_SUBLIST_TOOLTIP": "Fait una copia de sa parti inditada de sa lista.", - "LISTS_SPLIT_LIST_FROM_TEXT": "fai una lista de unu testu", - "LISTS_SPLIT_TEXT_FROM_LIST": "fai unu testu de una lista", - "LISTS_SPLIT_WITH_DELIMITER": "cun separadori", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividi su testu in un'elencu de testus, firmendi po dònnia separadori.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Auni una lista de testus in d-unu sceti, ponendi separadoris.", - "VARIABLES_GET_TOOLTIP": "Torrat su valori de custa variabili.", - "VARIABLES_GET_CREATE_SET": "Fait 'imposta %1'", - "VARIABLES_SET": "imposta %1 a %2", - "VARIABLES_SET_TOOLTIP": "Imposta custa variabili uguali a s'input.", - "VARIABLES_SET_CREATE_GET": "Fait 'piga %1'", - "PROCEDURES_DEFNORETURN_TITLE": "po", - "PROCEDURES_DEFNORETURN_PROCEDURE": "fait calincuna cosa", - "PROCEDURES_BEFORE_PARAMS": "con:", - "PROCEDURES_CALL_BEFORE_PARAMS": "cun", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Fait una funtzioni chena output.", - "PROCEDURES_DEFRETURN_RETURN": "torrat", - "PROCEDURES_DEFRETURN_TOOLTIP": "Fait una funtzioni cun output.", - "PROCEDURES_ALLOW_STATEMENTS": "permiti decraratzionis", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Amonestu: Custa funtzioni tenit parametrus duplicaus.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Arròllia sa funtzione '%1' cuncordada dae s'impitadore.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Arròllia sa funtzione '%1' cuncordada dae s'impitadore e imprea s'output suu.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "inputs", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Aciungi, fùlia, o assenta is inputs a custa funtzioni.", - "PROCEDURES_MUTATORARG_TITLE": "nomini input:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Aciungi un input a sa funtzioni.", - "PROCEDURES_HIGHLIGHT_DEF": "Marca sa definitzioni de funtzioni.", - "PROCEDURES_CREATE_DO": "Ingenerau'%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Si unu valori est berus, tandu torrat unu segundu valori.", - "PROCEDURES_IFRETURN_WARNING": "Amonestu: Custu brocu ddu podis ponni sceti aintru de una funtzioni." -} diff --git a/msg/json/shn.json b/msg/json/shn.json deleted file mode 100644 index 9fa21e1f31..0000000000 --- a/msg/json/shn.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Saosukham" - ] - }, - "VARIABLES_DEFAULT_NAME": "ဢၼ်", - "TODAY": "မိူဝ်ႈၼႆႉ", - "DUPLICATE_BLOCK": "ထုတ်ႇ", - "ADD_COMMENT": "သႂ်ႇၶေႃႈၵႂၢမ်း", - "REMOVE_COMMENT": "ဢဝ်ဢွၵ်ႇ ၶေႃႈၵႂၢမ်း", - "EXTERNAL_INPUTS": "ၶိူင်ႈဢၼ်လုၵ်ႉတၢင်းၼွၵ်ႈၶဝ်ႈမႃး", - "INLINE_INPUTS": "ၶိူင်ႈဢၼ်ၶဝ်ႈမႃးၸွမ်းလႅင်း", - "DELETE_BLOCK": "မွတ်ႇပလွၵ်ႉ", - "DELETE_X_BLOCKS": "မွတ်ႇပလွၵ်ႉ %1", - "COLLAPSE_BLOCK": "ပလွၵ်ႉလႅဝ်", - "COLLAPSE_ALL": "ပလွၵ်ႉတင်းၼမ် လႅဝ်", - "EXPAND_BLOCK": "ၶႂၢၵ်ႈပလွၵ်ႉ", - "EXPAND_ALL": "ၶႂၢၵ်ႈပလွၵ်ႉတင်းၼမ်", - "DISABLE_BLOCK": "ဢမ်ႇၸၢင်ႈပလွၵ်ႉ", - "ENABLE_BLOCK": "ၵမ်ႉထႅမ်ပၼ် ပလွၵ်ႉ", - "HELP": "ၸွႆႈထႅမ်", - "CHAT": "​ပေႃႉလိၵ်ႈ ၼႂ်းလွၵ်းၼႆႉသေ ၶျၢတ်ႉၸူး ၵေႃႉႁူမ်ႈႁဵတ်းႁူမ်ႈသၢင်ႈ ၸဝ်ႈၵဝ်ႇ", - "AUTH": "ၶွပ်ႈၸႂ် ပၼ်ၶႂၢင်ႉႁပ်ႉဢဝ် ဢႅပ်ႉၼႆႉ တီႈၼႂ်းၵၢၼ်ၸဝ်ႈၵဝ်ႇသေယဝ်ႉ ၸဝ်ႈၵဝ်ႇ ႁႂ်ႈလႆႈသိမ်း ႁႂ်ႈလႆႈပိုၼ်ပၼ်သေၵမ်း", - "ME": "ၸဝ်ႈၵဝ်ႇ", - "CHANGE_VALUE_TITLE": "လႅၵ်ႈလၢႆႈၼမ်ႉၵတ်ႉ", - "NEW_VARIABLE": "လၢႆႈဢၼ်မႂ်ႇ", - "NEW_VARIABLE_TITLE": "ၸိုဝ်ႈဢၼ်လၢႆႈမႂ်ႇ", - "RENAME_VARIABLE": "လိုမ်ႉၶိုၼ်း ဢၼ်လၢႆႈမႂ်ႇ", - "RENAME_VARIABLE_TITLE": "လိုမ်ႉၶိုၼ်း ဢၼ်လၢႆႈမႂ်ႇၸိူဝ်းၼၼ်ႉ '%1' ထိုင်", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color သီ", - "COLOUR_PICKER_TOOLTIP": "လိူၵ်ႈသီ တမ်ႈတီႈ ၽႃးလႅတ်ႉ", - "COLOUR_RANDOM_TITLE": "သီလၢမ်းလိမ်း", - "COLOUR_RANDOM_TOOLTIP": "လိူၵ်ႈသီတမ်ႈတီႈလွၵ်းလၢမ်းလိမ်း", - "COLOUR_RGB_TITLE": "ႁူမ်ႈၵိုၵ်းသီ", - "COLOUR_RGB_RED": "လီင်", - "COLOUR_RGB_GREEN": "ၶဵဝ်", - "COLOUR_RGB_BLUE": "သွမ်ႇ", - "COLOUR_RGB_TOOLTIP": "ႁဵတ်းတူၺ်း သီဢၼ်ၼိုင်ႈ ၸွမ်းၼင်ႇမၵ်းမၼ်ႈဝႆႉ ၼႂ်းၶႂၢင်ႇ သီလႅင်, ၶဵဝ် လႄႈ သွမ်ႇ။ ၼမ်ႉၼၵ်းသီ တေလႆႈမီးၼႂ်းဝူင်ႈၵၢင် 0 တေႃႇ 100.", - "COLOUR_BLEND_TITLE": "လေႃးလႄး", - "COLOUR_BLEND_COLOUR1": "သီ 1", - "COLOUR_BLEND_COLOUR2": "သီ 2", - "COLOUR_BLEND_RATIO": "သႅၼ်း", - "COLOUR_BLEND_TOOLTIP": "ဢဝ်သီသွင်ဢၼ်လေႃးၵၼ် ၸွမ်းၼမ် သႅၼ်းဢၼ်ပၼ်ဝႆႉ (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop တႃႇတူင်ႇမူၼ်း", - "CONTROLS_REPEAT_TITLE": "ပၼ်ႇၶိုၼ်း %1 ၵမ်း", - "CONTROLS_REPEAT_INPUT_DO": "ႁဵတ်း", - "CONTROLS_REPEAT_TOOLTIP": "ႁဵတ်းၶေႃႈၵဵပ်းထွၼ်ၵမ်ႈၽွင်ႈ တင်းၼမ်", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ၶၢဝ်းတိုၵ်ႉလိုမ်ႉ", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "တိုၵ်ႉလိုမ်ႉထိုင်", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "ပေႃးဝႃႈ ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) မၢၼ်ႇမႅၼ်ႈယဝ်ႉၸိုင် ႁဵတ်းၶေႃႈၵဵပ်းထွၼ်ၵမ်ႈၽွင်ႈ", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "ပေႃးဝႃႈ ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) ဢမ်ႇမၢၼ်ႇမႅၼ်ႈၸိုင် ႁဵတ်းၶေႃႈၵဵပ်းထွၼ် ၵမ်ႈၽွင်ႈ", - "CONTROLS_FOR_TITLE": "တႄႇဢၢၼ်ႇၵိုၵ်း %1 တေႃႇ %2 တေႃႇ %3 လူၺ်ႈ %4", - "CONTROLS_FOREACH_TITLE": "တႃႇၵူႈဢၼ်ဢၼ် ၼႂ်း %1 သဵၼ်ႈမၢႆ %2", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ဢွၵ်ႇတီႈၶွပ်ႇမူၼ်း", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "သိုပ်ႇပၼ်ႇထႅင်ႈ ၶွပ်ႇမူၼ်းတၢင်ႇဢၼ်", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "ၵိုတ်းပႅတ်ႈ ၶွပ်ႇမူၼ်း ဢၼ်မီးဝႆႉ", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "ဝဵၼ်ႉဝႆႉ ၶွပ်ႇမူၼ်း ဢၼ်ၵိုတ်းၸိူဝ်ႈဝႆႉ, သေ သိုပ်ႇထႅင်ႈတၢင်ႇဢၼ်", - "CONTROLS_FLOW_STATEMENTS_WARNING": "ၾၢင်ႉ: ပလွၵ်ႉဢၼ်ၼႆႉ ၵူၺ်းၸႂ်ႉလူၺ်ႈတႃႇ ၶွပ်ႇမူၼ်းၵူၺ်း", - "CONTROLS_IF_TOOLTIP_1": "ပေႃးဝႃႈ ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) မၢၼ်ႇမႅၼ်ႈယဝ်ႉၸိုင် ႁဵတ်းၶေႃႈၵဵပ်းထွၼ်ၵမ်ႈၽွင်ႈ", - "CONTROLS_IF_TOOLTIP_2": "သင်ဝႃႈ ၵႃႈၶၼ်(ၼမ်ႉၵတ်ႉ)မၢၼ်ႇမႅၼ်ႈၸိုင် ႁဵတ်းပလွၵ်ႉဢွၼ်တၢင်းသုတ်း တီႈၼႂ်းၶေႃႈၵဵပ်းထွၼ်တ။ လိူဝ်သေၼၼ်ႉ ႁဵတ်းပႅတ်ႈ ပလွၵ်ႉသွင် တီႈၼႂ်းၶေႃႈၵဵပ်းထွၼ်", - "CONTROLS_IF_TOOLTIP_3": "သင်ဝႃႈ ၵႃႈၶၼ်(ၼမ်ႉၵတ်ႉ)မၢႉၼိုင်ႈ မၢၼ်ႇမႅၼ်ႈၸိုင် ႁဵတ်းပလွၵ်ႉဢွၼ်တၢင်းသုတ်း တီႈၼႂ်းၶေႃႈၵဵပ်းထွၼ်တ။ သင်ဝႃႈ ၵႃႈၶၼ်(ၼမ်ႉၵတ်ႉ)မၢႆသွင်မၢၼ်ႇမႅၼ်ႈၸိုင် ႁဵတ်းပႅတ်ႈ ပလွၵ်ႉသွင် တီႈၼႂ်းၶေႃႈၵဵပ်းထွၼ်", - "CONTROLS_IF_TOOLTIP_4": "သင်ဝႃႈ ၵႃႈၶၼ်(ၼမ်ႉၵတ်ႉ)မၢႆၼိုင်ႈ မၢၼ်ႇမႅၼ်ႈၸိုင် ႁဵတ်းပလွၵ်ႉဢွၼ်တၢင်းသုတ်း တီႈၼႂ်းၶေႃႈၵဵပ်းထွၼ်တ။ လိူဝ်သေၼၼ်ႉ, သင်ဝႃႈ ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) မၢႆသွင် မၢၼ်ႇမႅၼ်ႈၸိုင် ႁဵတ်းပႅတ်ႈ ပလွၵ်ႉသွင် တီႈၼႂ်းၶေႃႈၵဵပ်းထွၼ်တ။ သင်ဝႃႈ ၵႃႈၶၼ်(ၼမ်ႉၵတ်ႉ) ဢမ်ႇမီးလွင်ႈမၢၼ်ႇမႅၼ်ႈ သင်ၸိုင် ႁဵတ်းပႅတ်ႈပလွၵ်ႉ ၵမ်းလိုမ်း တီႈၼႂ်းၶေႃႈၵဵပ်းထွၼ်တ။", - "CONTROLS_IF_MSG_IF": "သင်ဝႃႈ", - "CONTROLS_IF_MSG_ELSEIF": "သင်ဝႃႈ လိူဝ်သေၼၼ်ႉ", - "CONTROLS_IF_MSG_ELSE": "လိူဝ်သေၼၼ်ႉ", - "CONTROLS_IF_ELSEIF_TOOLTIP": "သင်ဝႃႈ ပလွၵ်ႉၸိုင် သႂ်ႇပၼ်လွင်ႈတၢင်းမၼ်း တမ်ႈ", - "CONTROLS_IF_ELSE_TOOLTIP": "သႂ်ႇၵမ်းလိုၼ်း, သင်ဝႃႈ ပလွၵ်ႉၸိုင် ဢဝ်လွင်ႈတၢင်းမၼ်းတင်းသဵင်ႈ တမ်ႈ", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(ပၢႆးၼပ်ႉ)", - "LOGIC_COMPARE_TOOLTIP_EQ": "သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ တင်းသွင် မိူၼ်တၢင်ႇဢၼ်ၸိုင် မႄးၶိုၼ်း ႁႂ်ႈမၢၼ်ႇမႅၼ်ႈ", - "LOGIC_COMPARE_TOOLTIP_NEQ": "သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ တင်းသွင် ဢမ်ႇမိူၼ်တၢင်ႇဢၼ်ၸိုင် မႄးၶိုၼ်း ႁႂ်ႈမၢၼ်ႇမႅၼ်ႈ", - "LOGIC_COMPARE_TOOLTIP_LT": "သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ ဢွၼ်တၢင်း မိူၼ် ဢၼ်ၽိူမ်ႉသႂ်ႇ မၢႆသွင်ၸိုင် မႄးၶိုၼ်း ႁႂ်ႈမၢၼ်ႇမႅၼ်ႈ", - "LOGIC_COMPARE_TOOLTIP_LTE": "သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ ဢွၼ်တၢင်း မိူၼ် ဢမ်ႇၼၼ် ၽဵင်ႇပဵင်း ဢၼ်ၽိူမ်ႉသႂ်ႇ မၢႆသွင်ၸိုင် မႄးၶိုၼ်း ႁႂ်ႈမၢၼ်ႇမႅၼ်ႈ", - "LOGIC_COMPARE_TOOLTIP_GT": "သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ ဢွၼ်တၢင်း ယႂ်ႇလိူဝ် ဢၼ်ၽိူမ်ႉသႂ်ႇ မၢႆသွင်ၸိုင် မႄးၶိုၼ်း ႁႂ်ႈမၢၼ်ႇမႅၼ်ႈ", - "LOGIC_COMPARE_TOOLTIP_GTE": "သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ ဢွၼ်တၢင်း ယႂ်ႇလိူဝ် ဢမ်ႇၼၼ် ၽဵင်ႇပဵင်း ဢၼ်ၽိူမ်ႉသႂ်ႇ မၢႆသွင်ၸိုင် မႄးၶိုၼ်း ႁႂ်ႈမၢၼ်ႇမႅၼ်ႈ", - "LOGIC_OPERATION_TOOLTIP_AND": "သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ တင်းသွင်ဢၼ် မၢၼ်ႇမႅၼ်ႈၸိုင်ၸိုင် မႄးၶိုၼ်း ႁႂ်ႈမၢၼ်ႇမႅၼ်ႈ", - "LOGIC_OPERATION_AND": "လႄႈ", - "LOGIC_OPERATION_TOOLTIP_OR": "သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ ၵမ်းလိုၼ်းသုတ်း မၢၼ်ႇမႅၼ်ႈၸိုင် မႄးၶိုၼ်း ႁႂ်ႈမၢၼ်ႇမႅၼ်ႈ", - "LOGIC_OPERATION_OR": "ဢမ်ႇၼၼ်", - "LOGIC_NEGATE_TITLE": "ဢမ်ႇၸႂ်ႈ %1", - "LOGIC_NEGATE_TOOLTIP": "သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ ဢမ်ႇၼႅၼ်ႈၼႃၸိုင် မႄးၶိုၼ်း ႁႂ်ႈမၢၼ်ႇမႅၼ်ႈ။ သင်ဝႃႈ ဢၼ်ၽိူမ်ႉသႂ်ႇ မၢၼ်ႇမႅၼ်ႈၸိုင် ၶိုၼ်းမူၼ်ႉမႄး ႁႂ်ႈၼႅၼ်ႈၼႃ", - "LOGIC_BOOLEAN_TRUE": "မၢၼ်ႇမႅၼ်ႈ", - "LOGIC_BOOLEAN_FALSE": "ဢမ်ႇၼႅၼ်ႈၼႃ", - "LOGIC_BOOLEAN_TOOLTIP": "မၢၼ်ႇမႅၼ်ႈလႄႈသင် ဢမ်ႇၼႅၼ်ႈၼႃလႄႈသင် ႁူၼ်ၶိုၼ်း", - "LOGIC_NULL": "ဢမ်ႇၶဝ်ႈၶႂၢင်ႇ", - "LOGIC_NULL_TOOLTIP": "လဵဝ်ၶိုၼ်း ဢမ်ႇၶဝ်ႈၶႂၢင်ႇ", - "LOGIC_TERNARY_CONDITION": "ၸၢမ်း", - "LOGIC_TERNARY_IF_TRUE": "သင်ဝႃႈ မၢၼ်ႇမႅၼ်ႈ", - "LOGIC_TERNARY_IF_FALSE": "သင်ဝႃႈ ဢမ်ႇၼႅၼ်ႈၼႃ", - "LOGIC_TERNARY_TOOLTIP": "ၸၢမ်းၵူတ်ႇတူၺ်း သၢႆငၢႆ။ သင်ဝႃႈ သၢႆငၢႆမၢၼ်ႇမႅၼ်ႈ, လဵဝ်ၶိုၼ်း ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) 'သင်မၢၼ်ႇမႅၼ်ႈ'; လိူဝ်ၼၼ်ႉ လဵဝ်ၶိုၼ်း ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) 'သင်ဢမ်ႇၼႅၼ်ႈၼႃ'။", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/မၢႆၼပ်ႉ", - "MATH_NUMBER_TOOLTIP": "မၢႆၼပ်ႉ ၼိုင်ႈဢၼ်", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/ပၢႆးၼပ်ႉ", - "MATH_ARITHMETIC_TOOLTIP_ADD": "လဵဝ်ၶိုၼ်း တၢင်းၼမ် ၼႂ်းမၢႆၼပ်ႉ သွင်", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "လဵဝ်ၶိုၼ်း ဢၼ်ပႅၵ်ႇပိူင်ႈ ၼႂ်းမၢႆၼပ်ႉ သွင်", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "လဵဝ်ၶိုၼ်း ဢၼ်ဢဝ်ဢွၵ်ႇ ၼႂ်းမၢႆၼပ်ႉ သွင်", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "လဵဝ်ၶိုၼ်း ပမႃႇၼ ၼႂ်းမၢႆၼပ်ႉ သွင်", - "MATH_ARITHMETIC_TOOLTIP_POWER": "လဵဝ်ၶိုၼ်း တူဝ်ၼပ်ႉမၢႆၼိုင်ႈၼႆႉ ၸွႆႈႁႅင်းပၼ် တူဝ်ၼပ်ႉမၢႆသွင်", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root (မၢႆတူပ်ႉမိူၼ်)", - "MATH_SINGLE_OP_ROOT": "မၢႆတူပ်ႉမိူၼ်", - "MATH_SINGLE_TOOLTIP_ROOT": "လဵဝ်ၶိုၼ်း မၢႆတူပ်ႉမိူၼ် ၼႂ်းမၢႆၼပ်ႉ", - "MATH_SINGLE_OP_ABSOLUTE": "ပၵတိ", - "MATH_SINGLE_TOOLTIP_ABS": "လဵဝ်ၶိုၼ်း ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) ပၵတိ ၼႂ်းမၢႆၼပ်ႉ", - "MATH_SINGLE_TOOLTIP_NEG": "လဵဝ်ၶိုၼ်း ဢၼ်သၢၼ်ၶတ်း ၼႂ်း မၢႆၼပ်ႉ", - "MATH_SINGLE_TOOLTIP_LN": "လဵဝ်ၶိုၼ်း လွၵ်းလၢႆးၼပ်ႉ ၼႂ်းမၢႆၼပ်ႉ", - "MATH_SINGLE_TOOLTIP_LOG10": "လဵဝ်ၶိုၼ်း ပိုၼ်ႉထၢၼ် 10 လွၵ်းလၢႆးၼပ်ႉ ၼႂ်းမၢႆၼပ်ႉ", - "MATH_SINGLE_TOOLTIP_EXP": "လဵဝ်ၶိုၼ်း e ၵႂႃႇတီႈ ပႃႇဝႃႇ ၼႂ်းမၢႆၼပ်ႉ", - "MATH_SINGLE_TOOLTIP_POW10": "လဵဝ်ၶိုၼ်း 10 ၵႂႃႇတီႈ ပႃႇဝႃႇ ၼႂ်းမၢႆၼပ်ႉ", - "MATH_IS_EVEN": "ပဵၼ်ၵူပ်ႉ", - "MATH_IS_ODD": "ပဵၼ်ၵိၵ်ႈ" -} diff --git a/msg/json/sk.json b/msg/json/sk.json deleted file mode 100644 index c4f920cbaf..0000000000 --- a/msg/json/sk.json +++ /dev/null @@ -1,305 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Jaroslav.micek", - "Marian.stano", - "Mark" - ] - }, - "VARIABLES_DEFAULT_NAME": "prvok", - "TODAY": "Dnes", - "DUPLICATE_BLOCK": "Duplikovať", - "ADD_COMMENT": "Pridať komentár", - "REMOVE_COMMENT": "Odstrániť komentár", - "EXTERNAL_INPUTS": "Vonkajšie vstupy", - "INLINE_INPUTS": "Riadkové vstupy", - "DELETE_BLOCK": "Odstrániť blok", - "DELETE_X_BLOCKS": "Odstrániť %1 blokov", - "DELETE_ALL_BLOCKS": "Zmazať všetkých %1 dielcov?", - "COLLAPSE_BLOCK": "Zvinúť blok", - "COLLAPSE_ALL": "Zvinúť bloky", - "EXPAND_BLOCK": "Rozvinúť blok", - "EXPAND_ALL": "Rozvinúť bloky", - "DISABLE_BLOCK": "Vypnúť blok", - "ENABLE_BLOCK": "Povoliť blok", - "HELP": "Pomoc", - "CHAT": "Písaním do tohto políčka komunikujte so spolupracovníkmi!", - "AUTH": "Autorizujte prosím túto aplikáciu, aby ste mohli uložiť a zdieľať vašu prácu.", - "ME": "Ja", - "CHANGE_VALUE_TITLE": "Zmeniť hodnotu:", - "NEW_VARIABLE": "Nová premenná...", - "NEW_VARIABLE_TITLE": "Názov novej premennej:", - "RENAME_VARIABLE": "Premenovať premennú...", - "RENAME_VARIABLE_TITLE": "Premenovať všetky premenné '%1' na:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Zvoľte farbu z palety.", - "COLOUR_RANDOM_TITLE": "náhodná farba", - "COLOUR_RANDOM_TOOLTIP": "Zvoliť farbu náhodne.", - "COLOUR_RGB_TITLE": "ofarbiť s", - "COLOUR_RGB_RED": "červená", - "COLOUR_RGB_GREEN": "zelená", - "COLOUR_RGB_BLUE": "modrá", - "COLOUR_RGB_TOOLTIP": "Vytvoriť farbu pomocou zadaného množstva červenej, zelenej a modrej. Množstvo musí byť medzi 0 a 100.", - "COLOUR_BLEND_TITLE": "zmiešať", - "COLOUR_BLEND_COLOUR1": "farba 1", - "COLOUR_BLEND_COLOUR2": "farba 2", - "COLOUR_BLEND_RATIO": "pomer", - "COLOUR_BLEND_TOOLTIP": "Zmieša dve farby v danom pomere (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "opakuj %1 krát", - "CONTROLS_REPEAT_INPUT_DO": "rob", - "CONTROLS_REPEAT_TOOLTIP": "Opakuj určité príkazy viackrát.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "opakuj kým", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "opakuj kým nebude", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Kým je hodnota pravdivá, vykonávaj príkazy.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Kým je hodnota nepravdivá, vykonávaj príkazy.", - "CONTROLS_FOR_TOOLTIP": "Nechá premennú '%1' nadobúdať hodnoty od začiatočného čísla po konečné s daným medzikrokom a vykoná zadané bloky.", - "CONTROLS_FOR_TITLE": "počítať s %1 od %2 do %3 o %4", - "CONTROLS_FOREACH_TITLE": "pre každý prvok %1 v zozname %2", - "CONTROLS_FOREACH_TOOLTIP": "Pre každý prvok v zozname priraď jeho hodnotu do premenej '%1' a vykonaj príkazy.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "opustiť slučku", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "prejdi na nasledujúce opakovanie slučky", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Opustiť túto slučku.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Vynechať zvyšok tejto slučky a pokračovať ďalším opakovaním.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Upozornenie: Tento blok sa môže používať len v rámci slučky.", - "CONTROLS_IF_TOOLTIP_1": "Ak je hodnota pravda, vykonaj príkazy.", - "CONTROLS_IF_TOOLTIP_2": "Ak je hodnota pravda, vykonaj príkazy v prvom bloku. Inak vykonaj príkazy v druhom bloku.", - "CONTROLS_IF_TOOLTIP_3": "Ak je prvá hodnota pravda, vykonaj príkazy v prvom bloku. Inak, ak je druhá hodnota pravda, vykonaj príkazy v druhom bloku.", - "CONTROLS_IF_TOOLTIP_4": "Ak je prvá hodnota pravda, vykonaj príkazy v prvom bloku. Inak, ak je druhá hodnota pravda, vykonaj príkazy v druhom bloku. Ak ani jedna hodnota nie je pravda, vykonaj príkazy v poslednom bloku.", - "CONTROLS_IF_MSG_IF": "ak", - "CONTROLS_IF_MSG_ELSEIF": "inak ak", - "CONTROLS_IF_MSG_ELSE": "inak", - "CONTROLS_IF_IF_TOOLTIP": "Pridať, odstrániť alebo zmeniť poradie oddielov tohto \"ak\" bloku.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Pridať podmienku k \"ak\" bloku.", - "CONTROLS_IF_ELSE_TOOLTIP": "Pridať poslednú záchytnú podmienku k \"ak\" bloku.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Vráť hodnotu pravda, ak sú vstupy rovnaké.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Vráť hodnotu pravda, ak vstupy nie sú rovnaké.", - "LOGIC_COMPARE_TOOLTIP_LT": "Vráť hodnotu pravda, ak prvý vstup je menší než druhý.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Vráť hodnotu pravda ak prvý vstup je menší alebo rovný druhému.", - "LOGIC_COMPARE_TOOLTIP_GT": "Vráť hodnotu pravda ak prvý vstup je väčší než druhý.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Vráť hodnotu pravda ak prvý vstup je väčší alebo rovný druhému.", - "LOGIC_OPERATION_TOOLTIP_AND": "Vráť hodnotu pravda, ak sú vstupy pravdivé.", - "LOGIC_OPERATION_AND": "a", - "LOGIC_OPERATION_TOOLTIP_OR": "Vráť hodnotu pravda, ak je aspoň jeden vstup pravda.", - "LOGIC_OPERATION_OR": "alebo", - "LOGIC_NEGATE_TITLE": "nie je %1", - "LOGIC_NEGATE_TOOLTIP": "Vráti hodnotu pravda, ak je vstup nepravda. Vráti hodnotu nepravda ak je vstup pravda.", - "LOGIC_BOOLEAN_TRUE": "pravda", - "LOGIC_BOOLEAN_FALSE": "nepravda", - "LOGIC_BOOLEAN_TOOLTIP": "Vráť buď hodnotu pravda alebo nepravda.", - "LOGIC_NULL": "nič", - "LOGIC_NULL_TOOLTIP": "Vráti hodnotu nula.", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "ak pravda", - "LOGIC_TERNARY_IF_FALSE": "ak nepravda", - "LOGIC_TERNARY_TOOLTIP": "Skontroluj podmienku testom. Ak je podmienka pravda, vráť hodnotu \"ak pravda\", inak vráť hodnotu \"ak nepravda\".", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Číslo.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Vráť súčet dvoch čísel.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vráť rozdiel dvoch čísel.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Vráť súčin dvoch čísel.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Vráť podiel dvoch čísel.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Vráť prvé číslo umocnené druhým.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "druhá odmocnina", - "MATH_SINGLE_TOOLTIP_ROOT": "Vráť druhú odmocninu čísla.", - "MATH_SINGLE_OP_ABSOLUTE": "absolútna hodnota", - "MATH_SINGLE_TOOLTIP_ABS": "Vráť absolútnu hodnotu čísla.", - "MATH_SINGLE_TOOLTIP_NEG": "Vráť opačné číslo.", - "MATH_SINGLE_TOOLTIP_LN": "Vráť prirodzený logaritmus čísla.", - "MATH_SINGLE_TOOLTIP_LOG10": "Vráť logaritmus čísla so základom 10.", - "MATH_SINGLE_TOOLTIP_EXP": "Vráť e umocnené číslom.", - "MATH_SINGLE_TOOLTIP_POW10": "Vráť 10 umocnené číslom.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Vráť sínus uhla (v stupňoch).", - "MATH_TRIG_TOOLTIP_COS": "Vráť kosínus uhla (v stupňoch).", - "MATH_TRIG_TOOLTIP_TAN": "Vráť tangens uhla (v stupňoch).", - "MATH_TRIG_TOOLTIP_ASIN": "Vráť arkus sínus čísla.", - "MATH_TRIG_TOOLTIP_ACOS": "Vráť arkus kosínus čísla.", - "MATH_TRIG_TOOLTIP_ATAN": "Vráť arkus tangens čísla.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant‎", - "MATH_CONSTANT_TOOLTIP": "Vráť jednu zo zvyčajných konštánt: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), alebo ∞ (nekonečno).", - "MATH_IS_EVEN": "je párne", - "MATH_IS_ODD": "je nepárne", - "MATH_IS_PRIME": "je prvočíslo", - "MATH_IS_WHOLE": "je celé číslo", - "MATH_IS_POSITIVE": "je kladné", - "MATH_IS_NEGATIVE": "je záporné", - "MATH_IS_DIVISIBLE_BY": "je deliteľné", - "MATH_IS_TOOLTIP": "Skontroluj či je číslo párne, nepárne, celé, kladné, záporné alebo deliteľné určitým číslom. Vráť hodnotu pravda alebo nepravda.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "zmeniť %1 o %2", - "MATH_CHANGE_TOOLTIP": "Pridaj číslo do premennej \"%1\".", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Zaokrúhli číslo nahor alebo nadol.", - "MATH_ROUND_OPERATOR_ROUND": "zaokrúhli", - "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrúhli nahor", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokrúhli nadol", - "MATH_ONLIST_OPERATOR_SUM": "súčet zoznamu", - "MATH_ONLIST_TOOLTIP_SUM": "Vráť súčet všetkých čísel v zozname.", - "MATH_ONLIST_OPERATOR_MIN": "najmenšie v zozname", - "MATH_ONLIST_TOOLTIP_MIN": "Vrátiť najmenšie číslo v zozname.", - "MATH_ONLIST_OPERATOR_MAX": "najväčšie v zozname", - "MATH_ONLIST_TOOLTIP_MAX": "Vrátiť najväčšie číslo v zozname.", - "MATH_ONLIST_OPERATOR_AVERAGE": "priemer zoznamu", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Vráť aritmetický priemer čísel v zozname.", - "MATH_ONLIST_OPERATOR_MEDIAN": "medián zoznamu", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Vráť medián čísel v zozname.", - "MATH_ONLIST_OPERATOR_MODE": "najčastejšie v zozname", - "MATH_ONLIST_TOOLTIP_MODE": "Vrátiť najčastejší prvok v zozname.", - "MATH_ONLIST_OPERATOR_STD_DEV": "smerodajná odchýlka zoznamu", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Vráť smeroddajnú odchýlku zoznamu.", - "MATH_ONLIST_OPERATOR_RANDOM": "náhodný prvok zoznamu", - "MATH_ONLIST_TOOLTIP_RANDOM": "Vráť náhodne zvolený prvok zoznamu.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "zvyšok po delení %1 + %2", - "MATH_MODULO_TOOLTIP": "Vráť zvyšok po delení jedného čísla druhým.", - "MATH_CONSTRAIN_TITLE": "obmedz %1 od %2 do %3", - "MATH_CONSTRAIN_TOOLTIP": "Obmedzí číslo do zadaných hraníc (vrátane).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "náhodné celé číslo od %1 do %2", - "MATH_RANDOM_INT_TOOLTIP": "Vráť náhodné celé číslo z určeného intervalu (vrátane).", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "náhodné číslo od 0 do 1", - "MATH_RANDOM_FLOAT_TOOLTIP": "Vráť náhodné číslo z intervalu 0.0 (vrátane) až 1.0.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Písmeno, slovo alebo riadok textu.", - "TEXT_JOIN_TITLE_CREATEWITH": "vytvor text z", - "TEXT_JOIN_TOOLTIP": "Vytvor text spojením určitého počtu prvkov.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "spoj", - "TEXT_CREATE_JOIN_TOOLTIP": "Pridaj, odstráň alebo zmeň poradie oddielov v tomto textovom bloku.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Pridaj prvok do textu.", - "TEXT_APPEND_TO": "do", - "TEXT_APPEND_APPENDTEXT": "pridaj text", - "TEXT_APPEND_TOOLTIP": "Pridaj určitý text do premennej '%1'.", - "TEXT_LENGTH_TITLE": "dĺžka %1", - "TEXT_LENGTH_TOOLTIP": "Vráti počet písmen (s medzerami) v zadanom texte.", - "TEXT_ISEMPTY_TITLE": "%1 je prázdny", - "TEXT_ISEMPTY_TOOLTIP": "Vráti hodnotu pravda, ak zadaný text je prázdny.", - "TEXT_INDEXOF_TOOLTIP": "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti 0.", - "TEXT_INDEXOF_INPUT_INTEXT": "v texte", - "TEXT_INDEXOF_OPERATOR_FIRST": "nájdi prvý výskyt textu", - "TEXT_INDEXOF_OPERATOR_LAST": "nájdi posledný výskyt textu", - "TEXT_CHARAT_INPUT_INTEXT": "v texte", - "TEXT_CHARAT_FROM_START": "zisti písmeno #", - "TEXT_CHARAT_FROM_END": "zisti # písmeno od konca", - "TEXT_CHARAT_FIRST": "zisti prvé písmeno", - "TEXT_CHARAT_LAST": "zisti posledné písmeno", - "TEXT_CHARAT_RANDOM": "vyber náhodné písmeno", - "TEXT_CHARAT_TOOLTIP": "Vráti písmeno na určenej pozícii.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Vráti určenú časť textu.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "v texte", - "TEXT_GET_SUBSTRING_START_FROM_START": "vyber podreťazec od písmena #", - "TEXT_GET_SUBSTRING_START_FROM_END": "vyber podreťazec od # písmena od konca", - "TEXT_GET_SUBSTRING_START_FIRST": "vyber podreťazec od začiatku", - "TEXT_GET_SUBSTRING_END_FROM_START": "po písmeno #", - "TEXT_GET_SUBSTRING_END_FROM_END": "po # písmeno od konca", - "TEXT_GET_SUBSTRING_END_LAST": "po koniec", - "TEXT_CHANGECASE_TOOLTIP": "Vráť kópiu textu s inou veľkosťou písmen.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "na VEĽKÉ PÍSMENÁ", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "na malé písmená", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "na Veľké Začiatočné Písmená", - "TEXT_TRIM_TOOLTIP": "Vráť kópiu textu bez medzier na jednom alebo oboch koncoch.", - "TEXT_TRIM_OPERATOR_BOTH": "odstráň medzery z oboch strán", - "TEXT_TRIM_OPERATOR_LEFT": "odstráň medzery z ľavej strany", - "TEXT_TRIM_OPERATOR_RIGHT": "odstráň medzery z pravej strany", - "TEXT_PRINT_TITLE": "píš %1", - "TEXT_PRINT_TOOLTIP": "Napíš zadaný text, číslo alebo hodnotu.", - "TEXT_PROMPT_TYPE_TEXT": "výzva za zadanie textu so správou", - "TEXT_PROMPT_TYPE_NUMBER": "výzva na zadanie čísla so správou", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Výzva pre používateľa na zadanie čísla.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Výzva pre používateľa na zadanie textu.", - "LISTS_CREATE_EMPTY_TITLE": "prázdny zoznam", - "LISTS_CREATE_EMPTY_TOOLTIP": "Vráti zoznam nulovej dĺžky, ktorý neobsahuje žiadne prvky.", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Vytvor zoznam s ľubovoľným počtom prvkov.", - "LISTS_CREATE_WITH_INPUT_WITH": "vytvor zoznam s", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "zoznam", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Pridaj, odstráň alebo zmeň poradie v tomto zoznamovom bloku.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Pridaj prvok do zoznamu.", - "LISTS_REPEAT_TOOLTIP": "Vytvorí zoznam s niekoľkými rovnakými prvkami s danou hodnotou.", - "LISTS_REPEAT_TITLE": "vytvor zoznam s prvkom %1 opakovaným %2 krát", - "LISTS_LENGTH_TITLE": "dĺžka %1", - "LISTS_LENGTH_TOOLTIP": "Vráti dĺžku zoznamu", - "LISTS_ISEMPTY_TITLE": "%1 je prázdny", - "LISTS_ISEMPTY_TOOLTIP": "Vráti pravda, ak je zoznam prázdny.", - "LISTS_INLIST": "v zozname", - "LISTS_INDEX_OF_FIRST": "nájdi prvý výskyt prvku", - "LISTS_INDEX_OF_LAST": "nájdi posledný výskyt prvku", - "LISTS_INDEX_OF_TOOLTIP": "Vráti index prvého/posledného výskytu prvku v zozname. Ak nenašiel, vráti 0.", - "LISTS_GET_INDEX_GET": "zisti", - "LISTS_GET_INDEX_GET_REMOVE": "zisti a odstráň", - "LISTS_GET_INDEX_REMOVE": "odstráň", - "LISTS_GET_INDEX_FROM_END": "# od konca", - "LISTS_GET_INDEX_FIRST": "prvý", - "LISTS_GET_INDEX_LAST": "posledný", - "LISTS_GET_INDEX_RANDOM": "náhodný", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Vráti prvok na určenej pozícii v zozname. #1 je počiatočný prvok.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Vráti prvok na určenej pozícii v zozname. #1 je posledný prvok.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vráti počiatočný prvok zoznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vráti posledný prvok zoznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vráti náhodný prvok zoznamu.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Odstráni a vráti prvok z určenej pozície v zozname. #1 je prvý prvok.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Odstráni a vráti prvok z určenej pozície v zozname. #1 je posledný prvok.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Odstráni a vráti prvý prvok v zozname.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Odstráni a vráti posledný prvok v zozname.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Odstráni a vráti náhodný prvok v zozname.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Odstráni prvok na určenej pozícii v zozname. #1 je prvý prvok.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Odstráni prvok na určenej pozícii v zozname. #1 je posledný prvok.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstráni prvý prvok v zozname.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstráni posledný prvok v zozname.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstráni náhodný prvok v zozname.", - "LISTS_SET_INDEX_SET": "nastaviť", - "LISTS_SET_INDEX_INSERT": "vložiť na", - "LISTS_SET_INDEX_INPUT_TO": "ako", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Nastaví prvok na určenej pozícii v zozname. #1 je prvý prvok.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Nastaví prvok na určenej pozícii v zozname. #1 je posledný prvok.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Nastaví prvý prvok v zozname.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Nastaví posledný prvok v zozname.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Nastaví posledný prvok v zozname.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Vsunie prvok na určenú pozíciu v zozname. #1 je prvý prvok.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Vsunie prvok na určenú pozíciu v zozname. #1 je posledný prvok.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vsunie prvok na začiatok zoznamu.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Pripojí prvok na koniec zoznamu.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Vsunie prvok na náhodné miesto v zozname.", - "LISTS_GET_SUBLIST_START_FROM_START": "získať podzoznam od #", - "LISTS_GET_SUBLIST_START_FROM_END": "Získať podzoznam od # od konca", - "LISTS_GET_SUBLIST_START_FIRST": "Získať podzoznam od začiatku", - "LISTS_GET_SUBLIST_END_FROM_START": "po #", - "LISTS_GET_SUBLIST_END_FROM_END": "po # od konca", - "LISTS_GET_SUBLIST_END_LAST": "po koniec", - "LISTS_GET_SUBLIST_TOOLTIP": "Skopíruje určený úsek zoznamu.", - "LISTS_SPLIT_LIST_FROM_TEXT": "vytvoriť zoznam z textu", - "LISTS_SPLIT_TEXT_FROM_LIST": "vytvoriť text zo zoznamu", - "LISTS_SPLIT_WITH_DELIMITER": "s oddeľovačom", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Rozdelenie textu do zoznamu textov, lámanie na oddeľovačoch.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Spojiť zoznam textov do jedného textu s oddeľovačmi.", - "VARIABLES_GET_TOOLTIP": "Vráti hodnotu tejto premennej.", - "VARIABLES_GET_CREATE_SET": "Vytvoriť \"nastaviť %1\"", - "VARIABLES_SET": "nastaviť %1 na %2", - "VARIABLES_SET_TOOLTIP": "Nastaví túto premennú, aby sa rovnala vstupu.", - "VARIABLES_SET_CREATE_GET": "Vytvoriť \"získať %1\"", - "PROCEDURES_DEFNORETURN_TITLE": "na", - "PROCEDURES_DEFNORETURN_PROCEDURE": "urob niečo", - "PROCEDURES_BEFORE_PARAMS": "s:", - "PROCEDURES_CALL_BEFORE_PARAMS": "s:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Vytvorí funciu bez výstupu.", - "PROCEDURES_DEFRETURN_RETURN": "vrátiť", - "PROCEDURES_DEFRETURN_TOOLTIP": "Vytvorí funkciu s výstupom.", - "PROCEDURES_ALLOW_STATEMENTS": "povoliť príkazy", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Upozornenie: Táto funkcia má duplicitné parametre.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Spustí používateľom definovanú funkciu '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Spustí používateľom definovanú funkciu '%1' a použije jej výstup.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "vstupy", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Pridať, odstrániť alebo zmeniť poradie vstupov tejto funkcie.", - "PROCEDURES_MUTATORARG_TITLE": "názov vstupu:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Pridať vstup do funkcie.", - "PROCEDURES_HIGHLIGHT_DEF": "Zvýrazniť definíciu funkcie", - "PROCEDURES_CREATE_DO": "Vytvoriť '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Ak je hodnota pravda, tak vráti druhú hodnotu.", - "PROCEDURES_IFRETURN_WARNING": "Upozornenie: Tento blok môže byť len vo vnútri funkcie." -} diff --git a/msg/json/sq.json b/msg/json/sq.json deleted file mode 100644 index 74b05558e9..0000000000 --- a/msg/json/sq.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "@metadata": { - "authors": [ - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "send", - "DUPLICATE_BLOCK": "Kopjo", - "ADD_COMMENT": "Vendos nje Koment", - "REMOVE_COMMENT": "Fshij komentin", - "EXTERNAL_INPUTS": "Hyrjet e jashtme", - "INLINE_INPUTS": "Hyrjet e brendshme", - "DELETE_BLOCK": "Fshij bllokun", - "DELETE_X_BLOCKS": "Fshij %1 blloqe", - "COLLAPSE_BLOCK": "Mbyll bllokun", - "COLLAPSE_ALL": "Mbyll blloqet", - "EXPAND_BLOCK": "Zmadho bllokun", - "EXPAND_ALL": "Zmadho blloqet", - "DISABLE_BLOCK": "Çaktivizo bllokun", - "ENABLE_BLOCK": "Aktivizo bllokun", - "HELP": "Ndihmë", - "CHANGE_VALUE_TITLE": "Ndrysho Vlerat:", - "NEW_VARIABLE": "Identifikatorë i ri...", - "NEW_VARIABLE_TITLE": "Emri i identifikatorit të ri:", - "RENAME_VARIABLE": "Ndrysho emrin variables...", - "RENAME_VARIABLE_TITLE": "Ndrysho emrin e te gjitha '%1' variablave ne :", - "COLOUR_PICKER_HELPURL": "http://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Zgjidh nje ngjyre nga nje game ngjyrash.", - "COLOUR_RANDOM_TITLE": "ngjyre e rastesishme", - "COLOUR_RANDOM_TOOLTIP": "Zgjidhni një ngjyrë në mënyrë të rastësishme.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "ngjyre me", - "COLOUR_RGB_RED": "e kuqe", - "COLOUR_RGB_GREEN": "jeshile", - "COLOUR_RGB_BLUE": "blu", - "COLOUR_RGB_TOOLTIP": "Krijo një ngjyrë me shumën e specifikuar te te kuqes, te gjelbëres, dhe bluse. Te gjitha vlerat duhet te jene mes 0 dhe 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "Përzierje", - "COLOUR_BLEND_COLOUR1": "Ngjyra 1", - "COLOUR_BLEND_COLOUR2": "Ngjyra 2", - "COLOUR_BLEND_RATIO": "Perpjesetim", - "COLOUR_BLEND_TOOLTIP": "Perzien dy ngjyra së bashku me një raport të dhënë (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "http://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "përsërit %1 herë", - "CONTROLS_REPEAT_INPUT_DO": "ekzekuto", - "CONTROLS_REPEAT_TOOLTIP": "Ekzekuto disa fjali disa herë.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "përsërit përderisa", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "përsërit derisa", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Përderisa një vlerë është e saktë, atëherë ekzekuto disa fjali.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Përderisa një vlerë është e pasaktë, atëherë ekzekuto disa fjali.", - "CONTROLS_FOR_TOOLTIP": "Bëje identifikuesin \"%1\" që ta ketë vlerat prej numrit të fillimit deri tek numri i fundit, duke numëruar nga intervali i specifikuar, dhe ti bëj blloqet e specifikuara.", - "CONTROLS_FOR_TITLE": "numero me %1 nga %2 ne %3 me nga %4", - "CONTROLS_FOREACH_TITLE": "per cdo produkt %1 ne liste %2", - "CONTROLS_FOREACH_TOOLTIP": "Per cdo produkt ne nje \"liste\" \"vendos\" ndryshoren '%1' produktit, dhe pastaj bej disa deklarata.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "dil nga nje faze perseritese", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "vazhdo me elementin tjeter te nje faze perseritese", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Ndahu nga unaza.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Kapërce pjesën e mbetur të unazës, dhe vazhdo me ripërsëritjen tjetër.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Paralajmërim: Ky bllok mund të përdoret vetëm brenda unazës.", - "CONTROLS_IF_TOOLTIP_1": "Nëse një vlerë është e saktë, atëherë ekzekuto disa fjali.", - "CONTROLS_IF_TOOLTIP_2": "Nëse një vlerë është e saktë, atëherë ekzekuto bllokun e parë të fjalive. Përndryshe, ekzekuto bllokun e dytë të fjalive.", - "CONTROLS_IF_TOOLTIP_3": "Nëse vlera e parë është e saktë, atëherë ekzekuto bllokun e parë të fjalive. Përndryshe, nëse vlera e dytë është e saktë, ekzekuto bllokun e dytë të fjalive.", - "CONTROLS_IF_TOOLTIP_4": "Nëse vlera e parë është e saktë, atëherë ekzekuto bllokun e parë të fjalive. Përndryshe, nëse vlera e dytë është e saktë, ekzekuto bllokun e dytë të fjalive. Nëse asnjëra nga vlerat nuk është e saktë, ekzekuto bllokun e fundit të fjalive.", - "CONTROLS_IF_MSG_IF": "nëse", - "CONTROLS_IF_MSG_ELSEIF": "përndryshe nëse", - "CONTROLS_IF_MSG_ELSE": "përndryshe", - "CONTROLS_IF_IF_TOOLTIP": "Shto, fshij, ose rirregullo sektoret për ta rikonfiguruar këte bllok nëse.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "\"Vendos\" \"kushtein\"tek \"pjesa\" \"if\"", - "CONTROLS_IF_ELSE_TOOLTIP": "Shto një përfundues, që i mbërrin të gjitha kushtet në bllokun nëse.", - "LOGIC_COMPARE_HELPURL": "http://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Ktheje të saktë nëse të dy hyrjet janë të barabarta me njëra-tjetrën.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Ktheje të saktë nëse të dy hyrjet nuk janë të barabarta me njëra-tjetrën.", - "LOGIC_COMPARE_TOOLTIP_LT": "Ktheje të saktë nëse hyrja e parë është më e vogël se hyrja e dytë.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Ktheje të saktë nëse hyrja e parë është më e vogël ose e barabartë me hyrjen e dytë.", - "LOGIC_COMPARE_TOOLTIP_GT": "Ktheje të saktë nëse hyrja e parë është më e madhe se hyrja e dytë.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Ktheje të saktë nëse hyrja e parë është më e madhe ose e barabartë me hyrjen e dytë.", - "LOGIC_OPERATION_TOOLTIP_AND": "Kthehet të saktë nëse të dy hyrjet janë të sakta.", - "LOGIC_OPERATION_AND": "dhe", - "LOGIC_OPERATION_TOOLTIP_OR": "Kthehet e saktë nëse së paku njëra nga hyrjet është e saktë.", - "LOGIC_OPERATION_OR": "ose", - "LOGIC_NEGATE_TITLE": "jo %1", - "LOGIC_NEGATE_TOOLTIP": "Kthehet e saktë nëse hyrja është e pasaktë. Kthehet e pasaktë nëse hyrja është e saktë.", - "LOGIC_BOOLEAN_TRUE": "e saktë", - "LOGIC_BOOLEAN_FALSE": "e pasaktë", - "LOGIC_BOOLEAN_TOOLTIP": "Kthehet ose të saktë ose të pasaktë.", - "LOGIC_NULL_HELPURL": "http://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "pavlerë", - "LOGIC_NULL_TOOLTIP": "Kthehet e pavlerë.", - "LOGIC_TERNARY_HELPURL": "http://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "nëse e saktë", - "LOGIC_TERNARY_IF_FALSE": "nëse e pasaktë", - "LOGIC_TERNARY_TOOLTIP": "Kontrollo kushtin në 'test'. Nëse kushti është i saktë, kthen vlerën 'nëse e saktë'; përndryshe kthen vlerën 'nëse e pasaktë'.", - "MATH_NUMBER_HELPURL": "http://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Një numër.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "x", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asinus", - "MATH_TRIG_ACOS": "acosinus", - "MATH_TRIG_ATAN": "atangjentë", - "MATH_ARITHMETIC_HELPURL": "http://sq.wikipedia.org/wiki/Aritmetika", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Kthen shumën e dy numrave.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Kthen ndryshimin e dy numrave.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Kthen produktin e dy numrave.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Kthen herësin e dy numrave.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Kthen numrin e parë të ngritur në fuqinë e numrit të dytë.", - "MATH_SINGLE_HELPURL": "http://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "rrënja katrore", - "MATH_SINGLE_TOOLTIP_ROOT": "Kthen rrënjën katrore të një numri.", - "MATH_SINGLE_OP_ABSOLUTE": "absolut", - "MATH_SINGLE_TOOLTIP_ABS": "Kthen vlerën absolute të një numri.", - "MATH_SINGLE_TOOLTIP_NEG": "Kthe negacionin e një numri.", - "MATH_SINGLE_TOOLTIP_LN": "Kthen logaritmën natyrale të një numri.", - "MATH_SINGLE_TOOLTIP_LOG10": "Kthen 10 logaritmet bazë të një numri.", - "MATH_SINGLE_TOOLTIP_EXP": "Kthen e në fuqinë e një numri.", - "MATH_SINGLE_TOOLTIP_POW10": "Kthen 10 në fuqinë e një numri.", - "MATH_TRIG_HELPURL": "http://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Kthe kosinusin e nje kendi (jo ne radiant).", - "MATH_TRIG_TOOLTIP_COS": "Kthe kosinusin e nje grade (jo ne radiant).", - "MATH_TRIG_TOOLTIP_TAN": "Kthe tangentin e nje kendi (jo radiant).", - "MATH_TRIG_TOOLTIP_ASIN": "Rikthe sin-1 e nje numeri.", - "MATH_TRIG_TOOLTIP_ACOS": "Rikthe cos-1 e nje numeri.", - "MATH_TRIG_TOOLTIP_ATAN": "Kthe tg-1 e nje numeri.", - "MATH_CONSTANT_HELPURL": "http://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Kthen një nga konstantet e përbashkëta: : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infiniti).", - "MATH_IS_EVEN": "është çift", - "MATH_IS_ODD": "është tek", - "MATH_IS_PRIME": "është prim", - "MATH_IS_WHOLE": "është i plotë", - "MATH_IS_POSITIVE": "është pozitiv", - "MATH_IS_NEGATIVE": "është negativ", - "MATH_IS_DIVISIBLE_BY": "është i pjestueshme me", - "MATH_IS_TOOLTIP": "Kontrollo nëse një numër është çift, tek, prim, i plotë, pozitiv, negativ, ose nëse është i pjestueshëm me një numër të caktuar. Kthehet e saktë ose e pasaktë.", - "MATH_CHANGE_HELPURL": "http://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "ndrysho %1 nga %2", - "MATH_CHANGE_TOOLTIP": "Shto një numër në ndryshoren '%1'.", - "MATH_ROUND_HELPURL": "http://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Rrumbullakësimi i numrit të lartë ose të ulët.", - "MATH_ROUND_OPERATOR_ROUND": "rrumbullakësimi", - "MATH_ROUND_OPERATOR_ROUNDUP": "rrumbullakësimi i lartë", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "rrumbullakësimi i ulët", - "MATH_ONLIST_OPERATOR_SUM": "mbledhja e listës", - "MATH_ONLIST_TOOLTIP_SUM": "Kthe shumën e të gjithë numrave të listës.", - "MATH_ONLIST_OPERATOR_MIN": "numri më i ulët i listës", - "MATH_ONLIST_TOOLTIP_MIN": "Kthe numrin me të vogël të listës.", - "MATH_ONLIST_OPERATOR_MAX": "numri më i madh i listës", - "MATH_ONLIST_TOOLTIP_MAX": "Kthe numrin më të madh të listës.", - "MATH_ONLIST_OPERATOR_AVERAGE": "mesatarja e listës", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Kthen mesatarën (kuptimi aritmetik) i vlerave numerike të listës.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana e listës", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Kthe numrin median të listës.", - "MATH_ONLIST_OPERATOR_MODE": "modat e listës", - "MATH_ONLIST_TOOLTIP_MODE": "Kthe listën e sendit(eve) më të zakonshme të listës.", - "MATH_ONLIST_OPERATOR_STD_DEV": "devijimi standard i listës", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Kthe devijimin standard të listës.", - "MATH_ONLIST_OPERATOR_RANDOM": "send i rastësishëm i listës", - "MATH_ONLIST_TOOLTIP_RANDOM": "Kthe një element të rastësishëm nga lista.", - "MATH_MODULO_HELPURL": "http://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "mbetësi i %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Kthen mbetësin nga pjestimi i dy numrave.", - "MATH_CONSTRAIN_TITLE": "detyro %1 e ulët %2 e lartë %3", - "MATH_CONSTRAIN_TOOLTIP": "Vëni një numër që të jetë në mes të kufive të specifikuara(përfshirëse).", - "MATH_RANDOM_INT_HELPURL": "http://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "numër i plotë i rastësishëm nga %1 deri në %2", - "MATH_RANDOM_INT_TOOLTIP": "Kthe një numër të plotë të rastësishëm të dy kufijve të specifikuar, të përfshirë.", - "MATH_RANDOM_FLOAT_HELPURL": "http://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fraksioni i rastësishëm", - "MATH_RANDOM_FLOAT_TOOLTIP": "Kthe fraksionin e rastësishëm në mes të 0.0 (përfshirëse) dhe 1.0 (jopërfshirëse).", - "TEXT_TEXT_HELPURL": "http://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Nje shkronje, fjale, ose rresht teksti.", - "TEXT_JOIN_TITLE_CREATEWITH": "krijo tekst me", - "TEXT_JOIN_TOOLTIP": "Krijo nje pjese te tekstit duke bashkuar se bashku disa sende", - "TEXT_CREATE_JOIN_TITLE_JOIN": "bashkangjit", - "TEXT_CREATE_JOIN_TOOLTIP": "Shto, fshij, ose rirregullo sektoret për ta rikonfiguruar këtë bllok teksti.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Shto nje gje ne tekst", - "TEXT_APPEND_TO": "ne", - "TEXT_APPEND_APPENDTEXT": "shto tekst", - "TEXT_APPEND_TOOLTIP": "shto tekst tek varibla '%1'.", - "TEXT_LENGTH_TITLE": "gjatesi %1", - "TEXT_LENGTH_TOOLTIP": "Pergjigjet me nje numer shkronjash (duke perfshire hapesire) ne tekstin e dhene.", - "TEXT_ISEMPTY_TITLE": "%1 eshte bosh", - "TEXT_ISEMPTY_TOOLTIP": "Kthehet e vertete neqoftese teksti i dhene eshte bosh.", - "TEXT_INDEXOF_TOOLTIP": "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me 0 ne qofte se teksti nuk u gjet.", - "TEXT_INDEXOF_INPUT_INTEXT": "ne tekst", - "TEXT_INDEXOF_OPERATOR_FIRST": "gjej rastisjen e pare te tekstit", - "TEXT_INDEXOF_OPERATOR_LAST": "gjej rastisjen e fundit te tekstit", - "TEXT_CHARAT_INPUT_INTEXT": "ne tekst", - "TEXT_CHARAT_FROM_START": "merr shkronjen #", - "TEXT_CHARAT_FROM_END": "merr shkronjen # nga fundi", - "TEXT_CHARAT_FIRST": "merr shkronjen e pare", - "TEXT_CHARAT_LAST": "merr shkronjen e fundit", - "TEXT_CHARAT_RANDOM": "merr nje shkronje te rastesishme", - "TEXT_CHARAT_TOOLTIP": "Kthe nje shkronje nga nje pozicion i caktuar.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Pergjigjet me nje pjese te caktuar teksti.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ne tekst", - "TEXT_GET_SUBSTRING_START_FROM_START": "Merr nenvargun nga shkronja #", - "TEXT_GET_SUBSTRING_START_FROM_END": "merr nenvargun nga shkronja # nga fundi", - "TEXT_GET_SUBSTRING_START_FIRST": "merr vlerat qe vazhdojne me shkronjen e pare", - "TEXT_GET_SUBSTRING_END_FROM_START": "ne shkronjen #", - "TEXT_GET_SUBSTRING_END_FROM_END": "ne shkronjen # nga fundi", - "TEXT_GET_SUBSTRING_END_LAST": "tek shkronja e fundit", - "TEXT_CHANGECASE_TOOLTIP": "Kthe nje kopje te tekstit ne nje rast te ndryshem.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "me shkronja te medha shtypi", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "me shkronja te vogla shtypi", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Fillimi me shkronje te madhe shtypi", - "TEXT_TRIM_TOOLTIP": "Pergjigju me nje kopje te tekstit me hapesira te fshira nga njera ane ose te dyja anet.", - "TEXT_TRIM_OPERATOR_BOTH": "prit hapesirat nga te dyja anet", - "TEXT_TRIM_OPERATOR_LEFT": "prit hapesirat nga ana e majte", - "TEXT_TRIM_OPERATOR_RIGHT": "prit hapesirat nga ana e djathte", - "TEXT_PRINT_TITLE": "printo %1", - "TEXT_PRINT_TOOLTIP": "Printo tekstin e caktuar, numer ose vlere tjeter.", - "TEXT_PROMPT_TYPE_TEXT": "kerko tekst me njoftim", - "TEXT_PROMPT_TYPE_NUMBER": "kerko nje numer me njoftim", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Kerkoji perdoruesit nje numer.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Kerkoji perdoruesit ca tekst.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "krijo një listë të zbrazët", - "LISTS_CREATE_EMPTY_TOOLTIP": "Kthen një listë, te gjatësisë 0, duke mos përmbajtur asnjë regjistrim të të dhënave", - "LISTS_CREATE_WITH_TOOLTIP": "Krijo një listë me ndonjë numbër të sendeve.", - "LISTS_CREATE_WITH_INPUT_WITH": "krijo listë me", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "listë", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Shto, fshij, ose rirregullo sektoret për ta rikonfiguruar këtë bllok të listës.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Shto një send në listë.", - "LISTS_REPEAT_TOOLTIP": "Krijon në listë qe përmban vlerën e dhënë të përsëritur aq herë sa numri i specifikuar.", - "LISTS_REPEAT_TITLE": "krijo listën me sendin %1 të përsëritur %2 herë", - "LISTS_LENGTH_TITLE": "gjatësia e %1", - "LISTS_LENGTH_TOOLTIP": "Kthen gjatësinë e listës.", - "LISTS_ISEMPTY_TITLE": "%1 është e zbraztë", - "LISTS_ISEMPTY_TOOLTIP": "Kthehet i saktë nëse lista është e zbraztë.", - "LISTS_INLIST": "në listë", - "LISTS_INDEX_OF_FIRST": "gjen ndodhjen e parë të sendit", - "LISTS_INDEX_OF_LAST": "gjen ndodhjen e fundit të sendit", - "LISTS_INDEX_OF_TOOLTIP": "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen 0 nëse teksti nuk është gjetur.", - "LISTS_GET_INDEX_GET": "merr", - "LISTS_GET_INDEX_GET_REMOVE": "merr dhe fshij", - "LISTS_GET_INDEX_REMOVE": "largo", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# nga fundi", - "LISTS_GET_INDEX_FIRST": "i parë", - "LISTS_GET_INDEX_LAST": "i fundit", - "LISTS_GET_INDEX_RANDOM": "i rastësishëm", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Kthen një send në pozicionin e specifikuar në listë. #1 është sendi i parë.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Kthen një send në pozicionin e specifikuar në listë. #1 është sendi i fundit.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Rikthen tek artikulli i par në list.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Kthen artikullin e fundit në list.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Kthen një send të rastësishëm në listë.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Fshin dhe kthen sendin në pozicionin e specifikuar në listë. #1 është sendi i parë.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Fshin dhe kthen sendin në pozicionin e specifikuar në listë. #1 është sendi i fundit.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Fshin dhe kthen sendin e parë në listë.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Fshin dhe kthen sendin e fundit në listë.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Fshin dhe kthen një send të rastësishëm në listë.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Fshin sendin në pozicionin e specifikuar në listë. #1 është sendi i parë.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Fshin sendin në pozicionin e specifikuar në listë. #1 është sendi i fundit.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fshin sendin e parë në listë.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fshin sendin e fundit në listë.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Kthen një send të rastësishëm në listë.", - "LISTS_SET_INDEX_SET": "vendos", - "LISTS_SET_INDEX_INSERT": "fut në", - "LISTS_SET_INDEX_INPUT_TO": "sikurse", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Vendos sendin në pozicionin e specifikuar në listë. #1 është sendi i parë.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Vendos sendin ne pozicionin e specifikuar në listë. #1 është sendi i fundit.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Vendos sendin e parë në listë.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Vendos sendin e fundit në listë.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Vendos një send të rastësishëm në listë.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Fut sendin në pozicionin e specifikuar të listës. #1 është sendi i parë.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Fut sendin në pozicionin e specifikuar të listës. #1 është sendi i fundit.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Fut sendin në fillim të listës.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Bashkangjit sendin në fund të listës.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Fut sendin rastësisht në listë.", - "LISTS_GET_SUBLIST_START_FROM_START": "merr nën-listën nga #", - "LISTS_GET_SUBLIST_START_FROM_END": "merr nën listën nga # nga fundi", - "LISTS_GET_SUBLIST_START_FIRST": "merr nën-listën nga i pari", - "LISTS_GET_SUBLIST_END_FROM_START": "tek #", - "LISTS_GET_SUBLIST_END_FROM_END": "tek # nga fundi", - "LISTS_GET_SUBLIST_END_LAST": "tek i fundit", - "LISTS_GET_SUBLIST_TOOLTIP": "Krijon në kopje të pjesës së specifikuar të listës.", - "VARIABLES_GET_TOOLTIP": "Pergjigjet me nje vlere te kesaj variable.", - "VARIABLES_GET_CREATE_SET": "Krijo 'vendos %1", - "VARIABLES_SET": "vendos %1 ne %2", - "VARIABLES_SET_TOOLTIP": "Vendos kete variable te jete e barabarte me te dhenat ne hyrje.", - "VARIABLES_SET_CREATE_GET": "Krijo 'merr %1", - "PROCEDURES_DEFNORETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "te", - "PROCEDURES_DEFNORETURN_PROCEDURE": "bëj diqka", - "PROCEDURES_BEFORE_PARAMS": "me:", - "PROCEDURES_CALL_BEFORE_PARAMS": "me:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Krijon një funksion pa dalje.", - "PROCEDURES_DEFRETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "rikthe", - "PROCEDURES_DEFRETURN_TOOLTIP": "Krijon një funksion me një dalje.", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Paralajmërim: Ky funksion ka parametra të dyfishuar.", - "PROCEDURES_CALLNORETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Lësho funksionin e definuar nga përdoruesi '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Lëho funksionin e definuar nga përdoruesi '%1' dhe përdor daljen e tij.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "Informacioni i futur", - "PROCEDURES_MUTATORARG_TITLE": "Fut emrin:", - "PROCEDURES_HIGHLIGHT_DEF": "Thekso definicionin e funksionit", - "PROCEDURES_CREATE_DO": "Krijo '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Nëse një vlerë është e saktë, atëherë kthe një vlerë të dytë.", - "PROCEDURES_IFRETURN_WARNING": "Paralajmërim: Ky bllok mund të përdoret vetëm brenda definicionit të funksionit." -} diff --git a/msg/json/sr.json b/msg/json/sr.json deleted file mode 100644 index 9f00233b60..0000000000 --- a/msg/json/sr.json +++ /dev/null @@ -1,318 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Rancher", - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "ставка", - "DUPLICATE_BLOCK": "Дуплирај", - "ADD_COMMENT": "Додај коментар", - "REMOVE_COMMENT": "Уклони коментар", - "EXTERNAL_INPUTS": "Спољни улази", - "INLINE_INPUTS": "Унутрашњи улази", - "DELETE_BLOCK": "Обриши блок", - "DELETE_X_BLOCKS": "Обриши %1 блокова", - "DELETE_ALL_BLOCKS": "Обрисати %1 блокова?", - "COLLAPSE_BLOCK": "Скупи блок", - "COLLAPSE_ALL": "Скупи блокове", - "EXPAND_BLOCK": "Прошири блок", - "EXPAND_ALL": "Прошири блокове", - "DISABLE_BLOCK": "Онемогући блок", - "ENABLE_BLOCK": "Омогући блок", - "HELP": "Помоћ", - "CHANGE_VALUE_TITLE": "Промените вредност:", - "NEW_VARIABLE": "Нова променљива…", - "NEW_VARIABLE_TITLE": "Име нове променљиве:", - "RENAME_VARIABLE": "Преименуј променљиву…", - "RENAME_VARIABLE_TITLE": "Преименујте све „%1“ променљиве у:", - "COLOUR_PICKER_HELPURL": "https://sr.wikipedia.org/wiki/Боја", - "COLOUR_PICKER_TOOLTIP": "Изаберите боју са палете.", - "COLOUR_RANDOM_TITLE": "случајна боја", - "COLOUR_RANDOM_TOOLTIP": "Изаберите боју насумице.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "боја са", - "COLOUR_RGB_RED": "црвена", - "COLOUR_RGB_GREEN": "зелена", - "COLOUR_RGB_BLUE": "плава", - "COLOUR_RGB_TOOLTIP": "Креирај боју са одређеном количином црвене,зелене, и плаве. Све вредности морају бити између 0 и 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "помешај", - "COLOUR_BLEND_COLOUR1": "боја 1", - "COLOUR_BLEND_COLOUR2": "боја 2", - "COLOUR_BLEND_RATIO": "однос", - "COLOUR_BLEND_TOOLTIP": "Помешати две боје заједно са датим односом (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://sr.wikipedia.org/wiki/For_петља", - "CONTROLS_REPEAT_TITLE": "понови %1 пута", - "CONTROLS_REPEAT_INPUT_DO": "изврши", - "CONTROLS_REPEAT_TOOLTIP": "Одрадити неке наредбе неколико пута.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "понављати док", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "понављати до", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Док је вредност тачна, онда извршите неке наредбе.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Док вредност није тачна, онда извршити неке наредбе.", - "CONTROLS_FOR_TOOLTIP": "Имај промењиву \"%1\" узми вредности од почетног броја до задњег броја, бројећи по одређеном интервалу, и изврши одређене блокове.", - "CONTROLS_FOR_TITLE": "преброј са %1 од %2 до %3 од %4", - "CONTROLS_FOREACH_TITLE": "за сваку ставку %1 на списку %2", - "CONTROLS_FOREACH_TOOLTIP": "За сваку ставку унутар листе, подеси промењиву '%1' по ставци, и онда начини неке изјаве-наредбе.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Изађите из петље", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "настави са следећом итерацијом петље", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Напусти садржај петље.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Прескочи остатак ове петље, и настави са следећом итерацијом(понављанјем).", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Упозорење: Овај блок може да се употреби само унутар петље.", - "CONTROLS_IF_TOOLTIP_1": "ако је вредност тачна, онда изврши неке наредбе-изјаве.", - "CONTROLS_IF_TOOLTIP_2": "ако је вредност тачна, онда изврши први блок наредби, У супротном, изврши други блок наредби.", - "CONTROLS_IF_TOOLTIP_3": "Ако је прва вредност тачна, онда изврши први блок наредби, у супротном, ако је друга вредност тачна , изврши други блок наредби.", - "CONTROLS_IF_TOOLTIP_4": "Ако је прва вредност тачна, онда изврши први блок наредби, у супротном, ако је друга вредност тачна , изврши други блок наредби. Ако ни једна од вредности није тачна, изврши последнји блок наредби.", - "CONTROLS_IF_MSG_IF": "ако", - "CONTROLS_IF_MSG_ELSEIF": "иначе-ако", - "CONTROLS_IF_MSG_ELSE": "иначе", - "CONTROLS_IF_IF_TOOLTIP": "Додај, уклони, или преуреди делове како бих реконфигурисали овај иф блок.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Додајте услов блоку „ако“.", - "CONTROLS_IF_ELSE_TOOLTIP": "Додај коначни, catch-all (ухвати све) услове иф блока.", - "LOGIC_COMPARE_HELPURL": "https://sr.wikipedia.org/wiki/Неједнакост", - "LOGIC_COMPARE_TOOLTIP_EQ": "Враћа вредност „тачно“ ако су оба улаза једнака.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Враћа вредност „тачно“ ако су оба улаза неједнака.", - "LOGIC_COMPARE_TOOLTIP_LT": "Враћа вредност „тачно“ ако је први улаз мањи од другог.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Враћа вредност „тачно“ ако је први улаз мањи или једнак другом.", - "LOGIC_COMPARE_TOOLTIP_GT": "Враћа вредност „тачно“ ако је први улаз већи од другог.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Враћа вредност „тачно“ ако је први улаз већи или једнак другом.", - "LOGIC_OPERATION_TOOLTIP_AND": "Враћа вредност „тачно“ ако су оба улаза тачна.", - "LOGIC_OPERATION_AND": "и", - "LOGIC_OPERATION_TOOLTIP_OR": "Враћа вредност „тачно“ ако је бар један од улаза тачан.", - "LOGIC_OPERATION_OR": "или", - "LOGIC_NEGATE_TITLE": "није %1", - "LOGIC_NEGATE_TOOLTIP": "Враћа вредност „тачно“ ако је улаз нетачан. Враћа вредност „нетачно“ ако је улаз тачан.", - "LOGIC_BOOLEAN_TRUE": "тачно", - "LOGIC_BOOLEAN_FALSE": "нетачно", - "LOGIC_BOOLEAN_TOOLTIP": "враћа вредност или тачно или нетачно.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "без вредности", - "LOGIC_NULL_TOOLTIP": "Враћа „без вредности“.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "тест", - "LOGIC_TERNARY_IF_TRUE": "ако је тачно", - "LOGIC_TERNARY_IF_FALSE": "ако је нетачно", - "LOGIC_TERNARY_TOOLTIP": "Провери услов у 'test'. Ако је услов тачан, тада враћа 'if true' вредност; у другом случају враћа 'if false' вредност.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Неки број.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "син", - "MATH_TRIG_COS": "цос", - "MATH_TRIG_TAN": "тан", - "MATH_TRIG_ASIN": "арц син", - "MATH_TRIG_ACOS": "арц цос", - "MATH_TRIG_ATAN": "арц тан", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Вратите збир два броја.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Враћа разлику два броја.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Враћа производ два броја.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Враћа количник два броја.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Враћа први број степенован другим.", - "MATH_SINGLE_HELPURL": "https://sr.wikipedia.org/wiki/Квадратни_корен", - "MATH_SINGLE_OP_ROOT": "квадратни корен", - "MATH_SINGLE_TOOLTIP_ROOT": "Враћа квадратни корен броја.", - "MATH_SINGLE_OP_ABSOLUTE": "апсолутан", - "MATH_SINGLE_TOOLTIP_ABS": "Враћа апсолутну вредност броја.", - "MATH_SINGLE_TOOLTIP_NEG": "Враћа негацију броја.", - "MATH_SINGLE_TOOLTIP_LN": "Враћа природни логаритам броја.", - "MATH_SINGLE_TOOLTIP_LOG10": "Враћа логаритам броја са основом 10.", - "MATH_SINGLE_TOOLTIP_EXP": "вратити е на власти броја.", - "MATH_SINGLE_TOOLTIP_POW10": "Враћа 10-ти степен броја.", - "MATH_TRIG_HELPURL": "https://sr.wikipedia.org/wiki/Тригонометријске_функције", - "MATH_TRIG_TOOLTIP_SIN": "Враћа синус степена (не радијан).", - "MATH_TRIG_TOOLTIP_COS": "Враћа косинус степена (не радијан).", - "MATH_TRIG_TOOLTIP_TAN": "Враћа тангенс степена (не радијан).", - "MATH_TRIG_TOOLTIP_ASIN": "Враћа аркус броја.", - "MATH_TRIG_TOOLTIP_ACOS": "Враћа аркус косинус броја.", - "MATH_TRIG_TOOLTIP_ATAN": "Враћа аркус тангенс броја.", - "MATH_CONSTANT_HELPURL": "https://sr.wikipedia.org/wiki/Математичка_константа", - "MATH_CONSTANT_TOOLTIP": "врати једну од заједничких константи: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), или ∞ (infinity).", - "MATH_IS_EVEN": "је паран", - "MATH_IS_ODD": "је непаран", - "MATH_IS_PRIME": "је прост", - "MATH_IS_WHOLE": "је цео", - "MATH_IS_POSITIVE": "је позитиван", - "MATH_IS_NEGATIVE": "је негативан", - "MATH_IS_DIVISIBLE_BY": "је дељив са", - "MATH_IS_TOOLTIP": "Провјерава да ли је број паран, непаран, прост, цио, позитиван, негативан, или да ли је делјив са одређеним бројем. Враћа тачно или нетачно.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "промени %1 за %2", - "MATH_CHANGE_TOOLTIP": "Додајте број променљивој „%1“.", - "MATH_ROUND_HELPURL": "https://sr.wikipedia.org/wiki/Заокруживање", - "MATH_ROUND_TOOLTIP": "Заокружите број на већу или мању вредност.", - "MATH_ROUND_OPERATOR_ROUND": "заокружи", - "MATH_ROUND_OPERATOR_ROUNDUP": "заокружи навише", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "заокружи наниже", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "збир списка", - "MATH_ONLIST_TOOLTIP_SUM": "Враћа збир свих бројева са списка.", - "MATH_ONLIST_OPERATOR_MIN": "мин. списка", - "MATH_ONLIST_TOOLTIP_MIN": "Враћа најмањи број са списка.", - "MATH_ONLIST_OPERATOR_MAX": "макс. списка", - "MATH_ONLIST_TOOLTIP_MAX": "Враћа највећи број са списка.", - "MATH_ONLIST_OPERATOR_AVERAGE": "просек списка", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Враћа просек нумеричких вредности са списка.", - "MATH_ONLIST_OPERATOR_MEDIAN": "медијана списка", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Враћа медијану са списка.", - "MATH_ONLIST_OPERATOR_MODE": "модус списка", - "MATH_ONLIST_TOOLTIP_MODE": "Враћа најчешће ставке са списка.", - "MATH_ONLIST_OPERATOR_STD_DEV": "стандардна девијација списка", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Враћа стандардну девијацију списка.", - "MATH_ONLIST_OPERATOR_RANDOM": "случајна ставка списка", - "MATH_ONLIST_TOOLTIP_RANDOM": "Враћа случајни елемент са списка.", - "MATH_MODULO_HELPURL": "https://sr.wikipedia.org/wiki/Конгруенција", - "MATH_MODULO_TITLE": "подсетник од %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Враћа подсетник од дељења два броја.", - "MATH_CONSTRAIN_TITLE": "ограничи %1 ниско %2 високо %3", - "MATH_CONSTRAIN_TOOLTIP": "Ограничава број на доње и горње границе (укључиво).", - "MATH_RANDOM_INT_HELPURL": "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева", - "MATH_RANDOM_INT_TITLE": "сличајно одабрани цијели број од %1 до %2", - "MATH_RANDOM_INT_TOOLTIP": "Враћа случајно одабрани цели број између две одређене границе, уклјучиво.", - "MATH_RANDOM_FLOAT_HELPURL": "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "случајни разломак", - "MATH_RANDOM_FLOAT_TOOLTIP": "Враћа случајни разломак између 0.0 (укључиво) и 1.0 (искључиво).", - "TEXT_TEXT_HELPURL": "https://sr.wikipedia.org/wiki/Ниска", - "TEXT_TEXT_TOOLTIP": "Слово, реч или ред текста.", - "TEXT_JOIN_TITLE_CREATEWITH": "напиши текст са", - "TEXT_JOIN_TOOLTIP": "Направити дио текста спајајући различите ставке.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "спајањем", - "TEXT_CREATE_JOIN_TOOLTIP": "Додај, уклони, или другачије поредај одјелке како би изнова поставили овај текст блок.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Додајте ставку у текст.", - "TEXT_APPEND_TO": "на", - "TEXT_APPEND_APPENDTEXT": "додај текст", - "TEXT_APPEND_TOOLTIP": "Додајте текст на променљиву „%1“.", - "TEXT_LENGTH_TITLE": "дужина текста %1", - "TEXT_LENGTH_TOOLTIP": "Враћа број слова (уклјучујући размаке) у датом тексту.", - "TEXT_ISEMPTY_TITLE": "%1 је празан", - "TEXT_ISEMPTY_TOOLTIP": "Враћа тачно ако је доставлјени текст празан.", - "TEXT_INDEXOF_TOOLTIP": "Враћа однос првог/заднјег појавлјиванја текста у другом тексту. Врађа 0 ако текст није пронађен.", - "TEXT_INDEXOF_INPUT_INTEXT": "у тексту", - "TEXT_INDEXOF_OPERATOR_FIRST": "пронађи прво појављивање текста", - "TEXT_INDEXOF_OPERATOR_LAST": "пронађи последње појављивање текста", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_INPUT_INTEXT": "у тексту", - "TEXT_CHARAT_FROM_START": "преузми слово #", - "TEXT_CHARAT_FROM_END": "преузми слово # са краја", - "TEXT_CHARAT_FIRST": "преузми прво слово", - "TEXT_CHARAT_LAST": "преузми последње слово", - "TEXT_CHARAT_RANDOM": "преузми случајно слово", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "Враћа слово на одређени положај.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Враћа одређени део текста.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "у тексту", - "TEXT_GET_SUBSTRING_START_FROM_START": "преузми подниску из слова #", - "TEXT_GET_SUBSTRING_START_FROM_END": "преузми подниску из слова # са краја", - "TEXT_GET_SUBSTRING_START_FIRST": "преузми подниску из првог слова", - "TEXT_GET_SUBSTRING_END_FROM_START": "слову #", - "TEXT_GET_SUBSTRING_END_FROM_END": "слову # са краја", - "TEXT_GET_SUBSTRING_END_LAST": "последњем слову", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "Враћа примерак текста са другачијом величином слова.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "великим словима", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "малим словима", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "свака реч великим словом", - "TEXT_TRIM_TOOLTIP": "Враћа копију текста са уклонјеним простором са једног од два краја.", - "TEXT_TRIM_OPERATOR_BOTH": "скратити простор са обе стране", - "TEXT_TRIM_OPERATOR_LEFT": "скратити простор са леве стране", - "TEXT_TRIM_OPERATOR_RIGHT": "скратити простор са десне стране", - "TEXT_PRINT_TITLE": "прикажи %1", - "TEXT_PRINT_TOOLTIP": "Прикажите одређени текст, број или другу вредност на екрану.", - "TEXT_PROMPT_TYPE_TEXT": "питај за текст са поруком", - "TEXT_PROMPT_TYPE_NUMBER": "питај за број са поруком", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Питајте корисника за број.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Питајте корисника за унос текста.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "направи празан списак", - "LISTS_CREATE_EMPTY_TOOLTIP": "враћа листу, дужине 0, не садржавајући евиденцију података", - "LISTS_CREATE_WITH_TOOLTIP": "Креирај листу са било којим бројем ставки.", - "LISTS_CREATE_WITH_INPUT_WITH": "направи списак са", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "списак", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Додајте, избришите, или преуредите делове како би се реорганизовали овај блок листе.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Додајте ставку на списак.", - "LISTS_REPEAT_TOOLTIP": "Прави листу која се састоји од задане вредности коју понавлјамо одређени број шута.", - "LISTS_REPEAT_TITLE": "Направити листу са ставком %1 која се понавлја %2 пута", - "LISTS_LENGTH_TITLE": "дужина списка %1", - "LISTS_LENGTH_TOOLTIP": "Враћа дужину списка.", - "LISTS_ISEMPTY_TITLE": "%1 је празан", - "LISTS_ISEMPTY_TOOLTIP": "Враћа вредност тачно ако је листа празна.", - "LISTS_INLIST": "на списку", - "LISTS_INDEX_OF_FIRST": "пронађи прво појављивање ставке", - "LISTS_INDEX_OF_LAST": "пронађи последње појављивање ставке", - "LISTS_INDEX_OF_TOOLTIP": "Враћа однос првог/последнјег појавлјиванја ставке у листи. Враћа 0 ако се текст не наће.", - "LISTS_GET_INDEX_GET": "преузми", - "LISTS_GET_INDEX_GET_REMOVE": "преузми и уклони", - "LISTS_GET_INDEX_REMOVE": "уклони", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# са краја", - "LISTS_GET_INDEX_FIRST": "прва", - "LISTS_GET_INDEX_LAST": "последња", - "LISTS_GET_INDEX_RANDOM": "случајна", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Враћа ставку на одређену позицију на листи. #1 је прва ставка.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Враћа ставку на одређену позицију на листи. #1 је последња ставка.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Враћа прву ставку на списку.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Враћа последњу ставку на списку.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Враћа случајну ставку са списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Уклања и враћа ставку са одређеног положаја на списку. #1 је прва ставка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Уклања и враћа ставку са одређеног положаја на списку. #1 је последња ставка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Уклања и враћа прву ставку са списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Уклања и враћа последњу ставку са списка.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Уклања и враћа случајну ставку са списка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Уклања ставку са одређеног положаја на списку. #1 је прва ставка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Уклања ставку са одређеног положаја на списку. #1 је последња ставка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Уклања прву ставку са списка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Уклања последњу ставку са списка.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Уклања случајну ставку са списка.", - "LISTS_SET_INDEX_SET": "постави", - "LISTS_SET_INDEX_INSERT": "убаци на", - "LISTS_SET_INDEX_INPUT_TO": "као", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Поставља ставку на одређени положај на списку. #1 је прва ставка.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Поставља ставку на одређени положај на списку. #1 је последња ставка.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Поставља прву ставку на списку.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Поставља последњу ставку на списку.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Поставља случајну ставку на списку.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Убацује ставку на одређени положај на списку. #1 је прва ставка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Убацује ставку на одређени положај на списку. #1 је последња ставка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Убацује ставку на почетак списка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Додајте ставку на крај списка.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Убацује ставку на случајно место на списку.", - "LISTS_GET_SUBLIST_START_FROM_START": "преузми подсписак од #", - "LISTS_GET_SUBLIST_START_FROM_END": "преузми подсписак из # са краја", - "LISTS_GET_SUBLIST_START_FIRST": "преузми подсписак од прве", - "LISTS_GET_SUBLIST_END_FROM_START": "до #", - "LISTS_GET_SUBLIST_END_FROM_END": "до # од краја", - "LISTS_GET_SUBLIST_END_LAST": "до последње", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "Прави копију одређеног дела листе.", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_TOOLTIP": "Враћа вредност ове променљиве.", - "VARIABLES_GET_CREATE_SET": "Направи „постави %1“", - "VARIABLES_SET": "постави %1 у %2", - "VARIABLES_SET_TOOLTIP": "Поставља променљиву тако да буде једнака улазу.", - "VARIABLES_SET_CREATE_GET": "Направи „преузми %1“", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "да", - "PROCEDURES_DEFNORETURN_PROCEDURE": "урадите нешто", - "PROCEDURES_BEFORE_PARAMS": "са:", - "PROCEDURES_CALL_BEFORE_PARAMS": "са:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Прави функцију без излаза.", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "врати", - "PROCEDURES_DEFRETURN_TOOLTIP": "Прави функцију са излазом.", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Упозорење: Ова функција има дупликате параметара.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://sr.wikipedia.org/wiki/Функција_(програмирање)", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Покрените прилагођену функцију „%1“.", - "PROCEDURES_CALLRETURN_HELPURL": "https://sr.wikipedia.org/wiki/Функција_(програмирање)", - "PROCEDURES_CALLRETURN_TOOLTIP": "Покрените прилагођену функцију „%1“ и користи њен излаз.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "улази", - "PROCEDURES_MUTATORARG_TITLE": "назив улаза:", - "PROCEDURES_HIGHLIGHT_DEF": "Истакни дефиницију функције", - "PROCEDURES_CREATE_DO": "Направи „%1“", - "PROCEDURES_IFRETURN_TOOLTIP": "Уколико је вредност тачна, врати другу вредност.", - "PROCEDURES_IFRETURN_WARNING": "Упозорење: Овај блок се може користити једино у дефиницији функције." -} diff --git a/msg/json/sv.json b/msg/json/sv.json deleted file mode 100644 index f3077eb1f2..0000000000 --- a/msg/json/sv.json +++ /dev/null @@ -1,328 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Jopparn", - "WikiPhoenix", - "Abbedabb", - "Aaoo", - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "föremål", - "TODAY": "Idag", - "DUPLICATE_BLOCK": "Duplicera", - "ADD_COMMENT": "Lägg till kommentar", - "REMOVE_COMMENT": "Radera kommentar", - "EXTERNAL_INPUTS": "Externa inmatningar", - "INLINE_INPUTS": "Radinmatning", - "DELETE_BLOCK": "Radera block", - "DELETE_X_BLOCKS": "Radera %1 block", - "DELETE_ALL_BLOCKS": "Radera alla %1 block?", - "CLEAN_UP": "Rada upp block", - "COLLAPSE_BLOCK": "Fäll ihop block", - "COLLAPSE_ALL": "Fäll ihop block", - "EXPAND_BLOCK": "Fäll ut block", - "EXPAND_ALL": "Fäll ut block", - "DISABLE_BLOCK": "Inaktivera block", - "ENABLE_BLOCK": "Aktivera block", - "HELP": "Hjälp", - "CHAT": "Chatta med din medarbetare genom att skriva i detta fält.", - "AUTH": "Var god godkänn denna app för att du ska kunna spara och dela den.", - "ME": "Jag", - "CHANGE_VALUE_TITLE": "Ändra värde:", - "NEW_VARIABLE": "Ny variabel...", - "NEW_VARIABLE_TITLE": "Nytt variabelnamn:", - "RENAME_VARIABLE": "Byt namn på variabel...", - "RENAME_VARIABLE_TITLE": "Byt namn på alla'%1'-variabler till:", - "COLOUR_PICKER_HELPURL": "https://sv.wikipedia.org/wiki/Färg", - "COLOUR_PICKER_TOOLTIP": "Välj en färg från paletten.", - "COLOUR_RANDOM_TITLE": "slumpfärg", - "COLOUR_RANDOM_TOOLTIP": "Slumpa fram en färg.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "färg med", - "COLOUR_RGB_RED": "röd", - "COLOUR_RGB_GREEN": "grön", - "COLOUR_RGB_BLUE": "blå", - "COLOUR_RGB_TOOLTIP": "Skapa en färg med det angivna mängden röd, grön och blå. Alla värden måste vara mellan 0 och 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "blanda", - "COLOUR_BLEND_COLOUR1": "färg 1", - "COLOUR_BLEND_COLOUR2": "färg 2", - "COLOUR_BLEND_RATIO": "förhållande", - "COLOUR_BLEND_TOOLTIP": "Blandar ihop två färger med ett bestämt förhållande (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "upprepa %1 gånger", - "CONTROLS_REPEAT_INPUT_DO": "utför", - "CONTROLS_REPEAT_TOOLTIP": "Utför några kommandon flera gånger.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "upprepa medan", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "upprepa tills", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Medan ett värde är sant, utför några kommandon.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Medan ett värde är falskt, utför några kommandon.", - "CONTROLS_FOR_TOOLTIP": "Låt variabeln \"%1\" ta värden från starttalet till sluttalet, beräknat med det angivna intervallet, och utför de angivna blocken.", - "CONTROLS_FOR_TITLE": "räkna med %1 från %2 till %3 med %4", - "CONTROLS_FOREACH_TITLE": "för varje föremål %1 i listan %2", - "CONTROLS_FOREACH_TOOLTIP": "För varje objekt i en lista, ange variabeln '%1' till objektet, och utför sedan några kommandon.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "bryt ut ur loop", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "fortsätta med nästa upprepning av loop", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Bryta ut ur den innehållande upprepningen.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Hoppa över resten av denna loop och fortsätt med nästa loop.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Varning: Detta block kan endast användas i en loop.", - "CONTROLS_IF_TOOLTIP_1": "Om ett värde är sant, utför några kommandon.", - "CONTROLS_IF_TOOLTIP_2": "Om värdet är sant, utför det första kommandoblocket. Annars utför det andra kommandoblocket.", - "CONTROLS_IF_TOOLTIP_3": "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket.", - "CONTROLS_IF_TOOLTIP_4": "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket. Om ingen av värdena är sanna, utför det sista kommandoblocket.", - "CONTROLS_IF_MSG_IF": "om", - "CONTROLS_IF_MSG_ELSEIF": "annars om", - "CONTROLS_IF_MSG_ELSE": "annars", - "CONTROLS_IF_IF_TOOLTIP": "Lägg till, ta bort eller ändra ordningen för sektioner för att omkonfigurera blocket \"om\".", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Lägg till ett villkor blocket \"om\".", - "CONTROLS_IF_ELSE_TOOLTIP": "Lägg till ett sista villkor som täcker alla alternativ som är kvar för \"if\"-blocket.", - "LOGIC_COMPARE_HELPURL": "https://sv.wikipedia.org/wiki/Olikhet", - "LOGIC_COMPARE_TOOLTIP_EQ": "Ger tillbaka sant om båda värdena är lika med varandra.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Ger tillbaka sant om båda värdena inte är lika med varandra.", - "LOGIC_COMPARE_TOOLTIP_LT": "Ger tillbaka sant om det första värdet är mindre än det andra.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Ger tillbaka sant om det första värdet är mindre än eller lika med det andra.", - "LOGIC_COMPARE_TOOLTIP_GT": "Ger tillbaka sant om det första värdet är större än det andra.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Ger tillbaka sant om det första värdet är större än eller lika med det andra.", - "LOGIC_OPERATION_TOOLTIP_AND": "Ger tillbaka sant om båda värdena är sanna.", - "LOGIC_OPERATION_AND": "och", - "LOGIC_OPERATION_TOOLTIP_OR": "Ger tillbaka sant om minst ett av värdena är sant.", - "LOGIC_OPERATION_OR": "eller", - "LOGIC_NEGATE_TITLE": "inte %1", - "LOGIC_NEGATE_TOOLTIP": "Ger tillbaka sant om inmatningen är falsk. Ger tillbaka falskt och inmatningen är sann.", - "LOGIC_BOOLEAN_TRUE": "sant", - "LOGIC_BOOLEAN_FALSE": "falskt", - "LOGIC_BOOLEAN_TOOLTIP": "Returnerar antingen sant eller falskt.", - "LOGIC_NULL_HELPURL": "https://sv.wikipedia.org/wiki/Null", - "LOGIC_NULL": "null", - "LOGIC_NULL_TOOLTIP": "Returnerar null.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "om sant", - "LOGIC_TERNARY_IF_FALSE": "om falskt", - "LOGIC_TERNARY_TOOLTIP": "Kontrollera villkoret i \"test\". Om villkoret är sant, ge tillbaka \"om sant\"-värdet; annars ge tillbaka \"om falskt\"-värdet.", - "MATH_NUMBER_HELPURL": "https://sv.wikipedia.org/wiki/Tal", - "MATH_NUMBER_TOOLTIP": "Ett tal.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "arcsin", - "MATH_TRIG_ACOS": "arccos", - "MATH_TRIG_ATAN": "arctan", - "MATH_ARITHMETIC_HELPURL": "https://sv.wikipedia.org/wiki/Aritmetik", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Returnerar summan av de två talen.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Returnerar differensen mellan de två talen.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Returnerar produkten av de två talen.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Returnerar kvoten av de två talen.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Ger tillbaka det första talet upphöjt till det andra talet.", - "MATH_SINGLE_HELPURL": "https://sv.wikipedia.org/wiki/Kvadratrot", - "MATH_SINGLE_OP_ROOT": "kvadratrot", - "MATH_SINGLE_TOOLTIP_ROOT": "Returnerar kvadratroten av ett tal.", - "MATH_SINGLE_OP_ABSOLUTE": "absolut", - "MATH_SINGLE_TOOLTIP_ABS": "Returnerar absolutvärdet av ett tal.", - "MATH_SINGLE_TOOLTIP_NEG": "Returnerar negationen av ett tal.", - "MATH_SINGLE_TOOLTIP_LN": "Returnera den naturliga logaritmen av ett tal.", - "MATH_SINGLE_TOOLTIP_LOG10": "Returnerar logaritmen för bas 10 av ett tal.", - "MATH_SINGLE_TOOLTIP_EXP": "Ger tillbaka e upphöjt i ett tal.", - "MATH_SINGLE_TOOLTIP_POW10": "Ger tillbaka 10 upphöjt i ett tal.", - "MATH_TRIG_HELPURL": "https://sv.wikipedia.org/wiki/Trigonometrisk_funktion", - "MATH_TRIG_TOOLTIP_SIN": "Ger tillbaka sinus för en grad (inte radian).", - "MATH_TRIG_TOOLTIP_COS": "Ger tillbaka cosinus för en grad (inte radian).", - "MATH_TRIG_TOOLTIP_TAN": "Ger tillbaka tangens för en grad (inte radian).", - "MATH_TRIG_TOOLTIP_ASIN": "Ger tillbaka arcus sinus (arcsin) för ett tal.", - "MATH_TRIG_TOOLTIP_ACOS": "Ger tillbaka arcus cosinus (arccos) för ett tal.", - "MATH_TRIG_TOOLTIP_ATAN": "Ger tillbaka arcus tangens (arctan) av ett tal.", - "MATH_CONSTANT_HELPURL": "https://sv.wikipedia.org/wiki/Matematisk_konstant", - "MATH_CONSTANT_TOOLTIP": "Returnerar en av de vanliga konstanterna: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) eller ∞ (oändligt).", - "MATH_IS_EVEN": "är jämnt", - "MATH_IS_ODD": "är ojämnt", - "MATH_IS_PRIME": "är ett primtal", - "MATH_IS_WHOLE": "är helt", - "MATH_IS_POSITIVE": "är positivt", - "MATH_IS_NEGATIVE": "är negativt", - "MATH_IS_DIVISIBLE_BY": "är delbart med", - "MATH_IS_TOOLTIP": "Kontrollera om ett tal är jämnt, ojämnt, helt, positivt, negativt eller det är delbart med ett bestämt tal. Returnerar med sant eller falskt.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "ändra %1 med %2", - "MATH_CHANGE_TOOLTIP": "Lägg till ett tal till variabeln '%1'.", - "MATH_ROUND_HELPURL": "https://sv.wikipedia.org/wiki/Avrundning", - "MATH_ROUND_TOOLTIP": "Avrunda ett tal uppåt eller nedåt.", - "MATH_ROUND_OPERATOR_ROUND": "avrunda", - "MATH_ROUND_OPERATOR_ROUNDUP": "avrunda uppåt", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "avrunda nedåt", - "MATH_ONLIST_OPERATOR_SUM": "summan av listan", - "MATH_ONLIST_TOOLTIP_SUM": "Ger tillbaka summan av alla talen i listan.", - "MATH_ONLIST_OPERATOR_MIN": "minsta talet i listan", - "MATH_ONLIST_TOOLTIP_MIN": "Ger tillbaka det minsta talet i listan.", - "MATH_ONLIST_OPERATOR_MAX": "högsta talet i listan", - "MATH_ONLIST_TOOLTIP_MAX": "Ger tillbaka det största talet i listan.", - "MATH_ONLIST_OPERATOR_AVERAGE": "medelvärdet av listan", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Ger tillbaka medelvärdet (aritmetiskt) av de numeriska värdena i listan.", - "MATH_ONLIST_OPERATOR_MEDIAN": "medianen av listan", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Returnerar medianen av talen i listan.", - "MATH_ONLIST_OPERATOR_MODE": "typvärdet i listan", - "MATH_ONLIST_TOOLTIP_MODE": "Ger tillbaka en lista med de(t) vanligaste objekte(t/n) i listan.", - "MATH_ONLIST_OPERATOR_STD_DEV": "standardavvikelsen i listan", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Ger tillbaka standardavvikelsen i listan.", - "MATH_ONLIST_OPERATOR_RANDOM": "slumpmässigt objekt i listan", - "MATH_ONLIST_TOOLTIP_RANDOM": "Returnerar ett slumpmässigt element från listan.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "resten av %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Returnerar kvoten från divisionen av de två talen.", - "MATH_CONSTRAIN_TITLE": "begränsa %1 till mellan %2 och %3", - "MATH_CONSTRAIN_TOOLTIP": "Begränsa ett tal till att mellan de angivna gränsvärden (inklusive).", - "MATH_RANDOM_INT_HELPURL": "https://sv.wikipedia.org/wiki/Slumptalsgenerator", - "MATH_RANDOM_INT_TITLE": "slumpartat heltal från %1 till %2", - "MATH_RANDOM_INT_TOOLTIP": "Ger tillbaka ett slumpat heltal mellan två värden (inklusive).", - "MATH_RANDOM_FLOAT_HELPURL": "https://sv.wikipedia.org/wiki/Slumptalsgenerator", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "slumpat decimaltal", - "MATH_RANDOM_FLOAT_TOOLTIP": "Ger tillbaka ett slumpat decimaltal mellan 0.0 (inkluderat) och 1.0 (exkluderat).", - "TEXT_TEXT_HELPURL": "https://sv.wikipedia.org/wiki/Str%C3%A4ng_%28data%29", - "TEXT_TEXT_TOOLTIP": "En bokstav, ord eller textrad.", - "TEXT_JOIN_TITLE_CREATEWITH": "skapa text med", - "TEXT_JOIN_TOOLTIP": "Skapa en textbit genom att sammanfoga ett valfritt antal föremål.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "sammanfoga", - "TEXT_CREATE_JOIN_TOOLTIP": "Lägg till, ta bort eller ändra ordningen för sektioner för att omkonfigurera detta textblock.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Lägg till ett föremål till texten.", - "TEXT_APPEND_TO": "till", - "TEXT_APPEND_APPENDTEXT": "lägg till text", - "TEXT_APPEND_TOOLTIP": "Lägg till lite text till variabeln '%1'.", - "TEXT_LENGTH_TITLE": "längden på %1", - "TEXT_LENGTH_TOOLTIP": "Ger tillbaka antalet bokstäver (inklusive mellanslag) i den angivna texten.", - "TEXT_ISEMPTY_TITLE": "%1 är tom", - "TEXT_ISEMPTY_TOOLTIP": "Returnerar sant om den angivna texten är tom.", - "TEXT_INDEXOF_TOOLTIP": "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka 0 om texten inte hittas.", - "TEXT_INDEXOF_INPUT_INTEXT": "i texten", - "TEXT_INDEXOF_OPERATOR_FIRST": "hitta första förekomsten av texten", - "TEXT_INDEXOF_OPERATOR_LAST": "hitta sista förekomsten av texten", - "TEXT_CHARAT_INPUT_INTEXT": "i texten", - "TEXT_CHARAT_FROM_START": "hämta bokstaven #", - "TEXT_CHARAT_FROM_END": "hämta bokstaven # från slutet", - "TEXT_CHARAT_FIRST": "hämta första bokstaven", - "TEXT_CHARAT_LAST": "hämta sista bokstaven", - "TEXT_CHARAT_RANDOM": "hämta slumpad bokstav", - "TEXT_CHARAT_TOOLTIP": "Ger tillbaka bokstaven på den specificerade positionen.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Ger tillbaka en viss del av texten.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "i texten", - "TEXT_GET_SUBSTRING_START_FROM_START": "få textdel från bokstav #", - "TEXT_GET_SUBSTRING_START_FROM_END": "få textdel från bokstav # från slutet", - "TEXT_GET_SUBSTRING_START_FIRST": "få textdel från första bokstaven", - "TEXT_GET_SUBSTRING_END_FROM_START": "till bokstav #", - "TEXT_GET_SUBSTRING_END_FROM_END": "till bokstav # från slutet", - "TEXT_GET_SUBSTRING_END_LAST": "till sista bokstaven", - "TEXT_CHANGECASE_TOOLTIP": "Returnerar en kopia av texten i ett annat skiftläge.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "till VERSALER", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "till gemener", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "till Versala Initialer", - "TEXT_TRIM_TOOLTIP": "Returnerar en kopia av texten med borttagna mellanrum från en eller båda ändar.", - "TEXT_TRIM_OPERATOR_BOTH": "ta bort mellanrum från båda sidorna av", - "TEXT_TRIM_OPERATOR_LEFT": "ta bort mellanrum från vänstra sidan av", - "TEXT_TRIM_OPERATOR_RIGHT": "ta bort mellanrum från högra sidan av", - "TEXT_PRINT_TITLE": "skriv %1", - "TEXT_PRINT_TOOLTIP": "Skriv den angivna texten, talet eller annat värde.", - "TEXT_PROMPT_TYPE_TEXT": "fråga efter text med meddelande", - "TEXT_PROMPT_TYPE_NUMBER": "fråga efter ett tal med meddelande", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Fråga användaren efter ett tal.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Fråga användaren efter lite text.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "skapa tom lista", - "LISTS_CREATE_EMPTY_TOOLTIP": "Ger tillbaka en lista utan någon data, alltså med längden 0", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Skapa en lista med valfritt antal föremål.", - "LISTS_CREATE_WITH_INPUT_WITH": "skapa lista med", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Lägg till, ta bort eller ändra ordningen på objekten för att göra om det här \"list\"-blocket.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Lägg till ett föremål till listan.", - "LISTS_REPEAT_TOOLTIP": "Skapar en lista som innehåller ett valt värde upprepat ett bestämt antalet gånger.", - "LISTS_REPEAT_TITLE": "skapa lista med föremålet %1 upprepat %2 gånger", - "LISTS_LENGTH_TITLE": "längden på %1", - "LISTS_LENGTH_TOOLTIP": "Returnerar längden på en lista.", - "LISTS_ISEMPTY_TITLE": "%1 är tom", - "LISTS_ISEMPTY_TOOLTIP": "Returnerar sant om listan är tom.", - "LISTS_INLIST": "i listan", - "LISTS_INDEX_OF_FIRST": "hitta första förekomsten av objektet", - "LISTS_INDEX_OF_LAST": "hitta sista förekomsten av objektet", - "LISTS_INDEX_OF_TOOLTIP": "Ger tillbaka den första/sista förekomsten av objektet i listan. Ger tillbaka 0 om objektet inte hittas.", - "LISTS_GET_INDEX_GET": "hämta", - "LISTS_GET_INDEX_GET_REMOVE": "hämta och ta bort", - "LISTS_GET_INDEX_REMOVE": "ta bort", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# från slutet", - "LISTS_GET_INDEX_FIRST": "första", - "LISTS_GET_INDEX_LAST": "sista", - "LISTS_GET_INDEX_RANDOM": "slumpad", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Ger tillbaka objektet på den efterfrågade positionen i en lista. #1 är det första objektet.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Ger tillbaka objektet på den efterfrågade positionen i en lista. #1 är det sista objektet.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returnerar det första objektet i en lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returnerar det sista objektet i en lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returnerar ett slumpmässigt objekt i en lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Tar bort och återställer objektet på den specificerade positionen i en lista. #1 är det första objektet.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Tar bort och återställer objektet på den specificerade positionen i en lista. #1 är det sista objektet.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Tar bort och återställer det första objektet i en lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Tar bort och återställer det sista objektet i en lista.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Tar bort och återställer ett slumpmässigt objekt i en lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Tar bort objektet på den specificerade positionen i en lista. #1 är det första objektet.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Tar bort objektet på den efterfrågade positionen i en lista. #1 är det sista objektet.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Tar bort det första objektet i en lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Tar bort det sista objektet i en lista.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Tar bort en slumpmässig post i en lista.", - "LISTS_SET_INDEX_SET": "ange", - "LISTS_SET_INDEX_INSERT": "Sätt in vid", - "LISTS_SET_INDEX_INPUT_TO": "som", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Sätter in objektet vid en specificerad position i en lista. #1 är det första objektet.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Sätter in objektet vid en specificerad position i en lista. #1 är det sista objektet.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Anger det första objektet i en lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Anger det sista elementet i en lista.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Sätter in ett slumpat objekt i en lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Sätter in objektet vid en specificerad position i en lista. #1 är det första objektet.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "sätter in objektet vid en specificerad position i en lista. #1 är det sista objektet.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "sätter in objektet i början av en lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Lägg till objektet i slutet av en lista.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "sätter in objektet på en slumpad position i en lista.", - "LISTS_GET_SUBLIST_START_FROM_START": "få underlista från #", - "LISTS_GET_SUBLIST_START_FROM_END": "få underlista från # från slutet", - "LISTS_GET_SUBLIST_START_FIRST": "få underlista från första", - "LISTS_GET_SUBLIST_END_FROM_START": "till #", - "LISTS_GET_SUBLIST_END_FROM_END": "till # från slutet", - "LISTS_GET_SUBLIST_END_LAST": "till sista", - "LISTS_GET_SUBLIST_TOOLTIP": "Skapar en kopia av den specificerade delen av en lista.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "skapa lista från text", - "LISTS_SPLIT_TEXT_FROM_LIST": "skapa text från lista", - "LISTS_SPLIT_WITH_DELIMITER": "med avgränsare", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Dela upp text till en textlista och bryt vid varje avgränsare.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Sammanfoga en textlista till en text, som separeras av en avgränsare.", - "VARIABLES_GET_TOOLTIP": "Returnerar värdet av denna variabel.", - "VARIABLES_GET_CREATE_SET": "Skapa \"välj %1\"", - "VARIABLES_SET": "välj %1 till %2", - "VARIABLES_SET_TOOLTIP": "Gör så att den här variabeln blir lika med inputen.", - "VARIABLES_SET_CREATE_GET": "Skapa 'hämta %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", - "PROCEDURES_DEFNORETURN_TITLE": "för att", - "PROCEDURES_DEFNORETURN_PROCEDURE": "göra något", - "PROCEDURES_BEFORE_PARAMS": "med:", - "PROCEDURES_CALL_BEFORE_PARAMS": "med:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Skapar en funktion utan output.", - "PROCEDURES_DEFRETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", - "PROCEDURES_DEFRETURN_RETURN": "returnera", - "PROCEDURES_DEFRETURN_TOOLTIP": "Skapar en funktion med output.", - "PROCEDURES_ALLOW_STATEMENTS": "tillåta uttalanden", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Varning: Denna funktion har dubbla parametrar.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Kör den användardefinierade funktionen \"%1\".", - "PROCEDURES_CALLRETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Kör den användardefinierade funktionen \"%1\" och använd resultatet av den.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "inmatningar", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Lägg till, ta bort och ändra ordningen för inmatningar till denna funktion.", - "PROCEDURES_MUTATORARG_TITLE": "inmatningsnamn:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Lägg till en inmatning till funktionen.", - "PROCEDURES_HIGHLIGHT_DEF": "Markera funktionsdefinition", - "PROCEDURES_CREATE_DO": "Skapa '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "Om ett värde är sant returneras ett andra värde.", - "PROCEDURES_IFRETURN_WARNING": "Varning: Detta block får användas endast i en funktionsdefinition." -} diff --git a/msg/json/ta.json b/msg/json/ta.json deleted file mode 100644 index 03b31352e5..0000000000 --- a/msg/json/ta.json +++ /dev/null @@ -1,304 +0,0 @@ -{ - "@metadata": { - "authors": [ - "ElangoRamanujam", - "Ezhillang", - "Karuthan", - "Thangamani-arun", - "Mahir78" - ] - }, - "VARIABLES_DEFAULT_NAME": "உருப்படி", - "TODAY": "இன்று", - "DUPLICATE_BLOCK": "மறுநகல்", - "ADD_COMMENT": "கருத்தை சேர்", - "REMOVE_COMMENT": "கருத்தை நீக்கு", - "EXTERNAL_INPUTS": "வெளி கருவிகளுடன் உள்ளீடு", - "INLINE_INPUTS": "சூழமைவில் உள்ளீடு", - "DELETE_BLOCK": "உறுப்பை நீக்கு", - "DELETE_X_BLOCKS": "%1 உறுப்பை நீக்கு", - "DELETE_ALL_BLOCKS": "அனைத்து %1 நிரல் துண்டுகளையும் அழிக்கவா??", - "COLLAPSE_BLOCK": "உறுப்பை மரை", - "COLLAPSE_ALL": "உறுப்புகளை மரை", - "EXPAND_BLOCK": "உறுப்பை காட்டு", - "EXPAND_ALL": "உறுப்புகளை காட்டு", - "DISABLE_BLOCK": "உறுப்பை இயங்காது செய்", - "ENABLE_BLOCK": "உறுப்பை இயங்குமாரு செய்", - "HELP": "உதவி", - "CHAT": "இந்தப் பெட்டியில் தட்டச்சு செய்வதன் மூலம் கூட்டுப்பணியாளருடன் உரையாடலாம்!", - "AUTH": "தயவுச்செய்து இச்செயலியை அங்கீகரித்து உங்கள் வேலையைச் சேமித்து பகிரரும்படி அனுமதிக்கவும்.", - "ME": "எனக்கு", - "CHANGE_VALUE_TITLE": "மதிப்பை மாற்றவும்:", - "NEW_VARIABLE": "புதிய மாறிலி...", - "NEW_VARIABLE_TITLE": "புதிய மாறிலியின் பெயர்:", - "RENAME_VARIABLE": "மாறிலியை மறுபெயரிடுக...", - "RENAME_VARIABLE_TITLE": "அனைத்து '%1' மாறிலிகளையும் பின்வருமாறு மறுபெயரிடுக:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "வண்ண தட்டிலிருந்து ஒரு நிறத்தைத் தேர்ந்தெடுக்கவும்.", - "COLOUR_RANDOM_TITLE": "தற்போக்கு நிறம்", - "COLOUR_RANDOM_TOOLTIP": "தற்போக்கில் ஒரு நிறத்தை தேர்ந்தெடுக்கவும்.", - "COLOUR_RGB_TITLE": "நிறத்துடன்", - "COLOUR_RGB_RED": "சிகப்பு", - "COLOUR_RGB_GREEN": "பச்சை", - "COLOUR_RGB_BLUE": "நீலம்", - "COLOUR_RGB_TOOLTIP": "குறிப்பிட்ட அளவு சிவப்பு,பச்சை மற்றும் நீலம் சேர்த்து புது நிறம் உருவாக்கு. மதிப்புகள் 0 முதல் 100 வரை மட்டுமே இருக்க வேண்டும்.", - "COLOUR_BLEND_TITLE": "கலப்பு (வண்ணம்)", - "COLOUR_BLEND_COLOUR1": "நிறம் 1", - "COLOUR_BLEND_COLOUR2": "நிறம் 2", - "COLOUR_BLEND_RATIO": "விகிதம்", - "COLOUR_BLEND_TOOLTIP": "கொடுக்கப்பட்ட விகதத்தில் (0.0 - 1.0) இரு நிறங்களை கலக்குக.", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "'%1' முரை திரும்ப செய்", - "CONTROLS_REPEAT_INPUT_DO": "செய்க", - "CONTROLS_REPEAT_TOOLTIP": "கட்டளைகளை பல முரை செய்ய", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "பலமுரை திரும்ப செய் (வரை)", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "பலமுரை திரும்ப செய் (முடயேனில்)", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "மாறி உண்மை ஆக உள்ள வரை, கட்டளைகளை இயக்கு", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "மாறி பொய் ஆக உள்ள வரை, கட்டளைகளை இயக்கு", - "CONTROLS_FOR_TOOLTIP": "முதல் எண்ணில் இருந்து கடை எண் வரை எடுத்துக்கொள்ள ஒரு மாறியை வைத்துக்கொள், குறித்த இடைவெளியை சேர்த்தவறே தொகுதிகளை செயலாக்கு.", - "CONTROLS_FOR_TITLE": "மாறியை வைத்து எண்ண %1 %2 இல் இருந்து %3 வரை %4-இன் படியாக", - "CONTROLS_FOREACH_TITLE": "உருப்படி ஒவ்வொன்றாக %1 பட்டியலில் உள்ள %2", - "CONTROLS_FOREACH_TOOLTIP": "பட்டியலில் உள்ள உருப்படியில் ஒவ்வொன்றாக, மாறியின் பொருள் '%1' ஆக வைக்க.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "மடக்கு கட்டளையை நிறுத்து.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "மடக்கு கட்டளையின் அடுத்த இயக்கநிலைக்கு செல்", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "மடக்கு கட்டளையின் இயக்கத்தில் இருந்து நிறுத்து.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "மடக்கு கட்டளையின் மீதியை விட்டுவிட்டு அடுத்த இயக்கநிலைக்கு செல்", - "CONTROLS_FLOW_STATEMENTS_WARNING": "எச்சரிக்கை : மடக்கு கூற்றில் இந்த தொகுதி ஒரு முறை மட்டுமே செயல்படுத்தப் படலாம்.", - "CONTROLS_IF_TOOLTIP_1": "மாறி உண்மை ஆக உள்ள வரை, கட்டளைகளை இயக்கு", - "CONTROLS_IF_TOOLTIP_2": "மாறி உண்மை ஆக உள்ள வரை, கட்டளைகளை இயக்கு. அல்லது மற்ற (அடுத்த) கட்டளைகளை இயக்கு.", - "CONTROLS_IF_TOOLTIP_3": "மாறி உண்மை ஆக உள்ள வரை, கட்டளைகளை தொகுப்பு இயக்கு. அல்லது மற்ற (அடுத்த) கட்டளைகளை தொகுப்பு இயக்கு.", - "CONTROLS_IF_TOOLTIP_4": "மாறி உண்மை ஆக உள்ள வரை, கட்டளைகளை தொகுப்பு இயக்கு. அல்லது மற்ற (அடுத்த) கட்டளைகளை தொகுப்பு இயக்கு. இரண்டும் இல்லை என்றால் கடைசி தொகுப்பு இயக்கு.", - "CONTROLS_IF_MSG_IF": "எனில்", - "CONTROLS_IF_MSG_ELSEIF": "இல்லைஆனால்", - "CONTROLS_IF_MSG_ELSE": "இல்லையெனில்", - "CONTROLS_IF_IF_TOOLTIP": "கட்டளைகளை தொகுப்பு திருத்துதம் செய்", - "CONTROLS_IF_ELSEIF_TOOLTIP": "ஆனால் தொகுப்பிற்கு நிபந்தனை சேர்க்க", - "CONTROLS_IF_ELSE_TOOLTIP": "ஆனால் தொகுப்பிற்கு விதிவிலக்கு காப்பை சேர்க்க", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "இரண்டு மாறியும் ஈடானால், மெய் பின்கொடு.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "இரண்டு மாறியும் ஈடாகாவிட்டால், மெய் பின்கொடு.", - "LOGIC_COMPARE_TOOLTIP_LT": "முதல் உள்ளீடு இரண்டாவதைவிட குறைவாக இருந்தால், மெய் பின்கொடு.", - "LOGIC_COMPARE_TOOLTIP_LTE": "முதல் உள்ளீடு இரண்டாவதைவிட குறைவாக அல்ல சமமாக இருந்தால், மெய் பின்கொடு", - "LOGIC_COMPARE_TOOLTIP_GT": "முதல் உள்ளீடு இரண்டாவதைவிட அதிகமாக இருந்தால், மெய் பின்கொடு.", - "LOGIC_COMPARE_TOOLTIP_GTE": "முதல் உள்ளீடு இரண்டாவதைவிட அதிகமாக அல்ல சமமாக இருந்தால், மெய் பின்கொடு.", - "LOGIC_OPERATION_TOOLTIP_AND": "இரண்டு மாறியும் மெய் ஆனால், மெய் பின்கொடு.", - "LOGIC_OPERATION_AND": "மற்றும்", - "LOGIC_OPERATION_TOOLTIP_OR": "ஏதேனும் ஒரு மதிப்பு மெய் ஆனால், மெய் பின்கொடு", - "LOGIC_OPERATION_OR": "அல்லது", - "LOGIC_NEGATE_TITLE": "%1 இல்லை", - "LOGIC_NEGATE_TOOLTIP": "மெய் ஆனால், பொய் பின்கொடு. பொய் ஆனால், மெய் பின்கொடு.", - "LOGIC_BOOLEAN_TRUE": "மெய்", - "LOGIC_BOOLEAN_FALSE": "பொய்", - "LOGIC_BOOLEAN_TOOLTIP": "மெய், அல்லது பொய் பின்கொடு.", - "LOGIC_NULL": "பூஜியம்", - "LOGIC_NULL_TOOLTIP": "பூஜியம் பின்கொடு", - "LOGIC_TERNARY_CONDITION": "சோதனை", - "LOGIC_TERNARY_IF_TRUE": "மெய்யெனில்", - "LOGIC_TERNARY_IF_FALSE": "பொய்யெனில்", - "LOGIC_TERNARY_TOOLTIP": "'test' உள்ள நிபந்தனையை சரிபார்க்கவும், நிபந்தனை மெய்யானால்,'if true'வை பின்கொடுக்கும் இல்லையெனில் 'if false'வை பின்கொடுக்கும்.", - "MATH_NUMBER_HELPURL": "https://ta.wikipedia.org/wiki/%E0%AE%8E%E0%AE%A3%E0%AF%8D", - "MATH_NUMBER_TOOLTIP": "ஒரு எண்.", - "MATH_ARITHMETIC_HELPURL": "https://ta.wikipedia.org/wiki/%E0%AE%8E%E0%AE%A3%E0%AF%8D%E0%AE%95%E0%AE%A3%E0%AE%BF%E0%AE%A4%E0%AE%AE%E0%AF%8D", - "MATH_ARITHMETIC_TOOLTIP_ADD": "இரு எண்களின் கூட்டை பின்கொடு", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "இரு எண்களின் கழிப்பை பின்கொடு", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "இரு எண்களின் பெருக்கலை பின்கொடு", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "இரு எண்களின் வகுத்தல் பின்கொடு", - "MATH_ARITHMETIC_TOOLTIP_POWER": "முதல் உள்ளீடு இரண்டாவது எண் அளவான அடுக்கு பெருக்கை கணித்து பின்கொடு.", - "MATH_SINGLE_HELPURL": "https://ta.wikipedia.org/wiki/%E0%AE%B5%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AE%AE%E0%AF%82%E0%AE%B2%E0%AE%AE%E0%AF%8D", - "MATH_SINGLE_OP_ROOT": "வர்க்கமூலம்", - "MATH_SINGLE_TOOLTIP_ROOT": "ஒரு எண்ணின் வர்க்கமூலத்தைத் தரும்.", - "MATH_SINGLE_OP_ABSOLUTE": "தனித்த", - "MATH_SINGLE_TOOLTIP_ABS": "ஒரு எண்ணின் தனித்த மதிப்பை பின்கொடு", - "MATH_SINGLE_TOOLTIP_NEG": "ஒரு எண்ணின் எதிர்மறை மதிப்பை பின்கொடு", - "MATH_SINGLE_TOOLTIP_LN": "ஒரு எண்ணின் (இயற்கை) மடக்கை மதிப்பை பின்கொடு.", - "MATH_SINGLE_TOOLTIP_LOG10": "ஒரு எண்ணின் (10) மடக்கை மதிப்பை பின்கொடு.", - "MATH_SINGLE_TOOLTIP_EXP": "e-இன் எண் அடுக்கு பெருக்கை பின்கொடு.", - "MATH_SINGLE_TOOLTIP_POW10": "10-இன் எண் அடுக்கு பெருக்கை பின்கொடு.", - "MATH_TRIG_HELPURL": "https://ta.wikipedia.org/wiki/%E0%AE%AE%E0%AF%81%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%8B%E0%AE%A3%E0%AE%B5%E0%AE%BF%E0%AE%AF%E0%AE%B2%E0%AF%8D_%E0%AE%9A%E0%AE%BE%E0%AE%B0%E0%AF%8D%E0%AE%AA%E0%AF%81%E0%AE%95%E0%AE%B3%E0%AF%8D", - "MATH_TRIG_TOOLTIP_SIN": "டிகிரீ சைன் மதிப்பை பின்கொடு.", - "MATH_TRIG_TOOLTIP_COS": "டிகிரீ கோசைன் மதிப்பை பின்கொடு", - "MATH_TRIG_TOOLTIP_TAN": "டிகிரீ டேஞ்சன்டு மதிப்பை பின்கொடு", - "MATH_TRIG_TOOLTIP_ASIN": "மதிப்பின் நேர்மாறு சைன் பின்கொடு", - "MATH_TRIG_TOOLTIP_ACOS": "மதிப்பின் நேர்மாறு கோசைன் பின்கொடு", - "MATH_TRIG_TOOLTIP_ATAN": "மதிப்பின் நேர்மாறு டேஞ்சன்டு பின்கொடு", - "MATH_CONSTANT_HELPURL": "https://ta.wikipedia.org/wiki/%E0%AE%95%E0%AE%A3%E0%AE%BF%E0%AE%A4_%E0%AE%AE%E0%AE%BE%E0%AE%B1%E0%AE%BF%E0%AE%B2%E0%AE%BF", - "MATH_CONSTANT_TOOLTIP": "ஒரு மாறிலியை பின்கொடு π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (முடிவிலி).", - "MATH_IS_EVEN": "2-ஆல் பகும்", - "MATH_IS_ODD": "2-ஆல் பகாத", - "MATH_IS_PRIME": "எண் பகாத்தனிதானதா?", - "MATH_IS_WHOLE": "எண் முழுதானதா?", - "MATH_IS_POSITIVE": "எண் நேர்ம முழுதானதா ?", - "MATH_IS_NEGATIVE": "எண் குறைவானதா ?", - "MATH_IS_DIVISIBLE_BY": "ஆல் வகுபடக் கூடியது", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "மாற்று %1 மூலம் %2", - "MATH_CHANGE_TOOLTIP": "எண்னை '%1' மதிப்பால் கூட்டு,", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "மேல்/கீழ் வழி முழு எண் ஆக மாற்று.", - "MATH_ROUND_OPERATOR_ROUND": "முழுமையாக்கு", - "MATH_ROUND_OPERATOR_ROUNDUP": "மேல்வழி முழுமையாக்கு", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "கீழ்வழி முழுமையாக்கு", - "MATH_ONLIST_OPERATOR_SUM": "பட்டியலின் கூட்டு", - "MATH_ONLIST_TOOLTIP_SUM": "முழு பட்டியலின் எண் சமம் பின்கொடு,", - "MATH_ONLIST_OPERATOR_MIN": "பட்டியலின் கறைவு", - "MATH_ONLIST_TOOLTIP_MIN": "பட்டியலின் குறைவான எண் பின்கொடு", - "MATH_ONLIST_OPERATOR_MAX": "பட்டியலின் மிகுதி", - "MATH_ONLIST_TOOLTIP_MAX": "பட்டியலின் அதிகமான எண் பின்கொடு", - "MATH_ONLIST_OPERATOR_AVERAGE": "பட்டியலின் எண் சராசரி", - "MATH_ONLIST_TOOLTIP_AVERAGE": "முழு பட்டியலின் எண் சராசரி பின்கொடு", - "MATH_ONLIST_OPERATOR_MEDIAN": "பட்டியலின் நடுக்கோடு", - "MATH_ONLIST_TOOLTIP_MEDIAN": "பட்டியலின் நடுக்கோடு பின்கொடு", - "MATH_ONLIST_OPERATOR_MODE": "பட்டியலின் பொதுவகைகள்", - "MATH_ONLIST_TOOLTIP_MODE": "பட்டியலின் பொதுவகைகள் பின்கொடு", - "MATH_ONLIST_OPERATOR_STD_DEV": "பட்டியலின் நியமவிலகல்", - "MATH_ONLIST_TOOLTIP_STD_DEV": "பட்டியலின் நியமவிலகலை பின்கொடு.", - "MATH_ONLIST_OPERATOR_RANDOM": "ஒரு பட்டியலில் இருந்து சீரற்ற உருப்படி", - "MATH_ONLIST_TOOLTIP_RANDOM": "ஒரு பட்டியலில் இருந்து சீரற்ற உருப்படி பின்கொடு", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "%1 ÷ %2ன் மீதி", - "MATH_MODULO_TOOLTIP": "இரண்டு எண்கள் மூலம் பிரிவில் இருந்து எஞ்சியதை பின்கொடு.", - "MATH_CONSTRAIN_TITLE": "%1 மாறியை %2 மேலும் %3 கீழும் வற்புறுத்து", - "MATH_CONSTRAIN_TOOLTIP": "எண் மாறி வீசுகளம் உள்ளடங்கிய வாறு வற்புறுத்து", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "வீசுகளம் %1 இல் இருந்து %2 உள்ளடங்கிய வாறு சீரற்ற எண்", - "MATH_RANDOM_INT_TOOLTIP": "வீசுகளம் இல் இருந்த (உள்ளடங்கிய) வாறு சீரற்ற எண் பின்கொடு.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "சீரற்ற எண் பின்னம்", - "MATH_RANDOM_FLOAT_TOOLTIP": "சீரற்ற எண் பின்னம், 0.0 இல் இருந்து 1.0 உட்பட, பின்கொடு.", - "TEXT_TEXT_HELPURL": "https://ta.wikipedia.org/wiki/%E0%AE%9A%E0%AE%B0%E0%AE%AE%E0%AF%8D_%28%E0%AE%95%E0%AE%A3%E0%AE%BF%E0%AE%A9%E0%AE%BF%E0%AE%AF%E0%AE%BF%E0%AE%AF%E0%AE%B2%E0%AF%8D%29", - "TEXT_TEXT_TOOLTIP": "எழுத்து, சரம், சொல், அல்லது உரை சொற்தொடர்.", - "TEXT_JOIN_TITLE_CREATEWITH": "வைத்து உரை உருவாக்க", - "TEXT_JOIN_TOOLTIP": "பல பொருட்களை ஒன்றாக சேர்வதன் மூலம் உரை உருவாக்க.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "சேர்க்க", - "TEXT_CREATE_JOIN_TOOLTIP": "தொகுப்பு உரை திருத்துதம் செய்", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "உருபடியை உரையில் சேர்க்க.", - "TEXT_APPEND_TO": "இந்த மாறியிற்கு", - "TEXT_APPEND_APPENDTEXT": "உரை சேர்க்க", - "TEXT_APPEND_TOOLTIP": "'%1' மாறியில் உரையை சேர்", - "TEXT_LENGTH_TITLE": "%1ன் நீளம்", - "TEXT_LENGTH_TOOLTIP": "தொடரில் உள்ள எழுத்துக்களின் (இடைவெளிகளையும் சேர்த்து) எண்ணிகையை பின்கொடு.", - "TEXT_ISEMPTY_TITLE": "%1 காலியானது", - "TEXT_ISEMPTY_TOOLTIP": "காலியானது என்றால் மெய் மதிப்பை பின்கொடு", - "TEXT_INDEXOF_TOOLTIP": "இரண்டாவது உரையில் முதல் உரையின் முதல்/கடை இருக்கை குறிஎண்ணை பின்கொடு.", - "TEXT_INDEXOF_INPUT_INTEXT": "உரையில்", - "TEXT_INDEXOF_OPERATOR_FIRST": "உரையில் முதல் தோற்ற இடத்தை பின்கொடு", - "TEXT_INDEXOF_OPERATOR_LAST": "உரையில் கடைசி தோற்ற இடத்தை பின்கொடு", - "TEXT_CHARAT_INPUT_INTEXT": "உரையில்", - "TEXT_CHARAT_FROM_START": "# எழுத்தை எடு", - "TEXT_CHARAT_FROM_END": "முடிவில் இருந்து # எழுத்தை எடு", - "TEXT_CHARAT_FIRST": "முதல் எழுத்தைப் பெறுக", - "TEXT_CHARAT_LAST": "இறுதி எழுத்தைப் பெறுக", - "TEXT_CHARAT_RANDOM": "சமவாய்ப்புள்ள எழுத்தை எடு", - "TEXT_CHARAT_TOOLTIP": "கூறிய இடத்தில் உள்ள எழுத்தை எடு", - "TEXT_GET_SUBSTRING_TOOLTIP": "உரையின் குறியிடப்பட்ட சரம் பின்கொடு", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "உரையில்", - "TEXT_GET_SUBSTRING_START_FROM_START": "-இல் உட்கணம் # எழுத்திலிருந்து", - "TEXT_GET_SUBSTRING_START_FROM_END": "-இல் உட்கணம் கடைசி # எழுத்திலிருந்து", - "TEXT_GET_SUBSTRING_START_FIRST": "-இல் உட்கணம் முதல் எழுத்திலிருந்து", - "TEXT_GET_SUBSTRING_END_FROM_START": "எழுத்து # வரை", - "TEXT_GET_SUBSTRING_END_FROM_END": "எழுத்து கடைசியில் இருந்து # வரை", - "TEXT_GET_SUBSTRING_END_LAST": "கடைசி எழுத்து வரை", - "TEXT_CHANGECASE_TOOLTIP": "உரை நகல் எடுத்து பொரிய/சின்ன எழுத்து மாற்றி பின்கொடு.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "பொரிய எழுத்துக்கு மாற்று", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "சின்ன எழுத்துக்கு மாற்று", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "தலைப்பு எழுத்துக்கு மாற்று", - "TEXT_TRIM_TOOLTIP": "உரை நகல் எடுத்து இடைவெளி எழுத்து நீக்கி பின்கொடு.", - "TEXT_TRIM_OPERATOR_BOTH": "இரு பக்கத்திலும் இடைவெளி எழுத்து நேர்த்தி செய்.", - "TEXT_TRIM_OPERATOR_LEFT": "இடது பக்கத்தில் இடைவெளி எழுத்து நேர்த்தி செய்.", - "TEXT_TRIM_OPERATOR_RIGHT": "வலது பக்கத்தில் இடைவெளி எழுத்து நேர்த்தி செய்.", - "TEXT_PRINT_TITLE": "%1 அச்சிடுக", - "TEXT_PRINT_TOOLTIP": "மதிப்பை அச்சிடு", - "TEXT_PROMPT_TYPE_TEXT": "உரை கொண்டு உரை-உள்ளீடு தூண்டுதலை காட்டு", - "TEXT_PROMPT_TYPE_NUMBER": "உரை கொண்டு எண்-உள்ளீடு தூண்டுதலை காட்டு", - "TEXT_PROMPT_TOOLTIP_NUMBER": "எண்-உள்ளீடு தூண்டுதலை காட்டு", - "TEXT_PROMPT_TOOLTIP_TEXT": "உரை-உள்ளீடு தூண்டுதலை காட்டு", - "LISTS_CREATE_EMPTY_TITLE": "காலி பட்டியல் உருவாக்க", - "LISTS_CREATE_EMPTY_TOOLTIP": "காலி பட்டியல் பின்கொடு.", - "LISTS_CREATE_WITH_TOOLTIP": "இவ்வளவு உருப்படிகளை கொண்டு வேண்டுமாலும் ஒரு பட்டியலை உருவாக்கு.", - "LISTS_CREATE_WITH_INPUT_WITH": "வைத்து பட்டியல் உருவாக்க", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "பட்டியல்", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "கட்டளைகளை தொகுப்பு திருத்துதம் செய்", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "பட்டியலில் ஒரு பொருளை சேர்க்க.", - "LISTS_REPEAT_TOOLTIP": "கொடுக்க பட்ட மதிப்பை, கூறியுள்ள தடவைகள் உள்ளவாறு ஒரு பட்டியலை உருவாக்கு", - "LISTS_REPEAT_TITLE": "உருப்படி %1-யை, %2 தடவைகள் உள்ளவாறு ஒரு பட்டியலை உருவாக்கு", - "LISTS_LENGTH_TITLE": "%1 இன் நீளம்", - "LISTS_LENGTH_TOOLTIP": "பட்டியல் நீளம் பின்கொடு", - "LISTS_ISEMPTY_TITLE": "%1 காலியானது", - "LISTS_ISEMPTY_TOOLTIP": "பட்டியல் காலியானது மெய் பின்கொடு,", - "LISTS_INLIST": "பட்டியலில் உள்ள", - "LISTS_INDEX_OF_FIRST": "உரையில் முதல் தோற்ற இடத்தை காட்டு", - "LISTS_INDEX_OF_LAST": "உரையில் கடைசி தோற்ற இடத்தை காட்டு", - "LISTS_INDEX_OF_TOOLTIP": "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் 0 பின்கொடு.", - "LISTS_GET_INDEX_GET": "எடு", - "LISTS_GET_INDEX_GET_REMOVE": "பெற்று நீக்குக", - "LISTS_GET_INDEX_REMOVE": "நீக்குக", - "LISTS_GET_INDEX_FROM_END": "கடைசியில் இருந்து #", - "LISTS_GET_INDEX_FIRST": "முதல்", - "LISTS_GET_INDEX_LAST": "கடைசி", - "LISTS_GET_INDEX_RANDOM": "ஏதோ ஒன்று", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "பட்டியலில் இடத்தில் உருப்படி பின்கொடு. #1 முதல் உருப்படி.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "பட்டியலில் இடத்தில் உருப்படி பின்கொடு. #1 முதல் உருப்படி.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "பட்டியல் முதல் உருப்படியை பின்கொடு,", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "பட்டியல் கடைசி உருப்படியை பின்கொடு,", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "பட்டியல் சீரற்ற உருப்படியை பின்கொடு,", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு. #1 கடைசி உருப்படி.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு. #1 கடைசி உருப்படி.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "பட்டியல் முதல் உருப்படியை நீக்கியபின் பின்கொடு,", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "பட்டியல் இறுதி உருப்படியை நீக்கியபின் பின்கொடு,", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "பட்டியல் சீரற்ற உருப்படியை நீக்கியபின் பின்கொடு,", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கு. #1 முதல் உருப்படி.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "பட்டியலில் கேட்ட இடத்தின் உருப்படியை நீக்கு. #1 கடைசி உருப்படி.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "பட்டியலில் முதல் உருப்படியை நீக்கு", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "பட்டியலில் கடைசி உருப்படியை நீக்கு", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "பட்டியல் சீரற்ற உருப்படியை நீக்கு,", - "LISTS_SET_INDEX_SET": "நியமி", - "LISTS_SET_INDEX_INSERT": "அவ்விடத்தில் நுழை", - "LISTS_SET_INDEX_INPUT_TO": "இதுபொல", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை. #1, முதல் உருப்படி.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை. #1, கடைசி உருப்படி.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "மதிப்பை பட்டியலில் முதல் உருப்படியில் வை", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "மதிப்பை பட்டியலில் கடைசி உருப்படியில் வை", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "மதிப்பை பட்டியலில் சீரற்ற உருப்படியில் வை", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை. #1, முதல் உருப்படி.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை. #1, கடைசி உருப்படி.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "மதிப்பை பட்டியலின் முதலில் நுழை", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "மதிப்பை பட்டியலின் முடிவில் நுழை", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "மதிப்பை பட்டியலின் சீற்ற இடத்தில் நுழை", - "LISTS_GET_SUBLIST_START_FROM_START": "பகுதி பட்டியலை # இடத்தில் இருந்து கொடு", - "LISTS_GET_SUBLIST_START_FROM_END": "# கடைசியில் இருந்து பகுதி பட்டியலை கொடு", - "LISTS_GET_SUBLIST_START_FIRST": "# முதலில் இருந்து பகுதி பட்டியலை கொடு", - "LISTS_GET_SUBLIST_END_FROM_START": "# வரை", - "LISTS_GET_SUBLIST_END_FROM_END": "முடிவில் இருந்து # வரை", - "LISTS_GET_SUBLIST_END_LAST": "முடிவு வரை", - "LISTS_GET_SUBLIST_TOOLTIP": "குறிப்பட்ட பகுதி பட்டியலின் நகலை கொடு", - "LISTS_SPLIT_LIST_FROM_TEXT": "உரையில் இருந்து பட்டியல் உருவாக்கு", - "LISTS_SPLIT_TEXT_FROM_LIST": "பட்டியலில் இருந்து உரை உருவாக்கு", - "LISTS_SPLIT_WITH_DELIMITER": "தடை எழுத்து", - "LISTS_SPLIT_TOOLTIP_SPLIT": "உரையை வரம்புச் சுட்டி கொண்டு துண்டாக்கு.", - "LISTS_SPLIT_TOOLTIP_JOIN": "வரம்புச் சுட்டியை இடையில் இட்டு, உரைதுண்டுகளை ஒன்று சேர்", - "VARIABLES_GET_TOOLTIP": "இந்த மாறி மதிப்பை பின்கொடு", - "VARIABLES_GET_CREATE_SET": "'%1 நியமி' உருவாக்கு", - "VARIABLES_SET": "நியமி %1 இந்த மாறியிற்கு %2", - "VARIABLES_SET_TOOLTIP": "மாறியின் மதிப்பாய் உள்ளீட்டு மதிப்பை வை.", - "VARIABLES_SET_CREATE_GET": "'எடு %1' உருவாக்கு", - "PROCEDURES_DEFNORETURN_TITLE": "இந்த மாறியிற்கு", - "PROCEDURES_DEFNORETURN_PROCEDURE": "கட்டளைகள் செய்ய (இடம்காட்டி)", - "PROCEDURES_BEFORE_PARAMS": "இத்துடன்", - "PROCEDURES_CALL_BEFORE_PARAMS": "இத்துடன்:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "வெளியீடு இல்லாத ஒரு செயல்பாடு உருவாக்குகிறது", - "PROCEDURES_DEFRETURN_RETURN": "பின்கொடு", - "PROCEDURES_DEFRETURN_TOOLTIP": "வெளியீடு உள்ள ஒரு செயல்பாடு உருவாக்குகிறது", - "PROCEDURES_ALLOW_STATEMENTS": "வாக்குமூலங்களை அனுமதிக்கவும்", - "PROCEDURES_DEF_DUPLICATE_WARNING": "எச்சரிக்கை: இந்த செயற்கூறில் போலியான அளபுருக்கள் உண்டு.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "பயனரின் '%1' செயற்கூற்றை ஓட்டு.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "பயனரின் '%1' செயற்கூற்றை ஓட்டி வரும் வெளியீட்டை பயன்படுத்து.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "உள்ளீடுகள்", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "செயல்கூறுகளின் உள்ளீட்டை சேர், நீக்கு, or மீண்டும் வரிசை செய்.", - "PROCEDURES_MUTATORARG_TITLE": "பெயரை உள்ளிடுக:", - "PROCEDURES_MUTATORARG_TOOLTIP": "செயல்கூறுக்கு ஒரு உள்ளீட்டை சேர்.", - "PROCEDURES_HIGHLIGHT_DEF": "நிரல்பாகத்தை விளக்கமாக காட்டு", - "PROCEDURES_CREATE_DO": "'%1' உருவாக்குக", - "PROCEDURES_IFRETURN_TOOLTIP": "மதிப்பு உண்மையானால், இரண்டாவது மதிப்பை பின்கொடு." -} diff --git a/msg/json/tcy.json b/msg/json/tcy.json deleted file mode 100644 index 94b8e1eec3..0000000000 --- a/msg/json/tcy.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Vishwanatha Badikana", - "Bharathesha Alasandemajalu" - ] - }, - "VARIABLES_DEFAULT_NAME": "ವಸ್ತು", - "TODAY": "ಇನಿ", - "DUPLICATE_BLOCK": "ನಕಲ್", - "ADD_COMMENT": "ಟಿಪ್ಪಣಿ ಸೇರ್ಸಲೆ", - "REMOVE_COMMENT": "ಟಿಪ್ಪಣಿನ್ ದೆತ್ತ್‌ಪಾಡ್ಲೆ", - "EXTERNAL_INPUTS": "ಬಾಹ್ಯೊ ಪರಿಕರೊ", - "INLINE_INPUTS": "ಉಳಸಾಲ್‍ದ ಉಳಪರಿಪು", - "DELETE_BLOCK": "ಮಾಜಯರ ತಡೆಯಾತ್ಂಡ್", - "DELETE_X_BLOCKS": "ಮಾಜಯರ ಶೇಕಡಾ ೧ ತಡೆಯಾತ್ಂಡ್", - "COLLAPSE_BLOCK": "ಕುಗ್ಗಿಸಾದ್ ತಡೆಪತ್ತುನೆ", - "COLLAPSE_ALL": "ಕುಗ್ಗಿಸಾದ್ ನಿರ್ಬಂಧಿಸಾಪುನೆ", - "EXPAND_BLOCK": "ವಿಸ್ತರಿಸಾದ್ ತಡೆಪತ್ತುನೆ", - "EXPAND_ALL": "ವಿಸ್ತರಿಸಾದ್ ನಿರ್ಬಂದಿಸಾಪುನೆ", - "DISABLE_BLOCK": "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಾದ್ ತಡೆಪತ್ತುನೆ", - "ENABLE_BLOCK": "ಸಕ್ರಿಯಗೊಳಿಸಾದ್ ತಡೆಪತ್ತುನೆ", - "HELP": "ಸಹಾಯೊ", - "CHAT": "ನಿಕ್ಲೆನ ಸಹಬೋಗಿನೊಟ್ಟುಗೆ ಈ ಪೆಟ್ಟಿಗೆಡ್ ಚಾಟಿಂಗ್‍ ನಮೂದು ಮಲ್ಪುಲೆ", - "AUTH": "ಈರೆನ ಕೆಲಸೊನು ಒರಿಪಾಯರೆ ಬುಕ್ಕೊ ಈರೆನಟ್ಟುಗು ಪಟ್ಟೊನುಯರೆ ಅವಕಾಸೊ.", - "ME": "ಯಾನ್", - "CHANGE_VALUE_TITLE": "ಮೌಲ್ಯೊದ ಬದಲಾವಣೆ", - "NEW_VARIABLE": "ಪೊಸ ಬದಲಾವಣೆ", - "NEW_VARIABLE_TITLE": "ಪುದರ್‍ದ ಪೊಸ ಬದಲಾವಣೆ:", - "RENAME_VARIABLE": "ಬದಲಾವಣೆ ಆಯಿನ ಪುದರ್‍ನ್ ನಾನೊರೊ ಪನ್ಲೆ", - "RENAME_VARIABLE_TITLE": "ನಾನೊರೊ ಪುದರ್ ಬದಲಾವಣೆ ಆಯಿನ ಮಾಂತ '% 1':", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/ಬಣ್ಣೊ", - "COLOUR_PICKER_TOOLTIP": "ವರ್ಣಫಲಕೊದ ಒಂಜಿ ಬಣ್ಣೊದ ಆಯ್ಕೆ.", - "COLOUR_RANDOM_TITLE": "ಯಾದೃಚ್ಛಿಕೊ ಬಣ್ಣೊ", - "COLOUR_RANDOM_TOOLTIP": "ಯಾದೃಚ್ಛಿಕವಾಯಿನ ಬಣ್ಣೊದ ಆಯ್ಕೆ.", - "COLOUR_RGB_TITLE": "ಬಣ್ಣೊದೊಟ್ಟುಗೆ", - "COLOUR_RGB_RED": "ಕೆಂಪು ಬಣ್ಣೊ", - "COLOUR_RGB_GREEN": "ಪಚ್ಚೆ", - "COLOUR_RGB_BLUE": "ನೀಲಿ", - "COLOUR_RGB_TOOLTIP": "ತೋಜಿಪಾಯಿನ ಕೆಂಪು, ಪಚ್ಚೆ ಬುಕ್ಕೊ ನೀಲಿ ಬಣ್ಣೊದ ಪ್ರಮಾಣೊನು ರಚಿಸಲೆ. ಮಾಂತ ಮೌಲ್ಯೊಲು 0 ಬುಕ್ಕೊ 100 ನಡುಟೆ ಇಪ್ಪೊಡು.", - "COLOUR_BLEND_TITLE": "ಮಿಸ್ರನೊ", - "COLOUR_BLEND_COLOUR1": "ಬಣ್ಣೊ ೧(ಒಂಜಿ)", - "COLOUR_BLEND_COLOUR2": "ಬಣ್ಣೊ ೨(ರಡ್ಡ್)", - "COLOUR_BLEND_RATIO": "ಅನುಪಾತೊ", - "COLOUR_BLEND_TOOLTIP": "ಕೊರ್‍ನ ಅನುಪಾತೊದ ಒಟ್ಟುಗೆ (0.0- 1.0 ) ರಡ್ಡ್ ಬಣ್ಣೊಲೆನ್ ಜೊತೆಟ್ ಒಂಜಿ ಮಲ್ಪುಂಡು.", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "ನಾನೊರೊ %1 ಸಮಯೊಗು", - "CONTROLS_REPEAT_INPUT_DO": "ಮಲ್ಪು / ಅಂಚನೆ", - "CONTROLS_REPEAT_TOOLTIP": "ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಸ್ತ್ ಸಮಯೊ ಮಲ್ಪೊಡು", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ಬುಕ್ಕೊ ಅಂಚನೇ", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ಬುಕ್ಕೊ ಮುಟ್ಟೊ", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "ಈ ತಿರ್ತ್‌ದ ಸರಿ ಇತ್ತ್ಂಡಲಾ, ಬುಕ್ಕೊದ ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಪುಲ", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "ಈ ತಿರ್ತ್‍ದ ತಪ್ಪಾದುಂಡು, ಬುಕ್ಕೊದ ಕೆಲವು ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಪಪುಲ", - "CONTROLS_FOR_TOOLTIP": "ಸುರೂತ ನಂಬ್ರೊಡ್ದು ಅಕೇರಿದ ನಂಬ್ರೊಗು ಬಿಲೆಟ್ ಮಸ್ತ್ ಹೆಚ್ಚ್‌ಕಮ್ಮಿ ಇತ್ತ್ಂಡಲಾ %1 ದೆತೊಂದ್, ನಿರ್ದಿಸ್ಟೊ ಮಧ್ಯಂತರೊದ ಮೂಲಕೊ ಲೆಕ್ಕೊದೆತೊಂದು ಬುಕ್ಕೊ ನಿಗಂಟ್ ಮಲ್ತ್‌ನ ಬ್ಲಾಕ್‍ಲೆನ್ ಲೆಕ್ಕೊ ಮಲ್ಪುಲ.", - "CONTROLS_FOREACH_TOOLTIP": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಪ್ರತಿ ವಸ್ತುಗು, ಜೋಡಾಯಿನ ವಸ್ತು ಬದಲಾಪುನಂಚ '% 1', ಬುಕ್ಕೊ ಒಂತೆ ಹೇಳಿಕೆಲೆನ್ ಮಲ್ಲಪುಲೆ.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ಕುಣಿಕೆದ ಪಿದಯಿ ತುಂಡಾಪುಂಡು", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ದುಂಬುದ ಆದೇಸೊಡೆ ಪುನರಾವರ್ತನೆ ದುಂಬರಿಪ್ಪುಂಡು", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "ಬಳಕೆಡುಪ್ಪುನ ಕೊಲಿಕೆಡ್ದ್ ಪಿದಯಿ ಪಾಡ್‍ಲೆ", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "ದುಂಬುದ ಆವೃತಿಡ್ ಉಪ್ಪುನಂಚನೆ ಮಾಂತ ಕೊಲಿಕೆಲೆನ್ ದೆತ್ಪುಲೆ ಬುಕ್ಕೊ ದುಂಬರಿಲೆ", - "CONTROLS_FLOW_STATEMENTS_WARNING": "ಎಚ್ಚರೊ: ಈ ನಿರ್ಬಂದೊನು ಕೇವಲ ಒಂಜಿ ಕೊಲಿಕೆದಾಕಾರೊದ ಮುಕ್ತಮಾರ್ಗೊದ ಪರಿಮಿತಿದುಲಯಿಡ್ ಬಳಸೊಲಿ", - "CONTROLS_IF_TOOLTIP_1": "ಇಂದೆತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಬುಕ್ಕೊ ಒಂತೆ ನಿರೂಪಣೆಲೆನ್ ಮಲ್ಪುಲೆ", - "CONTROLS_IF_TOOLTIP_2": "ಇಂದೆತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಬುಕ್ಕೊದ ನಿರೂಪಣೆಲೆನ್ ಸುರೂಕು ಮಲ್ಪುಲೆ. ಅತ್ತಂಡ ರಡ್ಡನೆದ ನಿರೂಪಣೆನ್ ತಡೆ ಪತ್ತುನಂಚನೆ ಮಲ್ಲಪುಲೆ", - "CONTROLS_IF_TOOLTIP_3": "ಸುರೂತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಬುಕ್ಕೊದ ನಿರೂಪಣೆಲೆನ್ ಸುರೂಕು ತಡೆ ಮಲ್ಪುಲೆ. ಅತ್ತಂಡ ರಡ್ಡನೆದ ನಿರೂಪಣೆನ್ ನಿಜವಾದಿತ್ತ್‌ಂಡ ಬುಕ್ಕೊ ಒಂತೆ ನಿರೂಪಣೆಲೆನ್ ಮಲ್ಪುಲೆ", - "CONTROLS_IF_TOOLTIP_4": "ಸುರೂತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಸುರೂತ ನಿರೂಪಣೆನ್ ತಡೆ ಮಲ್ಪುಲೆ. ರಡ್ಡನೆದ ನಿರೂಪಣೆ ನಿಜವಾದಿತ್ತ್ಂಡ, ರಡ್ಡನೆದ ನಿರೂಪಣೆನ್ ತಡೆ ಮಲ್ಪುಲೆ. ಉಂದು ಒವ್ವೇ ಮೌಲ್ಯೊ ನಿಜವಾದಿದ್ಯಂಡ, ಅಕೇರಿದ ನಿರೂಪಣೆನ್ ತಡೆ ಮಲ್ಪುಲೆ.", - "CONTROLS_IF_MSG_IF": "ಒಂಜಿ ವೇಲೆ", - "CONTROLS_IF_MSG_ELSEIF": "ಬೇತೆ ಸಮಯೊ", - "CONTROLS_IF_MSG_ELSE": "ಬೇತೆ", - "CONTROLS_IF_IF_TOOLTIP": "ಸೇರಲ, ದೆತ್ತ್‌ ಪಾಡ್‌ಲ, ಅತ್ತಂಡ ಒಂಜಿ ವೇಲೆ ಈ ರಚನೆನ್ ತಡೆದ್, ಇಂದೆತ ಇಬಾಗೊಲೆನ್ ಬೇತೆ ಕ್ರಮೊಟು ಮಲ್ಪುಲೆ", - "CONTROLS_IF_ELSEIF_TOOLTIP": "ಒಂಜಿ ವೇಲೆ ಒಂಜಿ ತಡೆಕ್ ಈ ಪರಿಸ್ಥಿತಿನ್ ಸೇರಲೆ", - "CONTROLS_IF_ELSE_TOOLTIP": "ಒಂಜಿ ವೇಲೆ ಮಾಂತೆನ್ಲಾ ದೀಡೊಂದು ಅಕೇರಿದ ಪರಿಸ್ಥಿಡ್ ಸೇರಲೆ", - "LOGIC_OPERATION_AND": "ಬುಕ್ಕೊ", - "LOGIC_OPERATION_OR": "ಅತ್ತಂಡ", - "LOGIC_BOOLEAN_TRUE": "ಸತ್ಯೊ", - "LOGIC_BOOLEAN_FALSE": "ಸುಲ್ಲು", - "LOGIC_NULL": "ಸೊನ್ನೆ", - "LOGIC_NULL_TOOLTIP": "ಸೊನ್ನೆನ್ ಪರಿಕೊರ್ಪುಂಡು", - "LOGIC_TERNARY_CONDITION": "ಪರೀಕ್ಷೆ", - "LOGIC_TERNARY_IF_TRUE": "ಒಂಜಿ ವೇಲೆ ಸತ್ಯೊ", - "LOGIC_TERNARY_IF_FALSE": "ಒಂಜಿ ವೇಲೆ ಸುಳ್ಳು", - "MATH_NUMBER_TOOLTIP": "ಅ ನಂಬ್ರೊ", - "MATH_SINGLE_OP_ROOT": "ವರ್ಗಮೂಲೊ", - "MATH_SINGLE_OP_ABSOLUTE": "ಸಂಪೂರ್ನೊ", - "MATH_IS_EVEN": "ಸಮೊ ಆತ್ಂಡ್", - "MATH_IS_ODD": "ಬೆಸೊ ಆತ್ಂಡ್", - "MATH_IS_PRIME": "ಎಡ್ಡೆ ಆತ್ಂಡ್", - "MATH_IS_WHOLE": "ಮಾಂತ ಆತ್ಂಡ್", - "MATH_IS_POSITIVE": "ಗುನೊ ಆತ್ಂಡ್", - "MATH_IS_NEGATIVE": "ರುನೊ ಆತ್ಂಡ್", - "MATH_ROUND_OPERATOR_ROUND": "ಸುತ್ತು", - "MATH_ROUND_OPERATOR_ROUNDUP": "ಮುಗಿಪುನ ಸಮಯೊ", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "ಸುತ್ತು ಕಡಮೆ", - "MATH_ONLIST_OPERATOR_SUM": "ಒಟ್ಟು ಕೂಡಯಿನಾ ಪಟ್ಟಿ", - "MATH_ONLIST_TOOLTIP_SUM": "ಪಟ್ಟಿದಾ ಮಾಂತ ಸಂಕ್ಯೆಲೆನ್ ಪಿರಕೊರ್ಲೆ", - "MATH_ONLIST_OPERATOR_MIN": "ಕಿನ್ಯ ಪಟ್ಟಿ", - "MATH_ONLIST_OPERATOR_AVERAGE": "ಸರಾಸರಿ ಪಟ್ಟಿ", - "MATH_ONLIST_TOOLTIP_AVERAGE": "ಪಟ್ಟಿಡುಪ್ಪುನ ಸರ್ವಸಾಧಾರಣ ಬಿಲೆನ್ ಪಿರಕೋರ್ಲೆ", - "MATH_ONLIST_OPERATOR_MODE": "ಪಟ್ಟಿದ ಇದಾನೊಲು", - "MATH_ONLIST_OPERATOR_STD_DEV": "ಕಬರ್ ಪಟ್ಟಿದ ಪ್ರಮಾನೊ", - "MATH_ONLIST_OPERATOR_RANDOM": "ಗೊತ್ತುಗುರಿ ದಾಂತಿನ ಅಂಸೊದ ಪಟ್ಟಿ", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "ಗೊತ್ತುಗುರಿ ದಾಂತಿನ ಬಾಗೊ", - "TEXT_JOIN_TITLE_CREATEWITH": "ಪಟ್ಯೊನು ರಚನೆ ಮಲ್ಪು", - "TEXT_CREATE_JOIN_TITLE_JOIN": "ಸೇರೊಲಿ", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "ಪಟ್ಯೊಡು ಅಂಸೊಲೆನ್ ಸೇರಲೆ", - "TEXT_APPEND_TO": "ಇಂದೆಕ್", - "TEXT_APPEND_APPENDTEXT": "ಪಟ್ಯೊನು ಸೇರವೆ", - "TEXT_LENGTH_TITLE": "೧% ಉದ್ದೊ", - "TEXT_ISEMPTY_TITLE": "%1 ಕಾಲಿ", - "TEXT_INDEXOF_INPUT_INTEXT": "ಪಟ್ಯೊಡು", - "TEXT_INDEXOF_OPERATOR_LAST": "ದುಂಬು ಕರಿನ ಪಟ್ಯೊನು ನಾಡ್‍ಲೆ", - "TEXT_CHARAT_INPUT_INTEXT": "ಪಟ್ಯೊಡು", - "TEXT_CHARAT_FROM_START": "ಅಕ್ಸರೊನು ದೆತೊನುಲೆ#" -} diff --git a/msg/json/th.json b/msg/json/th.json deleted file mode 100644 index 5041fb8ed0..0000000000 --- a/msg/json/th.json +++ /dev/null @@ -1,300 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Azpirin", - "Octahedron80" - ] - }, - "VARIABLES_DEFAULT_NAME": "รายการ", - "TODAY": "วันนี้", - "DUPLICATE_BLOCK": "ทำซ้ำ", - "ADD_COMMENT": "ใส่คำอธิบาย", - "REMOVE_COMMENT": "เอาคำอธิบายออก", - "EXTERNAL_INPUTS": "อินพุตภายนอก", - "INLINE_INPUTS": "อินพุตในบรรทัด", - "DELETE_BLOCK": "ลบบล็อก", - "DELETE_X_BLOCKS": "ลบ %1 บล็อก", - "DELETE_ALL_BLOCKS": "ต้องการลบบล็อกทั้ง %1 บล็อกใช่หรือไม่?", - "COLLAPSE_BLOCK": "ย่อบล็อก", - "COLLAPSE_ALL": "ย่อบล็อก", - "EXPAND_BLOCK": "ขยายบล็อก", - "EXPAND_ALL": "ขยายบล็อก", - "DISABLE_BLOCK": "ปิดใช้งานบล็อก", - "ENABLE_BLOCK": "เปิดใช้งานบล็อก", - "HELP": "ช่วยเหลือ", - "CHAT": "คุยกับผู้ร่วมงานของคุณโดยพิมพ์ลงในกล่องนี้!", - "AUTH": "กรุณาอนุญาตแอปนี้เพื่อเปิดใช้งาน การบันทึกงานของคุณ และยินยอมให้คุณแบ่งปันงานของคุณได้", - "ME": "ฉัน", - "CHANGE_VALUE_TITLE": "เปลี่ยนค่า:", - "NEW_VARIABLE": "สร้างตัวแปร...", - "NEW_VARIABLE_TITLE": "ชื่อตัวแปรใหม่:", - "RENAME_VARIABLE": "เปลี่ยนชื่อตัวแปร...", - "RENAME_VARIABLE_TITLE": "เปลี่ยนชื่อตัวแปร '%1' ทั้งหมดเป็น:", - "COLOUR_PICKER_HELPURL": "https://th.wikipedia.org/wiki/สี", - "COLOUR_PICKER_TOOLTIP": "เลือกสีจากจานสี", - "COLOUR_RANDOM_TITLE": "สุ่มสี", - "COLOUR_RANDOM_TOOLTIP": "เลือกสีแบบสุ่ม", - "COLOUR_RGB_TITLE": "สีที่ประกอบด้วย", - "COLOUR_RGB_RED": "ค่าสีแดง", - "COLOUR_RGB_GREEN": "ค่าสีเขียว", - "COLOUR_RGB_BLUE": "ค่าสีน้ำเงิน", - "COLOUR_RGB_TOOLTIP": "สร้างสีด้วยการกำหนดค่าสีแดง เขียว และน้ำเงิน ค่าทั้งหมดต้องอยู่ระหว่าง 0 ถึง 100", - "COLOUR_BLEND_TITLE": "ผสม", - "COLOUR_BLEND_COLOUR1": "สีที่ 1", - "COLOUR_BLEND_COLOUR2": "สีที่ 2", - "COLOUR_BLEND_RATIO": "อัตราส่วน", - "COLOUR_BLEND_TOOLTIP": "ผสมสองสีเข้าด้วยกันด้วยอัตราส่วน (0.0 - 1.0)", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "ทำซ้ำ %1 ครั้ง", - "CONTROLS_REPEAT_INPUT_DO": "ทำ:", - "CONTROLS_REPEAT_TOOLTIP": "ทำซ้ำบางคำสั่งหลายครั้ง", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ทำซ้ำตราบเท่าที่", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ทำซ้ำจนกระทั่ง", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "ตราบเท่าที่ค่าเป็นจริง ก็จะทำบางคำสั่ง", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "ตราบเท่าที่ค่าเป็นเท็จ ก็จะทำบางคำสั่ง", - "CONTROLS_FOR_TOOLTIP": "ตัวแปร \"%1\" จะมีค่าตั้งแต่จำนวนเริ่มต้น ไปจนถึงจำนวนสิ้นสุด โดยมีการเปลี่ยนแปลงตามจำนวนที่กำหนด", - "CONTROLS_FOR_TITLE": "นับ %1 จาก %2 จนถึง %3 เปลี่ยนค่าทีละ %4", - "CONTROLS_FOREACH_TITLE": "วนซ้ำทุกรายการ %1 ในรายการ %2", - "CONTROLS_FOREACH_TOOLTIP": "ทำซ้ำทุกรายการ กำหนดค่าตัวแปร \"%1\" ตามรายการ และทำตามคำสั่งที่กำหนดไว้", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ออกจากการวนซ้ำ", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "เริ่มการวนซ้ำรอบต่อไป", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "ออกจากการวนซ้ำที่มีอยู่", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "ข้ามสิ่งที่เหลืออยู่ และไปเริ่มวนซ้ำรอบต่อไปทันที", - "CONTROLS_FLOW_STATEMENTS_WARNING": "ระวัง: บล็อกชนิดนี้สามารถใช้งานได้เมื่ออยู่ภายในการวนซ้ำเท่านั้น", - "CONTROLS_IF_TOOLTIP_1": "ว่าเงื่อนไขเป็นจริง ก็จะ \"ทำ\" ตามที่กำหนด", - "CONTROLS_IF_TOOLTIP_2": "ถ้าเงื่อนไขเป็นจริง ก็จะ \"ทำ\" ตามที่กำหนด แต่ถ้าเงื่อนไขเป็นเท็จก็จะทำ \"นอกเหนือจากนี้\"", - "CONTROLS_IF_TOOLTIP_3": "ถ้าเงื่อนไขแรกเป็นจริง ก็จะทำตามคำสั่งในบล็อกแรก แต่ถ้าไม่ก็จะไปตรวจเงื่อนไขที่สอง ถ้าเงื่อนไขที่สองเป็นจริง ก็จะทำตามเงื่อนไขในบล็อกที่สองนี้", - "CONTROLS_IF_TOOLTIP_4": "ถ้าเงื่อนไขแรกเป็นจริง ก็จะทำคำสั่งในบล็อกแรก จากนั้นจะข้ามคำสั่งในบล็อกที่เหลือ แต่ถ้าเงื่อนไขแรกเป็นเท็จ ก็จะทำการตรวจเงื่อนไขที่สอง ถ้าเงื่อนไขที่สองเป็นจริง ก็จะทำตามคำสั่งในบล็อกที่สอง จากนั้นจะข้ามคำสั่งในบล็อกที่เหลือ แต่ถ้าทั้งเงื่อนไขแรกและเงื่อนไขที่สองเป็นเท็จทั้งหมด ก็จะมาทำบล็อกที่สาม", - "CONTROLS_IF_MSG_IF": "ถ้า", - "CONTROLS_IF_MSG_ELSEIF": "นอกเหนือจากนี้ ถ้า", - "CONTROLS_IF_MSG_ELSE": "นอกเหนือจากนี้", - "CONTROLS_IF_IF_TOOLTIP": "เพิ่ม ลบ หรือจัดเรียงบล็อก \"ถ้า\" นี้ใหม่", - "CONTROLS_IF_ELSEIF_TOOLTIP": "กำหนดเงื่อนไขของบล็อก \"ถ้า\"", - "CONTROLS_IF_ELSE_TOOLTIP": "เพิ่มสิ่งสุดท้าย ที่จะตรวจจับความเป็นไปได้ทั้งหมดของบล็อก \"ถ้า\"", - "LOGIC_COMPARE_HELPURL": "https://th.wikipedia.org/wiki/อสมการ", - "LOGIC_COMPARE_TOOLTIP_EQ": "คืนค่าเป็น \"จริง\" ถ้าค่าที่ใส่ทั้งสองค่านั้นเท่ากัน", - "LOGIC_COMPARE_TOOLTIP_NEQ": "คืนค่าเป็น \"จริง\" ถ้าค่าที่ใส่ทั้งสองค่านั้นไม่เท่ากัน", - "LOGIC_COMPARE_TOOLTIP_LT": "คืนค่าเป็น \"จริง\" ถ้าค่าแรกน้อยกว่าค่าที่สอง", - "LOGIC_COMPARE_TOOLTIP_LTE": "คืนค่าเป็น \"จริง\" ถ้าค่าแรกน้อยกว่าหรือเท่ากับค่าที่สอง", - "LOGIC_COMPARE_TOOLTIP_GT": "คืนค่าเป็น \"จริง\" ถ้าค่าแรกมากกว่าค่าที่สอง", - "LOGIC_COMPARE_TOOLTIP_GTE": "คืนค่าเป็น \"จริง\" ถ้าค่าแรกมากกว่าหรือเท่ากับค่าที่สอง", - "LOGIC_OPERATION_TOOLTIP_AND": "คืนค่าเป็น \"จริง\" ถ้าค่าทั้งสองค่าเป็นจริง", - "LOGIC_OPERATION_AND": "และ", - "LOGIC_OPERATION_TOOLTIP_OR": "คืนค่าเป็น \"จริง\" ถ้ามีอย่างน้อยหนึ่งค่าที่เป็นจริง", - "LOGIC_OPERATION_OR": "หรือ", - "LOGIC_NEGATE_TITLE": "ไม่ %1", - "LOGIC_NEGATE_TOOLTIP": "คืนค่าเป็น \"จริง\" ถ้าค่าที่ใส่เป็นเท็จ คืนค่าเป็น \"เท็จ\" ถ้าค่าที่ใส่เป็นจริง", - "LOGIC_BOOLEAN_TRUE": "จริง", - "LOGIC_BOOLEAN_FALSE": "เท็จ", - "LOGIC_BOOLEAN_TOOLTIP": "คืนค่าเป็นจริงหรือเท็จ", - "LOGIC_NULL": "ไม่กำหนด", - "LOGIC_NULL_TOOLTIP": "คืนค่า \"ไม่กำหนด\"", - "LOGIC_TERNARY_CONDITION": "ทดสอบ", - "LOGIC_TERNARY_IF_TRUE": "ถ้า เป็นจริง", - "LOGIC_TERNARY_IF_FALSE": "ถ้า เป็นเท็จ", - "LOGIC_TERNARY_TOOLTIP": "ตรวจสอบเงื่อนไขใน \"ทดสอบ\" ถ้าเงื่อนไขเป็นจริง จะคืนค่า \"ถ้า เป็นจริง\" ถ้าเงื่อนไขเป็นเท็จ จะคืนค่า \"ถ้า เป็นเท็จ\"", - "MATH_NUMBER_HELPURL": "https://th.wikipedia.org/wiki/จำนวน", - "MATH_NUMBER_TOOLTIP": "จำนวน", - "MATH_ARITHMETIC_HELPURL": "https://th.wikipedia.org/wiki/เลขคณิต", - "MATH_ARITHMETIC_TOOLTIP_ADD": "คืนค่าผลรวมของตัวเลขทั้งสองจำนวน", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "คืนค่าผลต่างของตัวเลขทั้งสองจำนวน", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "คืนค่าผลคูณของตัวเลขทั้งสองจำนวน", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "คืนค่าผลหารของตัวเลขทั้งสองจำนวน", - "MATH_ARITHMETIC_TOOLTIP_POWER": "คืนค่าผลการยกกำลัง โดยตัวเลขแรกเป็นฐาน และตัวเลขที่สองเป็นเลขชี้กำลัง", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "รากที่สอง", - "MATH_SINGLE_TOOLTIP_ROOT": "คืนค่ารากที่สองของตัวเลข", - "MATH_SINGLE_OP_ABSOLUTE": "ค่าสัมบูรณ์", - "MATH_SINGLE_TOOLTIP_ABS": "คืนค่าค่าสัมบูรณ์ของตัวเลข", - "MATH_SINGLE_TOOLTIP_NEG": "คืนค่าติดลบของตัวเลข", - "MATH_SINGLE_TOOLTIP_LN": "คืนค่าลอการิทึมธรรมชาติของตัวเลข", - "MATH_SINGLE_TOOLTIP_LOG10": "คืนค่าลอการิทึมฐานสิบของตัวเลข", - "MATH_SINGLE_TOOLTIP_EXP": "คืนค่า e ยกกำลังด้วยตัวเลข", - "MATH_SINGLE_TOOLTIP_POW10": "คืนค่า 10 ยกกำลังด้วยตัวเลข", - "MATH_TRIG_HELPURL": "https://th.wikipedia.org/wiki/ฟังก์ชันตรีโกณมิติ", - "MATH_TRIG_TOOLTIP_SIN": "คืนค่า sine ขององศา (ไม่ใช่เรเดียน)", - "MATH_TRIG_TOOLTIP_COS": "คืนค่า cosine ขององศา (ไม่ใช่เรเดียน)", - "MATH_TRIG_TOOLTIP_TAN": "คืนค่า tangent ขององศา (ไม่ใช่เรเดียน)", - "MATH_TRIG_TOOLTIP_ASIN": "คืนค่า arcsine ของตัวเลข", - "MATH_TRIG_TOOLTIP_ACOS": "คืนค่า arccosine ของตัวเลข", - "MATH_TRIG_TOOLTIP_ATAN": "คืนค่า arctangent ของตัวเลข", - "MATH_CONSTANT_HELPURL": "https://th.wikipedia.org/wiki/ค่าคงตัวทางคณิตศาสตร์", - "MATH_CONSTANT_TOOLTIP": "คืนค่าคงตัวทางคณิตศาสตร์ที่พบบ่อยๆ เช่น π (3.141…), e (2.718…), φ (1.618…), รากที่สอง (1.414…), รากที่ ½ (0.707…), ∞ (อนันต์)", - "MATH_IS_EVEN": "เป็นจำนวนคู่", - "MATH_IS_ODD": "เป็นจำนวนคี่", - "MATH_IS_PRIME": "เป็นจำนวนเฉพาะ", - "MATH_IS_WHOLE": "เป็นเลขจำนวนเต็ม", - "MATH_IS_POSITIVE": "เป็นเลขบวก", - "MATH_IS_NEGATIVE": "เป็นเลขติดลบ", - "MATH_IS_DIVISIBLE_BY": "หารลงตัว", - "MATH_IS_TOOLTIP": "ตรวจว่าตัวเลขเป็นจำนวนคู่ จำนวนคี่ จำนวนเฉพาะ จำนวนเต็ม เลขบวก เลขติดลบ หรือหารด้วยเลขที่กำหนดลงตัวหรือไม่ คืนค่าเป็นจริงหรือเท็จ", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "เปลี่ยนค่า %1 เป็น %2", - "MATH_CHANGE_TOOLTIP": "เพิ่มค่าของตัวแปร \"%1\"", - "MATH_ROUND_HELPURL": "https://th.wikipedia.org/wiki/การปัดเศษ", - "MATH_ROUND_TOOLTIP": "ปัดเศษของตัวเลขขึ้นหรือลง", - "MATH_ROUND_OPERATOR_ROUND": "ปัดเศษ", - "MATH_ROUND_OPERATOR_ROUNDUP": "ปัดเศษขึ้น", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "ปัดเศษลง", - "MATH_ONLIST_OPERATOR_SUM": "ผลรวมของรายการ", - "MATH_ONLIST_TOOLTIP_SUM": "คืนค่าผลรวมของตัวเลขทั้งหมดในรายการ", - "MATH_ONLIST_OPERATOR_MIN": "น้อยที่สุดในรายการ", - "MATH_ONLIST_TOOLTIP_MIN": "คืนค่าตัวเลขที่น้อยที่สุดในรายการ", - "MATH_ONLIST_OPERATOR_MAX": "มากที่สุดในรายการ", - "MATH_ONLIST_TOOLTIP_MAX": "คืนค่าตัวเลขที่มากที่สุดในรายการ", - "MATH_ONLIST_OPERATOR_AVERAGE": "ค่าเฉลี่ยของรายการ", - "MATH_ONLIST_TOOLTIP_AVERAGE": "คืนค่าเฉลี่ยของรายการ", - "MATH_ONLIST_OPERATOR_MEDIAN": "ค่ามัธยฐานของรายการ", - "MATH_ONLIST_TOOLTIP_MEDIAN": "คืนค่ามัธยฐานของรายการ", - "MATH_ONLIST_OPERATOR_MODE": "ฐานนิยมของรายการ", - "MATH_ONLIST_TOOLTIP_MODE": "คืนค่าฐานนิยมของรายการ", - "MATH_ONLIST_OPERATOR_STD_DEV": "ส่วนเบี่ยงเบนมาตรฐานของรายการ", - "MATH_ONLIST_TOOLTIP_STD_DEV": "คืนค่าส่วนเบี่ยงเบนมาตรฐานของรายการ", - "MATH_ONLIST_OPERATOR_RANDOM": "สุ่มรายการ", - "MATH_ONLIST_TOOLTIP_RANDOM": "สุ่มคืนค่าสิ่งที่อยู่ในรายการ", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "เศษของ %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "คืนค่าเศษที่ได้จากการหารของตัวเลขทั้งสองจำนวน", - "MATH_CONSTRAIN_TITLE": "จำกัดค่า %1 ต่ำสุด %2 สูงสุด %3", - "MATH_CONSTRAIN_TOOLTIP": "จำกัดค่าของตัวเลขให้อยู่ในช่วงที่กำหนด", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "สุ่มเลขจำนวนเต็มตั้งแต่ %1 จนถึง %2", - "MATH_RANDOM_INT_TOOLTIP": "สุ่มเลขจำนวนเต็มจากช่วงที่กำหนด", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "สุ่มเลขเศษส่วน", - "MATH_RANDOM_FLOAT_TOOLTIP": "สุ่มเลขเศษส่วน ตั้งแต่ 0.0 แต่ไม่เกิน 1.0", - "TEXT_TEXT_HELPURL": "https://th.wikipedia.org/wiki/สายอักขระ", - "TEXT_TEXT_TOOLTIP": "ตัวหนังสือ คำ หรือข้อความ", - "TEXT_JOIN_TITLE_CREATEWITH": "สร้างข้อความด้วย", - "TEXT_JOIN_TOOLTIP": "สร้างข้อความด้วยการรวมจำนวนของรายการเข้าด้วยกัน", - "TEXT_CREATE_JOIN_TITLE_JOIN": "รวม", - "TEXT_CREATE_JOIN_TOOLTIP": "เพิ่ม ลบ หรือจัดเรียงบล็อกข้อความนี้ใหม่", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "เพิ่มรายการเข้าไปในข้อความ", - "TEXT_APPEND_TO": "นำเอา", - "TEXT_APPEND_APPENDTEXT": "ต่อด้วยข้อความ", - "TEXT_APPEND_TOOLTIP": "ต่อข้อความให้ตัวแปร \"%1\"", - "TEXT_LENGTH_TITLE": "ความยาวของ %1", - "TEXT_LENGTH_TOOLTIP": "คืนค่าความยาวของข้อความ (รวมช่องว่าง)", - "TEXT_ISEMPTY_TITLE": "%1 ว่าง", - "TEXT_ISEMPTY_TOOLTIP": "คืนค่าจริง ถ้าข้อความยังว่าง", - "TEXT_INDEXOF_TOOLTIP": "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า 0 ถ้าหาไม่พบ", - "TEXT_INDEXOF_INPUT_INTEXT": "ในข้อความ", - "TEXT_INDEXOF_OPERATOR_FIRST": "หาข้อความแรกที่พบ", - "TEXT_INDEXOF_OPERATOR_LAST": "หาข้อความสุดท้ายที่พบ", - "TEXT_CHARAT_INPUT_INTEXT": "ในข้อความ", - "TEXT_CHARAT_FROM_START": "ดึง ตัวอักษรตัวที่", - "TEXT_CHARAT_FROM_END": "ดึง ตัวอักษรตัวที่ # จากท้าย", - "TEXT_CHARAT_FIRST": "ดึง ตัวอักษรตัวแรก", - "TEXT_CHARAT_LAST": "ดึง ตัวอักษรตัวสุดท้าย", - "TEXT_CHARAT_RANDOM": "ถึงตัวอักษรแบบสุ่ม", - "TEXT_CHARAT_TOOLTIP": "คืนค่าตัวอักษรจากตำแหน่งที่ระบุ", - "TEXT_GET_SUBSTRING_TOOLTIP": "คืนค่าบางส่วนของข้อความ", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ในข้อความ", - "TEXT_GET_SUBSTRING_START_FROM_START": "แยกข้อความย่อยตั้งแต่ ตัวอักษรที่", - "TEXT_GET_SUBSTRING_START_FROM_END": "แยกข้อความย่อยตั้งแต่ ตัวอักษรที่ # จากท้าย", - "TEXT_GET_SUBSTRING_START_FIRST": "แยกข้อความย่อยตั้งแต่ ตัวอักษรแรก", - "TEXT_GET_SUBSTRING_END_FROM_START": "จนถึง ตัวอักษรที่", - "TEXT_GET_SUBSTRING_END_FROM_END": "จนถึง ตัวอักษรที่ # จากท้าย", - "TEXT_GET_SUBSTRING_END_LAST": "จนถึง ตัวอักษรสุดท้าย", - "TEXT_CHANGECASE_TOOLTIP": "คืนค่าสำเนาของข้อความในกรณีต่างๆ", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "เปลี่ยนเป็น ตัวพิมพ์ใหญ่", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "เปลี่ยนเป็น ตัวพิมพ์เล็ก", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "เปลี่ยนเป็น ตัวอักษรแรกเป็นตัวพิมพ์ใหญ่", - "TEXT_TRIM_TOOLTIP": "คืนค่าสำเนาของข้อความที่ลบเอาช่องว่างหน้าและหลังข้อความออกแล้ว", - "TEXT_TRIM_OPERATOR_BOTH": "ลบช่องว่างทั้งสองข้างของ", - "TEXT_TRIM_OPERATOR_LEFT": "ลบช่องว่างด้านหน้าของ", - "TEXT_TRIM_OPERATOR_RIGHT": "ลบช่องว่างข้างท้ายของ", - "TEXT_PRINT_TITLE": "พิมพ์ %1", - "TEXT_PRINT_TOOLTIP": "พิมพ์ข้อความ ตัวเลข หรือค่าอื่นๆ", - "TEXT_PROMPT_TYPE_TEXT": "แสดงหน้าต่างข้อความ", - "TEXT_PROMPT_TYPE_NUMBER": "แสดงหน้าต่างตัวเลข", - "TEXT_PROMPT_TOOLTIP_NUMBER": "แสดงหน้าต่างให้ผู้ใช้ใส่ตัวเลข", - "TEXT_PROMPT_TOOLTIP_TEXT": "แสดงหน้าต่างให้ผู้ใช้ใส่ข้อความ", - "LISTS_CREATE_EMPTY_TITLE": "สร้างรายการเปล่า", - "LISTS_CREATE_EMPTY_TOOLTIP": "สร้างรายการเปล่า (ความยาวเป็น 0) ยังไม่มีข้อมูลใดๆ อยู่", - "LISTS_CREATE_WITH_TOOLTIP": "สร้างรายการพร้อมด้วยไอเท็ม", - "LISTS_CREATE_WITH_INPUT_WITH": "สร้างข้อความด้วย", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "รายการ", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "เพิ่ม ลบ หรือจัดเรียงบล็อกรายการนี้ใหม่", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "เพิ่มไอเท็มเข้าไปในรายการ", - "LISTS_REPEAT_TOOLTIP": "สร้างรายการที่ประกอบด้วยค่าตามที่ระบุในจำนวนตามที่ต้องการ", - "LISTS_REPEAT_TITLE": "สร้างรายการที่มีไอเท็ม %1 จำนวน %2", - "LISTS_LENGTH_TITLE": "ความยาวของ %1", - "LISTS_LENGTH_TOOLTIP": "ส่งคืนค่าความยาวของรายการ", - "LISTS_ISEMPTY_TITLE": "%1 ว่างเปล่า", - "LISTS_ISEMPTY_TOOLTIP": "คืนค่าเป็นจริง ถ้ารายการยังว่างเปล่า", - "LISTS_INLIST": "ในรายการ", - "LISTS_INDEX_OF_FIRST": "หาอันแรกที่พบ", - "LISTS_INDEX_OF_LAST": "หาอันสุดท้ายที่พบ", - "LISTS_INDEX_OF_TOOLTIP": "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า 0 ถ้าหาไม่พบ", - "LISTS_GET_INDEX_GET": "เรียกดู", - "LISTS_GET_INDEX_GET_REMOVE": "เรียกดูและเอาออก", - "LISTS_GET_INDEX_REMOVE": "เอาออก", - "LISTS_GET_INDEX_FROM_END": "# จากท้าย", - "LISTS_GET_INDEX_FIRST": "แรกสุด", - "LISTS_GET_INDEX_LAST": "ท้ายสุด", - "LISTS_GET_INDEX_RANDOM": "สุ่ม", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันแรกสุด", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันท้ายสุด", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "คืนค่าไอเท็มอันแรกในรายการ", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "คืนค่าไอเท็มอันสุดท้ายในรายการ", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "คืนค่าไอเท็มแบบสุ่มจากรายการ", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ #1 คือไอเท็มอันแรก", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ #1 คือไอเท็มอันสุดท้าย", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "เอาออก และคืนค่าไอเท็มอันแรกในรายการ", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "เอาออก และคืนค่าไอเท็มอันสุดท้ายในรายการ", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "เอาออก และคืนค่าไอเท็มแบบสุ่มจากรายการ", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันแรกสุด", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ #1 คือไอเท็มอันท้ายสุด", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "เอาไอเท็มแรกสุดในรายการออก", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "เอาไอเท็มอันท้ายสุดในรายการออก", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "เอาไอเท็มแบบสุ่มจากรายการออก", - "LISTS_SET_INDEX_SET": "กำหนด", - "LISTS_SET_INDEX_INSERT": "แทรกที่", - "LISTS_SET_INDEX_INPUT_TO": "เป็น", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ #1 คือไอเท็มอันแรกสุด", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ #1 คือไอเท็มอันท้ายสุด", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "กำหนดไอเท็มอันแรกในรายการ", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "กำหนดไอเท็มอันสุดท้ายในรายการ", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "กำหนดไอเท็มแบบสุ่มในรายการ", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด #1 คือไอเท็มอันแรก", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด #1 คือไอเท็มอันสุดท้าย", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "แทรกไอเท็มเข้าไปเป็นอันแรกสุดของรายการ", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "เพิ่มไอเท็มเข้าไปท้ายสุดของรายการ", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "เพิ่มไอเท็มเข้าไปในรายการแบบสุ่ม", - "LISTS_GET_SUBLIST_START_FROM_START": "ดึงรายการย่อยจาก #", - "LISTS_GET_SUBLIST_START_FROM_END": "ดึงรายการย่อยจาก # จากท้ายสุด", - "LISTS_GET_SUBLIST_START_FIRST": "ดึงรายการย่อยทั้งแต่แรกสุด", - "LISTS_GET_SUBLIST_END_FROM_START": "จนถึง #", - "LISTS_GET_SUBLIST_END_FROM_END": "ถึง # จากท้ายสุด", - "LISTS_GET_SUBLIST_END_LAST": "ถึง ท้ายสุด", - "LISTS_GET_SUBLIST_TOOLTIP": "สร้างสำเนารายการในช่วงที่กำหนด", - "LISTS_SPLIT_LIST_FROM_TEXT": "สร้างรายการจากข้อความ", - "LISTS_SPLIT_TEXT_FROM_LIST": "สร้างข้อความจากรายการ", - "LISTS_SPLIT_WITH_DELIMITER": "ด้วยตัวคั่น", - "LISTS_SPLIT_TOOLTIP_SPLIT": "แบ่งข้อความเป็นรายการข้อความ แยกแต่ละรายการด้วยตัวคั่น", - "LISTS_SPLIT_TOOLTIP_JOIN": "รวมรายการข้อความเป็นข้อความเดียว แบ่งด้วยตัวคั่น", - "VARIABLES_GET_TOOLTIP": "คืนค่าของตัวแปรนี้", - "VARIABLES_GET_CREATE_SET": "สร้าง \"กำหนด %1\"", - "VARIABLES_SET": "กำหนด %1 จนถึง %2", - "VARIABLES_SET_TOOLTIP": "กำหนดให้ตัวแปรนี้เท่ากับการป้อนข้อมูล", - "VARIABLES_SET_CREATE_GET": "สร้าง \"get %1\"", - "PROCEDURES_DEFNORETURN_TITLE": "ถึง", - "PROCEDURES_DEFNORETURN_PROCEDURE": "ทำอะไรบางอย่าง", - "PROCEDURES_BEFORE_PARAMS": "ด้วย:", - "PROCEDURES_CALL_BEFORE_PARAMS": "ด้วย:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "สร้างฟังก์ชันที่ไม่มีผลลัพธ์", - "PROCEDURES_DEFRETURN_RETURN": "คืนค่า", - "PROCEDURES_DEFRETURN_TOOLTIP": "สร้างฟังก์ชันที่มีผลลัพธ์", - "PROCEDURES_DEF_DUPLICATE_WARNING": "ระวัง: ฟังก์ชันนี้มีพารามิเตอร์ที่มีชื่อซ้ำกัน", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_(computer_science)", - "PROCEDURES_CALLNORETURN_TOOLTIP": "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\"", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_(computer_science)", - "PROCEDURES_CALLRETURN_TOOLTIP": "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\" และใช้ผลลัพธ์ของมัน", - "PROCEDURES_MUTATORCONTAINER_TITLE": "นำเข้า", - "PROCEDURES_MUTATORARG_TITLE": "ชื่อนำเข้า:", - "PROCEDURES_HIGHLIGHT_DEF": "เน้นฟังก์ชันนิยาม", - "PROCEDURES_CREATE_DO": "สร้าง \"%1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "ถ้ามีค่าเป็นจริง ให้คืนค่าที่สอง", - "PROCEDURES_IFRETURN_WARNING": "ระวัง: บล็อกนี้ใช้เฉพาะในการสร้างฟังก์ชันเท่านั้น" -} diff --git a/msg/json/tl.json b/msg/json/tl.json deleted file mode 100644 index 5c1233b99c..0000000000 --- a/msg/json/tl.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "@metadata": { - "authors": [ - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "item", - "DUPLICATE_BLOCK": "Kaparehas", - "ADD_COMMENT": "Dagdag komento", - "REMOVE_COMMENT": "Remove Comment", - "EXTERNAL_INPUTS": "Panlabas na Inputs", - "INLINE_INPUTS": "Inline na Inputs", - "DELETE_BLOCK": "burahin ang bloke", - "DELETE_X_BLOCKS": "burahin %1 ng bloke", - "COLLAPSE_BLOCK": "bloke", - "COLLAPSE_ALL": "bloke", - "EXPAND_BLOCK": "Palawakin ang Block", - "EXPAND_ALL": "Palawakin ang Blocks", - "DISABLE_BLOCK": "Ipangwalang bisa ang Block", - "ENABLE_BLOCK": "Bigyan ng bisa ang Block", - "HELP": "Tulong", - "CHANGE_VALUE_TITLE": "pagbago ng value:", - "NEW_VARIABLE": "New variable...", - "NEW_VARIABLE_TITLE": "New variable name:", - "RENAME_VARIABLE": "Rename variable...", - "RENAME_VARIABLE_TITLE": "Rename all '%1' variables to:", - "COLOUR_PICKER_HELPURL": "http://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "pagpili ng kulay sa paleta.", - "COLOUR_RANDOM_TITLE": "iba ibang kulay", - "COLOUR_RANDOM_TOOLTIP": "pagpili ng iba't ibang kulay.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "kulayan ng", - "COLOUR_RGB_RED": "pula", - "COLOUR_RGB_GREEN": "berde", - "COLOUR_RGB_BLUE": "asul", - "COLOUR_RGB_TOOLTIP": "gumawa ng kulay ng may espisipikong dami ng kulay pula, berde, at asul. lahat ng halaga ay dapat sa pagitan ng 0 at 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "halo", - "COLOUR_BLEND_COLOUR1": "kulay 1", - "COLOUR_BLEND_COLOUR2": "kulay 2", - "COLOUR_BLEND_RATIO": "proporsyon", - "COLOUR_BLEND_TOOLTIP": "Paghalo ng dalawang kulay kasama ng ibinigay na proporsyon (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "http://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "ulitin %1 beses", - "CONTROLS_REPEAT_INPUT_DO": "gawin", - "CONTROLS_REPEAT_TOOLTIP": "gumawa ng ilang pangungusap ng ilang ulit.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ulitin habang", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ulitin hanggang", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Habang ang value ay true, gagawin ang ibang statements.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Habang ang value ay false, gagawin ang ibang statements.", - "CONTROLS_FOR_TOOLTIP": "Magkaroon ng mga variable na \"%1\" na tanggalin ng mga halaga mula sa simulang numero hanggang sa dulong numero, at bilangin sa pamamagitan ng tinukoy na agwat, at gawin ang mga tinukoy na mga blocks.", - "CONTROLS_FOR_TITLE": "bilangin %1 mula %2 hanggang %3 ng %4", - "CONTROLS_FOREACH_TITLE": "sa bawat bagay %1 sa listahan %2", - "CONTROLS_FOREACH_TOOLTIP": "Para sa bawat item sa isang list, i-set ang variable ng '%1' sa mga item, at pagkatapos ay gumawa ng ilang mga statements.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "putulin ang paulit ulit", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "Magpatuloy sa susunod na pag-ulit ng loop", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Hatiin ang nilalaman ng loop.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Laktawan ang natitirang bahagi ng loop, at magpatuloy sa susunod na pag-ulit.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Babala: Ang block ito ay maaari lamang magamit sa loob ng loop.", - "CONTROLS_IF_TOOLTIP_1": "kung ang value ay true, gagawin ang do statements.", - "CONTROLS_IF_TOOLTIP_2": "Kung ang value ay true, gagawin ang unang block ng do statements. Kung hindi, gagawin ang pangalawang block ng statement.", - "CONTROLS_IF_TOOLTIP_3": "Kung ang unang value ay true, gagawin ang first block ng statement. Kung hindi, kung ang second value ay true, gagawin ang second block ng statement.", - "CONTROLS_IF_TOOLTIP_4": "Kung ang first value ay true, gagawin ang first block ng statement. Kung hindi true ang second value, gagawin ang second block ng statement. Kung wala sa mga values ay true, gagawin ang last block ng statements.", - "CONTROLS_IF_MSG_IF": "kung", - "CONTROLS_IF_MSG_ELSEIF": "else if", - "CONTROLS_IF_MSG_ELSE": "else", - "CONTROLS_IF_IF_TOOLTIP": "Mag Add, remove o kaya mag reorder ng sections para maayos ang if block.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Mag dagdag ng condition sa if block.", - "CONTROLS_IF_ELSE_TOOLTIP": "Mag Add ng final, kunin lahat ng condition sa if block.", - "LOGIC_COMPARE_HELPURL": "http://en.wikipedia.org/wiki/Inequality_(mathematics)", - "LOGIC_COMPARE_TOOLTIP_EQ": "Nag babalik ng true kung ang pinasok ay parehong magkatumbas.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Return true if both inputs are not equal to each other.", - "LOGIC_COMPARE_TOOLTIP_LT": "Nag babalik ng true kung ang unang pinasok ay maliit kaysa sa pangalawang pinasok.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Nag babalik ng true kung ang unang pinasok ay maliit sa o katumbas sa pangalawang pinasok.", - "LOGIC_COMPARE_TOOLTIP_GT": "Nagbabalik ng true kung ang unang pinasok ay mas malaki kaysa pangalawang pinasok.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Nag babalik ng true kung ang unang pinasok ay mas malaki or katumbas ng pangalawang pinasok.", - "LOGIC_OPERATION_TOOLTIP_AND": "Return true if both inputs are true.", - "LOGIC_OPERATION_AND": "at", - "LOGIC_OPERATION_TOOLTIP_OR": "Return true if at least one of the inputs is true.", - "LOGIC_OPERATION_OR": "o", - "LOGIC_NEGATE_TITLE": "not %1", - "LOGIC_NEGATE_TOOLTIP": "Returns true if the input is false. Returns false if the input is true.", - "LOGIC_BOOLEAN_TRUE": "tama", - "LOGIC_BOOLEAN_FALSE": "mali", - "LOGIC_BOOLEAN_TOOLTIP": "Nag babalik ng true or false.", - "LOGIC_NULL_HELPURL": "http://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "blangko", - "LOGIC_NULL_TOOLTIP": "Returns null.", - "LOGIC_TERNARY_HELPURL": "http://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "kung tama", - "LOGIC_TERNARY_IF_FALSE": "kung mali", - "LOGIC_TERNARY_TOOLTIP": "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value.", - "MATH_NUMBER_HELPURL": "http://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "A number.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "http://en.wikipedia.org/wiki/Arithmetic", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Return the sum of the two numbers.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Return the difference of the two numbers.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Return the product of the two numbers.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Return the quotient of the two numbers.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Return the first number raised to the power of the second number.", - "MATH_SINGLE_HELPURL": "http://en.wikipedia.org/wiki/Square_root", - "MATH_SINGLE_OP_ROOT": "square root", - "MATH_SINGLE_TOOLTIP_ROOT": "Return the square root of a number.", - "MATH_SINGLE_OP_ABSOLUTE": "absolute", - "MATH_SINGLE_TOOLTIP_ABS": "Return the absolute value of a number.", - "MATH_SINGLE_TOOLTIP_NEG": "Return the negation of a number.", - "MATH_SINGLE_TOOLTIP_LN": "Return the natural logarithm of a number.", - "MATH_SINGLE_TOOLTIP_LOG10": "Return the base 10 logarithm of a number.", - "MATH_SINGLE_TOOLTIP_EXP": "Return e to the power of a number.", - "MATH_SINGLE_TOOLTIP_POW10": "Return 10 to the power of a number.", - "MATH_TRIG_HELPURL": "http://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "Return the sine of a degree (not radian).", - "MATH_TRIG_TOOLTIP_COS": "Return the cosine of a degree (not radian).", - "MATH_TRIG_TOOLTIP_TAN": "Return the tangent of a degree (not radian).", - "MATH_TRIG_TOOLTIP_ASIN": "Return the arcsine of a number.", - "MATH_TRIG_TOOLTIP_ACOS": "Return the arccosine of a number.", - "MATH_TRIG_TOOLTIP_ATAN": "Return the arctangent of a number.", - "MATH_CONSTANT_HELPURL": "http://en.wikipedia.org/wiki/Mathematical_constant", - "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).", - "MATH_IS_EVEN": "is even", - "MATH_IS_ODD": "is odd", - "MATH_IS_PRIME": "is prime", - "MATH_IS_WHOLE": "is whole", - "MATH_IS_POSITIVE": "ay positibo", - "MATH_IS_NEGATIVE": "ay negatibo", - "MATH_IS_DIVISIBLE_BY": "is divisible by", - "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.", - "MATH_CHANGE_HELPURL": "http://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "baguhin %1 by %2", - "MATH_CHANGE_TOOLTIP": "Add a number to variable '%1'.", - "MATH_ROUND_HELPURL": "http://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Round a number up or down.", - "MATH_ROUND_OPERATOR_ROUND": "round", - "MATH_ROUND_OPERATOR_ROUNDUP": "round up", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "round down", - "MATH_ONLIST_OPERATOR_SUM": "sum of list", - "MATH_ONLIST_TOOLTIP_SUM": "Return the sum of all the numbers in the list.", - "MATH_ONLIST_OPERATOR_MIN": "min of list", - "MATH_ONLIST_TOOLTIP_MIN": "Return the smallest number in the list.", - "MATH_ONLIST_OPERATOR_MAX": "max of list", - "MATH_ONLIST_TOOLTIP_MAX": "Return the largest number in the list.", - "MATH_ONLIST_OPERATOR_AVERAGE": "average of list", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Return the average (arithmetic mean) of the numeric values in the list.", - "MATH_ONLIST_OPERATOR_MEDIAN": "median of list", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Return the median number in the list.", - "MATH_ONLIST_OPERATOR_MODE": "modes of list", - "MATH_ONLIST_TOOLTIP_MODE": "Return a list of the most common item(s) in the list.", - "MATH_ONLIST_OPERATOR_STD_DEV": "standard deviation of list", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Return the standard deviation of the list.", - "MATH_ONLIST_OPERATOR_RANDOM": "random item of list", - "MATH_ONLIST_TOOLTIP_RANDOM": "Return a random element from the list.", - "MATH_MODULO_HELPURL": "http://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "remainder of %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Return the remainder from dividing the two numbers.", - "MATH_CONSTRAIN_TITLE": "constrain %1 low %2 high %3", - "MATH_CONSTRAIN_TOOLTIP": "Constrain a number to be between the specified limits (inclusive).", - "MATH_RANDOM_INT_HELPURL": "http://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "random integer from %1 to %2", - "MATH_RANDOM_INT_TOOLTIP": "Return a random integer between the two specified limits, inclusive.", - "MATH_RANDOM_FLOAT_HELPURL": "http://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "random fraction", - "MATH_RANDOM_FLOAT_TOOLTIP": "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive).", - "TEXT_TEXT_HELPURL": "http://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "A letter, word, or line of text.", - "TEXT_JOIN_TITLE_CREATEWITH": "create text with", - "TEXT_JOIN_TOOLTIP": "Create a piece of text by joining together any number of items.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "join", - "TEXT_CREATE_JOIN_TOOLTIP": "Add, remove, or reorder sections to reconfigure this text block.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Add an item to the text.", - "TEXT_APPEND_TO": "to", - "TEXT_APPEND_APPENDTEXT": "append text", - "TEXT_APPEND_TOOLTIP": "Append some text to variable '%1'.", - "TEXT_LENGTH_TITLE": "length of %1", - "TEXT_LENGTH_TOOLTIP": "Returns the number of letters (including spaces) in the provided text.", - "TEXT_ISEMPTY_TITLE": "%1 is empty", - "TEXT_ISEMPTY_TOOLTIP": "Returns true if the provided text is empty.", - "TEXT_INDEXOF_TOOLTIP": "Returns the index of the first/last occurrence of first text in the second text. Returns 0 if text is not found.", - "TEXT_INDEXOF_INPUT_INTEXT": "in text", - "TEXT_INDEXOF_OPERATOR_FIRST": "find first occurrence of text", - "TEXT_INDEXOF_OPERATOR_LAST": "find last occurrence of text", - "TEXT_CHARAT_INPUT_INTEXT": "in text", - "TEXT_CHARAT_FROM_START": "get letter #", - "TEXT_CHARAT_FROM_END": "get letter # from end", - "TEXT_CHARAT_FIRST": "get first letter", - "TEXT_CHARAT_LAST": "get last letter", - "TEXT_CHARAT_RANDOM": "get random letter", - "TEXT_CHARAT_TOOLTIP": "Returns the letter at the specified position.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Returns a specified portion of the text.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in text", - "TEXT_GET_SUBSTRING_START_FROM_START": "get substring from letter #", - "TEXT_GET_SUBSTRING_START_FROM_END": "get substring from letter # from end", - "TEXT_GET_SUBSTRING_START_FIRST": "get substring from first letter", - "TEXT_GET_SUBSTRING_END_FROM_START": "to letter #", - "TEXT_GET_SUBSTRING_END_FROM_END": "to letter # from end", - "TEXT_GET_SUBSTRING_END_LAST": "to last letter", - "TEXT_CHANGECASE_TOOLTIP": "Return a copy of the text in a different case.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "to UPPER CASE", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "to lower case", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "to Title Case", - "TEXT_TRIM_TOOLTIP": "Return a copy of the text with spaces removed from one or both ends.", - "TEXT_TRIM_OPERATOR_BOTH": "trim spaces from both sides", - "TEXT_TRIM_OPERATOR_LEFT": "trim spaces from left side", - "TEXT_TRIM_OPERATOR_RIGHT": "trim spaces from right side", - "TEXT_PRINT_TITLE": "print %1", - "TEXT_PRINT_TOOLTIP": "Print the specified text, number or other value.", - "TEXT_PROMPT_TYPE_TEXT": "prompt for text with message", - "TEXT_PROMPT_TYPE_NUMBER": "prompt for number with message", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Prompt for user for a number.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Prompt for user for some text.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "Gumawa ng walang laman na list", - "LISTS_CREATE_EMPTY_TOOLTIP": "Ibabalik ang list, na may haba na 0, nag lalaman ng walang data records", - "LISTS_CREATE_WITH_TOOLTIP": "Gumawa ng list na may kahit anong number ng items.", - "LISTS_CREATE_WITH_INPUT_WITH": "gumawa ng list kasama", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "list", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Magdagdag, mag tanggal or mag ayos ng sections para muling maayos ang listahan ng block.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Mag dagdag ng item sa list.", - "LISTS_REPEAT_TOOLTIP": "Pag gawa ng list na binubuo ng binigay na value at inulit na tinuloy na bilang ng beses.", - "LISTS_REPEAT_TITLE": "pag gawa ng list kasama ng item %1 inuulit %2 beses", - "LISTS_LENGTH_TITLE": "haba ng %1", - "LISTS_LENGTH_TOOLTIP": "Pag balik ng haba ng list.", - "LISTS_ISEMPTY_TITLE": "%1 ay walang laman", - "LISTS_ISEMPTY_TOOLTIP": "Nagbabalik ng true kung ang list ay walang laman.", - "LISTS_INLIST": "sa list", - "LISTS_INDEX_OF_FIRST": "Hanapin ang unang pangyayari ng item", - "LISTS_INDEX_OF_LAST": "hanapin ang huling pangyayari ng item", - "LISTS_INDEX_OF_TOOLTIP": "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng 0 kung ang item ay hindi makita.", - "LISTS_GET_INDEX_GET": "kunin", - "LISTS_GET_INDEX_GET_REMOVE": "kunin at tanggalin", - "LISTS_GET_INDEX_REMOVE": "tanggalin", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# mula katapusan", - "LISTS_GET_INDEX_FIRST": "Una", - "LISTS_GET_INDEX_LAST": "huli", - "LISTS_GET_INDEX_RANDOM": "nang hindi pinipili", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Ibalik ang item sa itinakdang posisyon sa list. #1 ay ang unang item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Ibalik ang item sa tinakdang posisyon sa list. #1 ay ang huling item.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Ibalik ang unang item sa list.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Ibalik ang huling item sa list.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Nag babalik ng hindi pinipiling item sa list.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Nag tatanggal at nag babalik ng mga items sa tinukoy na posisyon sa list. #1 ang unang item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Nag tatanggal at nag babalik ng items sa tinukoy na posisyon sa list. #1 ay ang huling item.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Nag tatanggal at nag babalik ng mga unang item sa list.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Nag tatanggal at nag babalik ng huling item sa list.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Nag tatanggal at nag babalik ng mga hindi pinipiling item sa list.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Nag tatanggal ng item sa tinukoy na posisyon sa list. #1 ay ang unang item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Nag tatanggal ng item sa tinukoy na posisyon sa list. #1 ay ang huling item.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Nag tatanggal ng unang item sa list.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Nag tatanggal ng huling item sa list.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Nag tatanggal ng item mula sa walang pinipiling list.", - "LISTS_SET_INDEX_SET": "set", - "LISTS_SET_INDEX_INSERT": "isingit sa", - "LISTS_SET_INDEX_INPUT_TO": "gaya ng", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Pag set ng item sa tinukoy na position sa isang list. #1 ay ang unang item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Pag set ng item sa tinukoy na posisyon sa isang list. #1 ay ang huling item.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Pag set ng unang item sa isang list.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Pag set sa huling item sa isang list.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Pag set ng walang pinipiling item sa isang list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Nag singit ng item sa tinukoy na posistion sa list. #1 ay ang unang item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Nag singit ng item sa tinukoy na posisyon sa list. #1 ay ang huling item.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Nag singit ng item sa simula ng list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Idagdag ang item sa huli ng isang list.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Isingit ang item ng walang pinipili sa isang list.", - "LISTS_GET_SUBLIST_START_FROM_START": "pag kuha ng sub-list mula #", - "LISTS_GET_SUBLIST_START_FROM_END": "pag kuha ng sub-list mula sa # mula huli", - "LISTS_GET_SUBLIST_START_FIRST": "pag kuha ng sub-list mula sa una", - "LISTS_GET_SUBLIST_END_FROM_START": "mula #", - "LISTS_GET_SUBLIST_END_FROM_END": "mula # hanggang huli", - "LISTS_GET_SUBLIST_END_LAST": "hanggang huli", - "LISTS_GET_SUBLIST_TOOLTIP": "Gumagawa ng kopya ng tinukoy na bahagi ng list.", - "VARIABLES_GET_TOOLTIP": "Returns the value of this variable.", - "VARIABLES_GET_CREATE_SET": "Create 'set %1'", - "VARIABLES_SET": "set %1 to %2", - "VARIABLES_SET_TOOLTIP": "Sets this variable to be equal to the input.", - "VARIABLES_SET_CREATE_GET": "Create 'get %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "to", - "PROCEDURES_DEFNORETURN_PROCEDURE": "do something", - "PROCEDURES_BEFORE_PARAMS": "with:", - "PROCEDURES_CALL_BEFORE_PARAMS": "with:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Creates a function with no output.", - "PROCEDURES_DEFRETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "return", - "PROCEDURES_DEFRETURN_TOOLTIP": "Creates a function with an output.", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Warning: This function has duplicate parameters.", - "PROCEDURES_CALLNORETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Run the user-defined function '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Run the user-defined function '%1' and use its output.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "inputs", - "PROCEDURES_MUTATORARG_TITLE": "input name:", - "PROCEDURES_HIGHLIGHT_DEF": "Highlight function definition", - "PROCEDURES_CREATE_DO": "Create '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "If a value is true, then return a second value.", - "PROCEDURES_IFRETURN_WARNING": "Warning: This block may be used only within a function definition." -} diff --git a/msg/json/tlh.json b/msg/json/tlh.json deleted file mode 100644 index eac917e924..0000000000 --- a/msg/json/tlh.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "@metadata": { - "author": "Neil Fraser ", - "lastupdated": "2014-03-24 23:00:00.000000", - "locale": "tlh", - "messagedocumentation" : "qqq" - }, - "VARIABLES_DEFAULT_NAME": "Doch", - "DUPLICATE_BLOCK": "velqa' chenmoH", - "ADD_COMMENT": "QInHom chel", - "REMOVE_COMMENT": "QInHom chelHa'", - "EXTERNAL_INPUTS": "Hur rar", - "INLINE_INPUTS": "qoD rar", - "DELETE_BLOCK": "ngogh Qaw'", - "DELETE_X_BLOCKS": "%1 ngoghmey Qaw'", - "DELETE_ALL_BLOCKS": "Hoch %1 ngoghmey Qaw'?", - "COLLAPSE_BLOCK": "ngogh DejmoH", - "COLLAPSE_ALL": "ngoghmey DejmoH", - "EXPAND_BLOCK": "ngogh DejHa'moH", - "EXPAND_ALL": "ngoghmey DejHa'moH", - "DISABLE_BLOCK": "ngogh Qotlh", - "ENABLE_BLOCK": "ngogh QotlhHa'", - "HELP": "QaH", - "CHAT": "beqpu'lI'vaD bIjawmeH naDev yIrI'!", - "AUTH": "ngogh nablIj DapollaHmeH qoj latlhvaD DangeHlaHmeH chaw' yInob.", - "CHANGE_VALUE_TITLE": "choH:", - "NEW_VARIABLE": "lIw chu'...", - "NEW_VARIABLE_TITLE": "lIw chu' pong:", - "RENAME_VARIABLE": "lIw pong choH...", - "RENAME_VARIABLE_TITLE": "Hoch \"%1\" lIwmey pongmey choH:", - "COLOUR_RANDOM_TITLE": "rItlh vISaHbe'", - "COLOUR_RGB_TITLE": "rItlh wIv", - "COLOUR_RGB_RED": "'Iw rItlh", - "COLOUR_RGB_GREEN": "tI rItlh", - "COLOUR_RGB_BLUE": "chal rItlh", - "COLOUR_BLEND_TITLE": "DuD", - "COLOUR_BLEND_COLOUR1": "rItlh wa'", - "COLOUR_BLEND_COLOUR2": "rItlh cha'", - "COLOUR_BLEND_RATIO": "'ar", - "CONTROLS_REPEAT_TITLE": "%1-logh qaSmoH", - "CONTROLS_REPEAT_INPUT_DO": "ruch", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "teHtaHvIS qaSmoH", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "teHpa' qaSmoH", - "CONTROLS_FOR_TITLE": "togh %1 mung %2 ghoch %3 Do %4", - "CONTROLS_FOREACH_TITLE": "ngIq Doch %1 ngaSbogh tetlh %2 nuDDI'", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "gho Haw'", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "gho taHqa'", - "CONTROLS_FLOW_STATEMENTS_WARNING": "yIqIm! ghoDaq neH ngoghvam lo'laH vay'.", - "CONTROLS_IF_MSG_IF": "teHchugh", - "CONTROLS_IF_MSG_ELSEIF": "pagh teHchugh", - "CONTROLS_IF_MSG_ELSE": "pagh", - "LOGIC_OPERATION_AND": "'ej", - "LOGIC_OPERATION_OR": "qoj", - "LOGIC_NEGATE_TITLE": "yoymoH %1", - "LOGIC_BOOLEAN_TRUE": "teH", - "LOGIC_BOOLEAN_FALSE": "teHbe'", - "LOGIC_NULL": "paghna'", - "LOGIC_TERNARY_CONDITION": "chov", - "LOGIC_TERNARY_IF_TRUE": "teHchugh", - "LOGIC_TERNARY_IF_FALSE": "teHbe'chugh", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", - "MATH_TRIG_SIN": "sin", - "MATH_TRIG_COS": "cos", - "MATH_TRIG_TAN": "tan", - "MATH_TRIG_ASIN": "asin", - "MATH_TRIG_ACOS": "acos", - "MATH_TRIG_ATAN": "atan", - "MATH_SINGLE_OP_ROOT": "cha'DIch wav", - "MATH_SINGLE_OP_ABSOLUTE": "Dung pagh choH", - "MATH_IS_EVEN": "lang'a' mI'", - "MATH_IS_ODD": "ror'a' mI'", - "MATH_IS_PRIME": "potlh'a' mI'", - "MATH_IS_WHOLE": "ngoHlaHbe''a'", - "MATH_IS_POSITIVE": "Dung pagh", - "MATH_IS_NEGATIVE": "bIng pagh", - "MATH_IS_DIVISIBLE_BY": "wav'a'", - "MATH_CHANGE_TITLE": "choH %1 chel %2", - "MATH_ROUND_OPERATOR_ROUND": "ngoH", - "MATH_ROUND_OPERATOR_ROUNDUP": "Dung ngoH", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "bIng ngoH", - "MATH_ONLIST_OPERATOR_SUM": "chelwI' SIm tetlh", - "MATH_ONLIST_OPERATOR_MIN": "machwI''a' SIm tetlh", - "MATH_ONLIST_OPERATOR_MAX": "tInwI''a' SIm tetlh", - "MATH_ONLIST_OPERATOR_AVERAGE": "beQwI' SIm tetlh", - "MATH_ONLIST_OPERATOR_MEDIAN": "beQwI'botlh SIm tetlh", - "MATH_ONLIST_OPERATOR_MODE": "beQwI' motlh SIm tetlh", - "MATH_ONLIST_OPERATOR_STD_DEV": "motlhbe'wI' SIm tetlh", - "MATH_ONLIST_OPERATOR_RANDOM": "SaHbe' SIm tetlh", - "MATH_MODULO_TITLE": "ratlwI' SIm %1 ÷ %2", - "MATH_CONSTRAIN_TITLE": "jon %1 bIng %2 Dung %3", - "MATH_RANDOM_INT_TITLE": "ngoH mI'SaHbe' bIng %1 Dung %2", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "mI'HomSaHbe'", - "TEXT_JOIN_TITLE_CREATEWITH": "ghItlh ghom", - "TEXT_CREATE_JOIN_TITLE_JOIN": "ghom", - "TEXT_APPEND_TO": "chel", - "TEXT_APPEND_APPENDTEXT": "ghItlh", - "TEXT_LENGTH_TITLE": "chuq %1", - "TEXT_ISEMPTY_TITLE": "%1 chIm'a'", - "TEXT_INDEXOF_INPUT_INTEXT": "ghItlhDaq", - "TEXT_INDEXOF_OPERATOR_FIRST": "ghItlh wa'DIch Sam", - "TEXT_INDEXOF_OPERATOR_LAST": "ghItlh Qav Sam", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_INPUT_INTEXT": "ghItlhDaq", - "TEXT_CHARAT_FROM_START": "mu'Hom #", - "TEXT_CHARAT_FROM_END": "mu'Hom # Qav", - "TEXT_CHARAT_FIRST": "mu'Hom wa'DIch", - "TEXT_CHARAT_LAST": "mu'Hom Qav", - "TEXT_CHARAT_RANDOM": "mu'Hom SaHbe'", - "TEXT_CHARAT_TAIL": "Suq", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ghItlhDaq", - "TEXT_GET_SUBSTRING_START_FROM_START": "ghItlhHom moHaq mu'Hom #", - "TEXT_GET_SUBSTRING_START_FROM_END": "ghItlhHom moHaq mu'Hom # Qav", - "TEXT_GET_SUBSTRING_START_FIRST": "ghItlhHom moHaq mu'Hom wa'DIch", - "TEXT_GET_SUBSTRING_END_FROM_START": "mojaq mu'Hom #", - "TEXT_GET_SUBSTRING_END_FROM_END": "mojaq mu'Hom # Qav", - "TEXT_GET_SUBSTRING_END_LAST": "mojaq mu'Hom Qav", - "TEXT_GET_SUBSTRING_TAIL": "Suq", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "tInchoH", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "machchoH", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "DojchoH", - "TEXT_TRIM_OPERATOR_BOTH": "poSnIHlogh pei", - "TEXT_TRIM_OPERATOR_LEFT": "poSlogh pei", - "TEXT_TRIM_OPERATOR_RIGHT": "nIHlogh pei", - "TEXT_PRINT_TITLE": "maq %1", - "TEXT_PROMPT_TYPE_TEXT": "ghItln tlhob 'ej maq", - "TEXT_PROMPT_TYPE_NUMBER": "mI' tlhob 'ej maq", - "LISTS_CREATE_EMPTY_TITLE": "tetlh chIm", - "LISTS_CREATE_WITH_INPUT_WITH": "tetlh ghom", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "tetlh", - "LISTS_REPEAT_TITLE": "tetlh ghom %2 Dochmey %1 pus", - "LISTS_LENGTH_TITLE": "chuq %1", - "LISTS_ISEMPTY_TITLE": "%1 chIm'a'", - "LISTS_INLIST": "tetlhDaq", - "LISTS_INDEX_OF_FIRST": "Doch sam wa'DIch", - "LISTS_INDEX_OF_LAST": "Doch sam Qav", - "LISTS_GET_INDEX_GET": "Suq", - "LISTS_GET_INDEX_GET_REMOVE": "Suq vaj pej", - "LISTS_GET_INDEX_REMOVE": "pej", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# Qav", - "LISTS_GET_INDEX_FIRST": "wa'DIch", - "LISTS_GET_INDEX_LAST": "Qav", - "LISTS_GET_INDEX_RANDOM": "Sahbe'", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_SET_INDEX_SET": "choH", - "LISTS_SET_INDEX_INSERT": "lIH", - "LISTS_SET_INDEX_INPUT_TO": "Dos", - "LISTS_GET_SUBLIST_START_FROM_START": "tetlhHom moHaq #", - "LISTS_GET_SUBLIST_START_FROM_END": "tetlhHom moHaq # Qav", - "LISTS_GET_SUBLIST_START_FIRST": "tetlhHom moHaq wa'DIch", - "LISTS_GET_SUBLIST_END_FROM_START": "mojaQ #", - "LISTS_GET_SUBLIST_END_FROM_END": "mojaQ # Qav", - "LISTS_GET_SUBLIST_END_LAST": "mojaQ Qav", - "LISTS_GET_SUBLIST_TAIL": "Suq", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_CREATE_SET": "chel 'choH %1'", - "VARIABLES_SET": "choH %1 %2", - "VARIABLES_SET_CREATE_GET": "chel 'Suq %1'", - "PROCEDURES_DEFNORETURN_TITLE": "ruch", - "PROCEDURES_DEFNORETURN_PROCEDURE": "mIw", - "PROCEDURES_BEFORE_PARAMS": "qel:", - "PROCEDURES_CALL_BEFORE_PARAMS": "qel:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFRETURN_RETURN": "chegh", - "PROCEDURES_DEF_DUPLICATE_WARNING": "ghuHmoHna': qelwI' cha'logh chen.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "qelwI'mey", - "PROCEDURES_MUTATORARG_TITLE": "pong:", - "PROCEDURES_HIGHLIGHT_DEF": "mIwna' wew", - "PROCEDURES_CREATE_DO": "chel '%1'", - "PROCEDURES_IFRETURN_WARNING": "ghoHmoHna': ngoghvam ngaSbe' mIwDaq." -} diff --git a/msg/json/tr.json b/msg/json/tr.json deleted file mode 100644 index 8cd96a3ed1..0000000000 --- a/msg/json/tr.json +++ /dev/null @@ -1,330 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Meelo", - "Joseph", - "WikiBronze", - "Mavrikant", - "아라", - "Watermelon juice", - "Uğurkent", - "McAang" - ] - }, - "VARIABLES_DEFAULT_NAME": "öge", - "TODAY": "Bugün", - "DUPLICATE_BLOCK": "Çoğalt", - "ADD_COMMENT": "Yorum Ekle", - "REMOVE_COMMENT": "Yorumu Sil", - "EXTERNAL_INPUTS": "Harici Girişler", - "INLINE_INPUTS": "Satır içi girdiler", - "DELETE_BLOCK": "Bloğu Sil", - "DELETE_X_BLOCKS": "%1 Blokları Sil", - "DELETE_ALL_BLOCKS": "Tüm %1 blok silinsin mi?", - "CLEAN_UP": "Blokları temizle", - "COLLAPSE_BLOCK": "Blok'u Daralt", - "COLLAPSE_ALL": "Blokları Daralt", - "EXPAND_BLOCK": "Bloğu Genişlet", - "EXPAND_ALL": "Blokları Genişlet", - "DISABLE_BLOCK": "Bloğu Devre Dışı Bırak", - "ENABLE_BLOCK": "Bloğu Etkinleştir", - "HELP": "Yardım", - "CHAT": "Bu kutuya yazarak iş birlikçin ile sohbet et!", - "AUTH": "Çalışmanızın kaydedilmesi ve sizinle paylaşılmasına izin verilmesi için lütfen bu uygulamaya yetki verin.", - "ME": "Beni", - "CHANGE_VALUE_TITLE": "Değeri değiştir:", - "NEW_VARIABLE": "Yeni değişken...", - "NEW_VARIABLE_TITLE": "Yeni değişken ismi :", - "RENAME_VARIABLE": "Değişkeni yeniden adlandır...", - "RENAME_VARIABLE_TITLE": "Tüm '%1' değişkenlerini yeniden isimlendir:", - "COLOUR_PICKER_HELPURL": "https://tr.wikipedia.org/wiki/Renk", - "COLOUR_PICKER_TOOLTIP": "Paletten bir renk seçin.", - "COLOUR_RANDOM_TITLE": "rastgele renk", - "COLOUR_RANDOM_TOOLTIP": "Rastgele bir renk seçin.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "renk değerleri", - "COLOUR_RGB_RED": "kırmızı", - "COLOUR_RGB_GREEN": "yeşil", - "COLOUR_RGB_BLUE": "mavi", - "COLOUR_RGB_TOOLTIP": "Kırmızı, yeşil ve mavinin belirtilen miktarıyla bir renk oluşturun. Tüm değerler 0 ile 100 arasında olmalıdır.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "karıştır", - "COLOUR_BLEND_COLOUR1": "renk 1", - "COLOUR_BLEND_COLOUR2": "renk 2", - "COLOUR_BLEND_RATIO": "oran", - "COLOUR_BLEND_TOOLTIP": "Verilen bir orana bağlı olarak iki rengi karıştırır. (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://tr.wikipedia.org/wiki/For_d%C3%B6ng%C3%BCs%C3%BC", - "CONTROLS_REPEAT_TITLE": "%1 kez tekrarla", - "CONTROLS_REPEAT_INPUT_DO": "yap", - "CONTROLS_REPEAT_TOOLTIP": "Bazı işlemleri birkaç kez yap.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "tekrar ederken", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "kadar tekrarla", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Bir değer doğru olduğunda bazı beyanlarda bulun.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Bir değer yanlış olduğunda bazı beyanlarda bulun.", - "CONTROLS_FOR_TOOLTIP": "\"%1\" değişkenini başlangıç numarasından bitiş numarasına kadar tanımlı farkla değerler verirken tanımlı blokları yap.", - "CONTROLS_FOR_TITLE": "ile sayılır %1 %2 den %3 ye, her adımda %4 değişim", - "CONTROLS_FOREACH_TITLE": "her öğe için %1 listede %2", - "CONTROLS_FOREACH_TOOLTIP": "Bir listedeki her öğe için '%1' değişkenini maddeye atayın ve bundan sonra bazı açıklamalar yapın.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "döngüden çık", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "döngünün sonraki adımından devam et", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "İçeren döngüden çık.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Bu döngünün geri kalanını atlayın ve sonraki adım ile devam edin.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Uyarı: Bu blok sadece bir döngü içinde kullanılabilir.", - "CONTROLS_IF_TOOLTIP_1": "Eğer değişken true , yani gerçekleşmiş ise , ardından gelen işlemi yerine getir .", - "CONTROLS_IF_TOOLTIP_2": "Eğer değişken true, yani gerçekleşiyor ise ilk blok'taki işlemleri yerine getir, Aksi halde ikinci blok'taki işlemleri yerine getir.", - "CONTROLS_IF_TOOLTIP_3": "Eğer ilk değişken true, yani koşul gerçekleşmiş ise ilk blok içerisindeki işlem(ler)i gerçekleştir. Eğer ikinci değişken true ise, ikinci bloktaki işlem(ler)i gerçekleştir .", - "CONTROLS_IF_TOOLTIP_4": "Eğer ilk değer true, yani olumlu ise, ilk blok'taki işlem(ler)i gerçekleştir. İlk değer true değil ama ikinci değer true ise, ikinci bloktaki işlem(ler)i gerçekleştir. Eğer değerlerin hiçbiri true değil ise son blok'taki işlem(ler)i gerçekleştir.", - "CONTROLS_IF_MSG_IF": "eğer", - "CONTROLS_IF_MSG_ELSEIF": "değilse eğer", - "CONTROLS_IF_MSG_ELSE": "değilse", - "CONTROLS_IF_IF_TOOLTIP": "If bloğuna ekle, kaldır veya yeniden düzenleme yap.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "If bloğuna bir koşul ekleyin.", - "CONTROLS_IF_ELSE_TOOLTIP": "If bloğuna kalan durumları \"yakalayan\" bir son ekle.", - "LOGIC_COMPARE_HELPURL": "https://tr.wikipedia.org/wiki/E%C5%9Fitsizlikler", - "LOGIC_COMPARE_TOOLTIP_EQ": "Girilen iki değer birbirine eşitse \"True\" değerini verir.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Girilen iki değerde birbirine eşit değilse \"True\" değerini verir.", - "LOGIC_COMPARE_TOOLTIP_LT": "Girilen ilk değer ikinci değerden küçükse \"True\" değerini verir.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Girilen ilk değer ikinci değerden küçük veya eşitse \"True\" değerini verir.", - "LOGIC_COMPARE_TOOLTIP_GT": "Girilen ilk değer ikinci değerden daha büyükse \"True\" değerini verir.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Girilen ilk değer ikinci değerden büyük veya eşitse \"True\" değerini verir.", - "LOGIC_OPERATION_TOOLTIP_AND": "Girilen iki değerde doğruysa \"True\" değerini verir.", - "LOGIC_OPERATION_AND": "ve", - "LOGIC_OPERATION_TOOLTIP_OR": "Girilen iki değerden en az biri doğruysa \"True\" değerini verir.", - "LOGIC_OPERATION_OR": "veya", - "LOGIC_NEGATE_TITLE": "%1 değil", - "LOGIC_NEGATE_TOOLTIP": "Girilen değer yanlışsa \"True\" değerini verir.Girilen değer doğruysa \"False\" değerini verir.", - "LOGIC_BOOLEAN_TRUE": "Olumlu", - "LOGIC_BOOLEAN_FALSE": "false = Olumsuz", - "LOGIC_BOOLEAN_TOOLTIP": "Ya 'True' yada 'False' değerini verir.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "sıfır", - "LOGIC_NULL_TOOLTIP": "sıfır verir.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "test", - "LOGIC_TERNARY_IF_TRUE": "doğru ise", - "LOGIC_TERNARY_IF_FALSE": "yanlış ise", - "LOGIC_TERNARY_TOOLTIP": "'test'deki şartı test eder. Eğer şart doğru ise 'doğru' değeri döndürür, aksi halde 'yanlış' değeri döndürür.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", - "MATH_NUMBER_TOOLTIP": "Bir sayı.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "tire", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "x", - "MATH_POWER_SYMBOL": "üst alma", - "MATH_TRIG_SIN": "Sinüs", - "MATH_TRIG_COS": "kosünüs", - "MATH_TRIG_TAN": "tanjant", - "MATH_TRIG_ASIN": "asinüs", - "MATH_TRIG_ACOS": "akosünüs", - "MATH_TRIG_ATAN": "atanjant", - "MATH_ARITHMETIC_HELPURL": "https://tr.wikipedia.org/wiki/Aritmetik", - "MATH_ARITHMETIC_TOOLTIP_ADD": "İki rakamın toplamını döndür.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "İki sayını farkını döndür.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "İki sayının çarpımını döndür.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "İki sayının bölümünü döndür.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "İlk sayinin ikincinin kuvvetine yükseltilmişini döndür.", - "MATH_SINGLE_HELPURL": "https://tr.wikipedia.org/wiki/Karek%C3%B6k", - "MATH_SINGLE_OP_ROOT": "Kare kök", - "MATH_SINGLE_TOOLTIP_ROOT": "Bir sayının karekökü nü döndür .", - "MATH_SINGLE_OP_ABSOLUTE": "Kesin", - "MATH_SINGLE_TOOLTIP_ABS": "Bir sayının tam değerini döndür .", - "MATH_SINGLE_TOOLTIP_NEG": "Bir sayıyı geçersiz olarak döndür .", - "MATH_SINGLE_TOOLTIP_LN": "Bir sayının doğal logaritmasını döndür .", - "MATH_SINGLE_TOOLTIP_LOG10": "Bir sayının 10 temelinde logaritmasını döndür .", - "MATH_SINGLE_TOOLTIP_EXP": "Bir sayının e ' inci kuvvetini döndür .", - "MATH_SINGLE_TOOLTIP_POW10": "Bir sayının 10. kuvvetini döndür .", - "MATH_TRIG_HELPURL": "https://tr.wikipedia.org/wiki/Trigonometrik_fonksiyonlar", - "MATH_TRIG_TOOLTIP_SIN": "Bir açının sinüsünü döndür(radyan olarak değil).", - "MATH_TRIG_TOOLTIP_COS": "Bir açının kosinüsünü döndür(radyan olarak değil).", - "MATH_TRIG_TOOLTIP_TAN": "Bir açının tanjantını döndür(radyan olarak değil).", - "MATH_TRIG_TOOLTIP_ASIN": "Bir sayının ters sinüsünü döndür .", - "MATH_TRIG_TOOLTIP_ACOS": "Bir sayının ters kosunusunu döndür .", - "MATH_TRIG_TOOLTIP_ATAN": "Bir sayının ters tanjantını döndür .", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Yaygın sabitlerden birini döndür:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (sonsuz).", - "MATH_IS_EVEN": "çift", - "MATH_IS_ODD": "tek", - "MATH_IS_PRIME": "asal", - "MATH_IS_WHOLE": "Bütün olduğunu", - "MATH_IS_POSITIVE": "pozitif", - "MATH_IS_NEGATIVE": "negatif", - "MATH_IS_DIVISIBLE_BY": "bölünebilir", - "MATH_IS_TOOLTIP": "Bir sayinin çift mi tek mi , tam mı, asal mı , pozitif mi, negatif mi, veya tam bir sayıyla bölünebilirliğini kontrol et.'True' veya 'False' değerini döndür.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "%1'i %2 kadar değiştir", - "MATH_CHANGE_TOOLTIP": "'%1' değişkenine bir sayı ekle.", - "MATH_ROUND_TOOLTIP": "Bir sayı yı yukarı yada aşağı yuvarla .", - "MATH_ROUND_OPERATOR_ROUND": "Yuvarla", - "MATH_ROUND_OPERATOR_ROUNDUP": "yukarı yuvarla", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "aşağı yuvarla", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "Listenin toplamı", - "MATH_ONLIST_TOOLTIP_SUM": "Listede ki tüm sayıların toplamını döndür.", - "MATH_ONLIST_OPERATOR_MIN": "Listenin en küçüğü", - "MATH_ONLIST_TOOLTIP_MIN": "Listenin en küçüğünü döndür.", - "MATH_ONLIST_OPERATOR_MAX": "en büyük sayı", - "MATH_ONLIST_TOOLTIP_MAX": "Listenin en büyüğünü döndür.", - "MATH_ONLIST_OPERATOR_AVERAGE": "listenin ortalaması", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Listedeki sayısal değerlerin ortalamasını (aritmetik anlamda) döndür.", - "MATH_ONLIST_OPERATOR_MEDIAN": "Listenin medyanı", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Listenin medyanını döndür.", - "MATH_ONLIST_OPERATOR_MODE": "Listenin modları", - "MATH_ONLIST_TOOLTIP_MODE": "Listede ki en yaygın öğe veya öğelerinin listesini döndür.", - "MATH_ONLIST_OPERATOR_STD_DEV": "Listenin standart sapması", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Listenin standart sapmasını döndür.", - "MATH_ONLIST_OPERATOR_RANDOM": "Listenin rastgele öğesi", - "MATH_ONLIST_TOOLTIP_RANDOM": "Listeden rastgele bir element döndür.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "%1 ÷ %2 nin kalanı", - "MATH_MODULO_TOOLTIP": "İki sayının bölümünden kalanı döndür.", - "MATH_CONSTRAIN_TITLE": "%1 i en düşük %2 en yüksek %3 ile sınırla", - "MATH_CONSTRAIN_TOOLTIP": "Bir sayıyı belirli iki sayı arasında sınırlandır(dahil).", - "MATH_RANDOM_INT_HELPURL": "https://tr.wikipedia.org/wiki/Rastgele_say%C4%B1_%C3%BCretimi", - "MATH_RANDOM_INT_TITLE": "%1 ile %2 arasında rastgele tam sayı üret", - "MATH_RANDOM_INT_TOOLTIP": "Herhangi iki sayı arasında , sayılar dahil olmak üzere , rastgele bir tam sayı döndür.", - "MATH_RANDOM_FLOAT_HELPURL": "https://tr.wikipedia.org/wiki/Rastgele_say%C4%B1_%C3%BCretimi", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Rast gele kesirli sayı , yada parça", - "MATH_RANDOM_FLOAT_TOOLTIP": "0.0(dahil) ve 1.0 (hariç) sayıları arasında bir sayı döndür .", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Metnin bir harfi,kelimesi veya satırı.", - "TEXT_JOIN_TITLE_CREATEWITH": "ile metin oluştur", - "TEXT_JOIN_TOOLTIP": "Herhangi bir sayıda ki öğeleri bir araya getirerek metnin bir parçasını oluştur.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "Katıl", - "TEXT_CREATE_JOIN_TOOLTIP": "Bu metin bloğunu düzenlemek için bölüm ekle,sil veya yeniden görevlendir.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Metine bir öğe ekle.", - "TEXT_APPEND_TO": "e", - "TEXT_APPEND_APPENDTEXT": "Metin Ekle", - "TEXT_APPEND_TOOLTIP": "Değişken '%1' e bazı metinler ekleyin.", - "TEXT_LENGTH_TITLE": "%1 in uzunluğu", - "TEXT_LENGTH_TOOLTIP": "Yazı içerisinde verilen harflerin ( harf arasındaki boşluklar dahil) sayısını verir .", - "TEXT_ISEMPTY_TITLE": "%1 boş", - "TEXT_ISEMPTY_TOOLTIP": "Verilen metin boşsa true(doğru) değerini verir.", - "TEXT_INDEXOF_TOOLTIP": "İlk metnin ikinci metnin içindeki ilk ve son varoluşlarının indeksini döndürür.Metin bulunamadıysa 0 döndürür.", - "TEXT_INDEXOF_INPUT_INTEXT": "metinde", - "TEXT_INDEXOF_OPERATOR_FIRST": "Metnin ilk varolduğu yeri bul", - "TEXT_INDEXOF_OPERATOR_LAST": "Metnin son varolduğu yeri bul", - "TEXT_INDEXOF_TAIL": "", - "TEXT_CHARAT_INPUT_INTEXT": "metinde", - "TEXT_CHARAT_FROM_START": "# harfini al", - "TEXT_CHARAT_FROM_END": "# dan sona harfleri al", - "TEXT_CHARAT_FIRST": "İlk harfini al", - "TEXT_CHARAT_LAST": "son harfi al", - "TEXT_CHARAT_RANDOM": "Rastgele bir harf al", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "Belirli pozisyonda ki bir harfi döndürür.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Metinin belirli bir kısmını döndürür.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "metinde", - "TEXT_GET_SUBSTRING_START_FROM_START": "n inci harften alt-string alma", - "TEXT_GET_SUBSTRING_START_FROM_END": "n inci harften sona kadar alt-string alma", - "TEXT_GET_SUBSTRING_START_FIRST": "ilk harften başlayarak alt-string alma", - "TEXT_GET_SUBSTRING_END_FROM_START": "# harfe", - "TEXT_GET_SUBSTRING_END_FROM_END": "Sondan # harfe", - "TEXT_GET_SUBSTRING_END_LAST": "son harfe", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "Metnin bir kopyasını farklı bir harf durumunda (HEPSİ BÜYÜK - hepsi küçük) getirir.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "büyük harf", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "küçük harf", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Baş Harfler Büyük", - "TEXT_TRIM_TOOLTIP": "Metnin bir veya her iki sondan da boşlukları silinmiş şekilde kopyasını verir.", - "TEXT_TRIM_OPERATOR_BOTH": "iki tarafından da boşlukları temizle", - "TEXT_TRIM_OPERATOR_LEFT": "solundan boşlukları temizle", - "TEXT_TRIM_OPERATOR_RIGHT": "sağından boşlukları temizle", - "TEXT_PRINT_TITLE": "%1 ' i Yaz", - "TEXT_PRINT_TOOLTIP": "Belirli bir metni,sayıyı veya başka bir değeri yaz.", - "TEXT_PROMPT_TYPE_TEXT": "Kullanıcıdan yazım al , istek mesajıyla", - "TEXT_PROMPT_TYPE_NUMBER": "Kullanıcıdan sayı al , istek mesajı göstererek", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Kullanıcıdan sayı al .", - "TEXT_PROMPT_TOOLTIP_TEXT": "Kullanıcıdan Yazım al .", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "Boş liste oluştur", - "LISTS_CREATE_EMPTY_TOOLTIP": "Veri kaydı içermeyen uzunluğu 0 olan bir listeyi verir", - "LISTS_CREATE_WITH_TOOLTIP": "Herhangi sayıda nesne içeren bir liste oluştur.", - "LISTS_CREATE_WITH_INPUT_WITH": "İle liste oluşturma", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "liste", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Bu liste bloğunu yeniden yapılandırmak için bölüm ekle,kaldır veya yeniden çağır.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Listeye bir nesne ekle.", - "LISTS_REPEAT_TOOLTIP": "Verilen bir değerin , belirli bir sayıda tekrarlanmasından oluşan bir liste yaratır .", - "LISTS_REPEAT_TITLE": "%1 nesnenin %2 kez tekrarlandığı bir liste yarat", - "LISTS_LENGTH_TITLE": "%1'in uzunluğu", - "LISTS_LENGTH_TOOLTIP": "Bir listenin uzunluğunu verir.", - "LISTS_ISEMPTY_TITLE": "%1 boş", - "LISTS_ISEMPTY_TOOLTIP": "Eğer liste boş ise true döndürür .", - "LISTS_INLIST": "Listede", - "LISTS_INDEX_OF_FIRST": "Öğenin ilk varolduğu yeri bul", - "LISTS_INDEX_OF_LAST": "Öğenin son varolduğu yeri bul", - "LISTS_INDEX_OF_TOOLTIP": "Öğenin listede , ilk ve son görüldüğü dizinleri döndürür . Öğe bulunmassa , 0 döndürür .", - "LISTS_GET_INDEX_GET": "Al", - "LISTS_GET_INDEX_GET_REMOVE": "al ve kaldır", - "LISTS_GET_INDEX_REMOVE": "kaldır", - "LISTS_GET_INDEX_FROM_START": "# Kare", - "LISTS_GET_INDEX_FROM_END": "# sonundan", - "LISTS_GET_INDEX_FIRST": "ilk", - "LISTS_GET_INDEX_LAST": "son", - "LISTS_GET_INDEX_RANDOM": "rastgele", - "LISTS_GET_INDEX_TAIL": "", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Listede belirli pozisyondaki bir öğeyi verir.#1 ilk öğedir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Listede belirli pozisyondaki bir öğeyi verir.#1 son öğedir.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Listedeki ilk öğeyi verir.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Listedeki son öğeyi verir.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Listedeki rastgele bir öğeyi verir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Kaldırır ve listede belirtilen konumdaki bir öğeyi döndürür. #1 son öğedir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Kaldırır ve listede belirtilen konumdaki bir ögeyi döndürür. #1 son ögedir.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Kaldırır ve listedeki ilk öğeyi döndürür.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Kaldırır ve listedeki son öğeyi döndürür.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Kaldırır ve listedeki rastgele bir öğeyi verir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Bir liste içerisinde , tanımlanan pozisyonda ki öğeyi kaldırır.#1 ilk öğedir.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Liste içerisinde , tanımlanan pozisyondaki bir öğeyi kaldırır . #1 son öğe dir .", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Listedeki ilk nesneyi kaldırır.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Listedeki son nesneyi kaldırır.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Listedeki rastgele bir nesneyi kaldırır.", - "LISTS_SET_INDEX_SET": "yerleştir", - "LISTS_SET_INDEX_INSERT": "e yerleştir", - "LISTS_SET_INDEX_INPUT_TO": "olarak", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Bir öğeyi belirtilen yere göre listeye yerleştirir . #1 ilk öğedir .", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Bir öğeyi belirtilen yere göre listeye yerleştirir . #1 son öğedir .", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Bir listenin ilk öğesini yerleştirir .", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Bir listedeki son öğeyi yerleştirir .", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Listeye rast gele bir öğe yerleştirir .", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Bir öğeyi belirtilen pozisyona göre listeye yerleştirir . #1 ilk öğedir .", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Bir öğeyi , belirtilen yer pozisyonuna göre , listeye yerleştirir . #1 son öğedir .", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Nesneyi listenin başlangıcına ekler.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Öğeyi listenin sonuna ekle .", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Bir öğeyi listeye rast gele ekler .", - "LISTS_GET_SUBLIST_START_FROM_START": "# dan alt liste al", - "LISTS_GET_SUBLIST_START_FROM_END": "# işaretinden sonra gelen ifadeye göre alt liste al , # sondan", - "LISTS_GET_SUBLIST_START_FIRST": "ilk öğeden alt liste al", - "LISTS_GET_SUBLIST_END_FROM_START": "#'a", - "LISTS_GET_SUBLIST_END_FROM_END": "Sondan #'a kadar", - "LISTS_GET_SUBLIST_END_LAST": "Sona kadar", - "LISTS_GET_SUBLIST_TAIL": "", - "LISTS_GET_SUBLIST_TOOLTIP": "Listenin belirli bir kısmının kopyasını yaratır.", - "ORDINAL_NUMBER_SUFFIX": "", - "VARIABLES_GET_TOOLTIP": "Bu değişkenin değerini verir.", - "VARIABLES_GET_CREATE_SET": "'set %1' oluştur", - "VARIABLES_SET": "Atamak %1 e %2", - "VARIABLES_SET_TOOLTIP": "Bu değişkeni girilen değere eşitler.", - "VARIABLES_SET_CREATE_GET": "'get %1' oluştur", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFNORETURN_TITLE": "e", - "PROCEDURES_DEFNORETURN_PROCEDURE": "birşey yap", - "PROCEDURES_BEFORE_PARAMS": "ile :", - "PROCEDURES_CALL_BEFORE_PARAMS": "ile :", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Çıktı vermeyen bir fonksiyon yaratır .", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_DEFRETURN_RETURN": "Geri dön", - "PROCEDURES_DEFRETURN_TOOLTIP": "Çıktı veren bir fonksiyon oluşturur.", - "PROCEDURES_ALLOW_STATEMENTS": "Eğer ifadelerine izin ver", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Uyarı: Bu fonksiyon yinelenen parametreler vardır.", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Kullanıcı tanımlı fonksiyonu çalıştır '%1' .", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_TOOLTIP": "Kullanıcı tanımlı fonksiyonu çalıştır '%1' ve çıktısını kullan .", - "PROCEDURES_MUTATORCONTAINER_TITLE": "girdiler", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Bu işlevin girdilerini ekleyin, çıkarın, ya da yeniden sıralayın.", - "PROCEDURES_MUTATORARG_TITLE": "girdi adı:", - "PROCEDURES_MUTATORARG_TOOLTIP": "İşleve bir girdi ekleyin.", - "PROCEDURES_HIGHLIGHT_DEF": "Fonksiyon tanımı vurgulamak", - "PROCEDURES_CREATE_DO": "'%1' oluştur", - "PROCEDURES_IFRETURN_TOOLTIP": "Eğer değer doğruysa, ikinci değere geri dön.", - "PROCEDURES_IFRETURN_WARNING": "Uyarı: Bu blok yalnızca bir fonksiyon tanımı içinde kullanılır." -} diff --git a/msg/json/uk.json b/msg/json/uk.json deleted file mode 100644 index 3a4ddc699e..0000000000 --- a/msg/json/uk.json +++ /dev/null @@ -1,325 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Andriykopanytsia", - "Base", - "Igor Zavadsky", - "Lxlalexlxl", - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "елемент", - "TODAY": "Сьогодні", - "DUPLICATE_BLOCK": "Дублювати", - "ADD_COMMENT": "Додати коментар", - "REMOVE_COMMENT": "Видалити коментар", - "EXTERNAL_INPUTS": "Зовнішні входи", - "INLINE_INPUTS": "Вбудовані входи", - "DELETE_BLOCK": "Видалити блок", - "DELETE_X_BLOCKS": "Видалити %1 блоків", - "DELETE_ALL_BLOCKS": "Вилучити всі блоки %1?", - "CLEAN_UP": "Вирівняти блоки", - "COLLAPSE_BLOCK": "Згорнути блок", - "COLLAPSE_ALL": "Згорнути блоки", - "EXPAND_BLOCK": "Розгорнути блок", - "EXPAND_ALL": "Розгорнути блоки", - "DISABLE_BLOCK": "Вимкнути блок", - "ENABLE_BLOCK": "Увімкнути блок", - "HELP": "Довідка", - "CHAT": "Спілкуйтеся з вашими співавторами, набираючи у цьому полі!", - "AUTH": "Будь ласка, авторизуйте цю програму, аби можна було зберігати вашу роботу і для надання можливості вам поширювати її.", - "ME": "Я", - "CHANGE_VALUE_TITLE": "Змінити значення:", - "NEW_VARIABLE": "Нова змінна...", - "NEW_VARIABLE_TITLE": "Нова назва змінної:", - "RENAME_VARIABLE": "Перейменувати змінну...", - "RENAME_VARIABLE_TITLE": "Перейменувати усі змінні \"%1\" до:", - "COLOUR_PICKER_HELPURL": "https://uk.wikipedia.org/wiki/Колір", - "COLOUR_PICKER_TOOLTIP": "Вибрати колір з палітри.", - "COLOUR_RANDOM_TITLE": "випадковий колір", - "COLOUR_RANDOM_TOOLTIP": "Вибрати колір навмання.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", - "COLOUR_RGB_TITLE": "колір з", - "COLOUR_RGB_RED": "червоний", - "COLOUR_RGB_GREEN": "зелений", - "COLOUR_RGB_BLUE": "синій", - "COLOUR_RGB_TOOLTIP": "Створити колір зі вказаними рівнями червоного, зеленого та синього. Усі значення мають бути від 0 до 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", - "COLOUR_BLEND_TITLE": "змішати", - "COLOUR_BLEND_COLOUR1": "колір 1", - "COLOUR_BLEND_COLOUR2": "колір 2", - "COLOUR_BLEND_RATIO": "співвідношення", - "COLOUR_BLEND_TOOLTIP": "Змішує два кольори разом у вказаному співвідношені (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://uk.wikipedia.org/wiki/Цикл_(програмування)#.D0.A6.D0.B8.D0.BA.D0.BB_.D0.B7_.D0.BB.D1.96.D1.87.D0.B8.D0.BB.D1.8C.D0.BD.D0.B8.D0.BA.D0.BE.D0.BC", - "CONTROLS_REPEAT_TITLE": "повторити %1 разів", - "CONTROLS_REPEAT_INPUT_DO": "виконати", - "CONTROLS_REPEAT_TOOLTIP": "Виконати певні дії декілька разів.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "повторювати поки", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "повторювати, доки не", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Поки значення істинне, виконувати певні дії.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Поки значення хибне, виконувати певні дії.", - "CONTROLS_FOR_TOOLTIP": "Наявна змінна \"%1\" набуває значень від початкового до кінцевого, враховуючи заданий інтервал, і виконуються вказані блоки.", - "CONTROLS_FOR_TITLE": "рахувати з %1 від %2 до %3 через %4", - "CONTROLS_FOREACH_TITLE": "для кожного елемента %1 у списку %2", - "CONTROLS_FOREACH_TOOLTIP": "Для кожного елемента в списку змінна '%1' отримує значення елемента, а потім виконуються певні дії.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "перервати цикл", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "продовжити з наступної ітерації циклу", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Перервати виконання циклу.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Пропустити залишок цього циклу і перейти до виконання наступної ітерації.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Попередження: цей блок може бути використаний тільки в межах циклу.", - "CONTROLS_IF_TOOLTIP_1": "Якщо значення істинне, то виконати певні дії.", - "CONTROLS_IF_TOOLTIP_2": "Якщо значення істинне, то виконується перший блок операторів. В іншому випадку виконується другий блок операторів.", - "CONTROLS_IF_TOOLTIP_3": "Якщо перше значення істинне, то виконується перший блок операторів. В іншому випадку, якщо друге значення істина, то виконується другий блок операторів.", - "CONTROLS_IF_TOOLTIP_4": "Якщо перше значення істинне, то виконується перший блок операторів. В іншому випадку, якщо друге значення істинне, то виконується другий блок операторів. Якщо жодне із значень не є істинним, то виконується останній блок операторів.", - "CONTROLS_IF_MSG_IF": "якщо", - "CONTROLS_IF_MSG_ELSEIF": "інакше якщо", - "CONTROLS_IF_MSG_ELSE": "інакше", - "CONTROLS_IF_IF_TOOLTIP": "Додайте, вилучіть або змініть порядок секцій, щоб переналаштувати цей блок 'якщо'.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Додайте умову до блока 'якщо'.", - "CONTROLS_IF_ELSE_TOOLTIP": "Додати остаточну, всеосяжну умову до блоку 'якщо'.", - "LOGIC_COMPARE_HELPURL": "https://uk.wikipedia.org/wiki/Нерівність", - "LOGIC_COMPARE_TOOLTIP_EQ": "Повертає істину, якщо обидва входи рівні один одному.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Повертає істину, якщо обидва входи не дорівнюють один одному.", - "LOGIC_COMPARE_TOOLTIP_LT": "Повертає істину, якщо перше вхідне значення менше, ніж друге.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Повертає істину, якщо перше вхідне значення менше або дорівнює другому.", - "LOGIC_COMPARE_TOOLTIP_GT": "Повертає істину, якщо перше вхідне значення більше, ніж друге.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Повертає істину, якщо перше вхідне значення більше або дорівнює другому.", - "LOGIC_OPERATION_TOOLTIP_AND": "Повертає істину, якщо обидва входи істинні.", - "LOGIC_OPERATION_AND": "та", - "LOGIC_OPERATION_TOOLTIP_OR": "Повертає істину, якщо принаймні один з входів істинний.", - "LOGIC_OPERATION_OR": "або", - "LOGIC_NEGATE_TITLE": "не %1", - "LOGIC_NEGATE_TOOLTIP": "Повертає істину, якщо вхідне значення хибне. Повертає хибність, якщо вхідне значення істинне.", - "LOGIC_BOOLEAN_TRUE": "істина", - "LOGIC_BOOLEAN_FALSE": "хибність", - "LOGIC_BOOLEAN_TOOLTIP": "Повертає значення істина або хибність.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", - "LOGIC_NULL": "ніщо", - "LOGIC_NULL_TOOLTIP": "Повертає ніщо.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", - "LOGIC_TERNARY_CONDITION": "тест", - "LOGIC_TERNARY_IF_TRUE": "якщо істина", - "LOGIC_TERNARY_IF_FALSE": "якщо хибність", - "LOGIC_TERNARY_TOOLTIP": "Перевіряє умову в 'тест'. Якщо умова істинна, то повертає значення 'якщо істина'; в іншому випадку повертає значення 'якщо хибність'.", - "MATH_NUMBER_HELPURL": "https://uk.wikipedia.org/wiki/Число", - "MATH_NUMBER_TOOLTIP": "Число.", - "MATH_ARITHMETIC_HELPURL": "https://uk.wikipedia.org/wiki/Арифметика", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Повертає суму двох чисел.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Повертає різницю двох чисел.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Повертає добуток двох чисел.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Повертає частку двох чисел.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Повертає перше число, піднесене до степеня, вираженого другим числом.", - "MATH_SINGLE_HELPURL": "https://uk.wikipedia.org/wiki/Квадратний_корінь", - "MATH_SINGLE_OP_ROOT": "квадратний корінь", - "MATH_SINGLE_TOOLTIP_ROOT": "Повертає квадратний корінь з числа.", - "MATH_SINGLE_OP_ABSOLUTE": "модуль", - "MATH_SINGLE_TOOLTIP_ABS": "Повертає модуль числа.", - "MATH_SINGLE_TOOLTIP_NEG": "Повертає протилежне число.", - "MATH_SINGLE_TOOLTIP_LN": "Повертає натуральний логарифм числа.", - "MATH_SINGLE_TOOLTIP_LOG10": "Повертає десятковий логарифм числа.", - "MATH_SINGLE_TOOLTIP_EXP": "Повертає e у степені.", - "MATH_SINGLE_TOOLTIP_POW10": "Повертає 10 у степені.", - "MATH_TRIG_HELPURL": "https://uk.wikipedia.org/wiki/Тригонометричні_функції", - "MATH_TRIG_TOOLTIP_SIN": "Повертає синус кута в градусах (не в радіанах).", - "MATH_TRIG_TOOLTIP_COS": "Повертає косинус кута в градусах (не в радіанах).", - "MATH_TRIG_TOOLTIP_TAN": "Повертає тангенс кута в градусах (не в радіанах).", - "MATH_TRIG_TOOLTIP_ASIN": "Повертає арксинус числа.", - "MATH_TRIG_TOOLTIP_ACOS": "Повертає арккосинус числа.", - "MATH_TRIG_TOOLTIP_ATAN": "Повертає арктангенс числа.", - "MATH_CONSTANT_HELPURL": "https://uk.wikipedia.org/wiki/Математична_константа", - "MATH_CONSTANT_TOOLTIP": "Повертає одну з поширених констант: π (3.141...), e (2.718...), φ (1,618...), sqrt(2) (1.414...), sqrt(½) (0.707...) або ∞ (нескінченність).", - "MATH_IS_EVEN": "парне", - "MATH_IS_ODD": "непарне", - "MATH_IS_PRIME": "просте", - "MATH_IS_WHOLE": "ціле", - "MATH_IS_POSITIVE": "додатне", - "MATH_IS_NEGATIVE": "від'ємне", - "MATH_IS_DIVISIBLE_BY": "ділиться на", - "MATH_IS_TOOLTIP": "Перевіряє, чи число парне, непарне, просте, ціле, додатне, від'ємне або чи воно ділиться на певне число без остачі. Повертає істину або хибність.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", - "MATH_CHANGE_TITLE": "змінити %1 на %2", - "MATH_CHANGE_TOOLTIP": "Додати число до змінної '%1'.", - "MATH_ROUND_HELPURL": "https://uk.wikipedia.org/wiki/Округлення", - "MATH_ROUND_TOOLTIP": "Округлення числа до більшого або до меншого.", - "MATH_ROUND_OPERATOR_ROUND": "округлити", - "MATH_ROUND_OPERATOR_ROUNDUP": "округлити до більшого", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "округлити до меншого", - "MATH_ONLIST_HELPURL": "http://www.mapleprimes.com/questions/100441-Applying-Function-To-List-Of-Numbers", - "MATH_ONLIST_OPERATOR_SUM": "сума списку", - "MATH_ONLIST_TOOLTIP_SUM": "Повертає суму всіх чисел у списку.", - "MATH_ONLIST_OPERATOR_MIN": "мінімум списку", - "MATH_ONLIST_TOOLTIP_MIN": "Повертає найменше число у списку.", - "MATH_ONLIST_OPERATOR_MAX": "максимум списку", - "MATH_ONLIST_TOOLTIP_MAX": "Повертає найбільше число у списку.", - "MATH_ONLIST_OPERATOR_AVERAGE": "середнє списку", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Повертає середнє (арифметичне) числових значень у списку.", - "MATH_ONLIST_OPERATOR_MEDIAN": "медіана списку", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Повертає медіану списку.", - "MATH_ONLIST_OPERATOR_MODE": "моди списку", - "MATH_ONLIST_TOOLTIP_MODE": "Повертає перелік найпоширеніших елементів у списку.", - "MATH_ONLIST_OPERATOR_STD_DEV": "стандартне відхилення списку", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Повертає стандартне відхилення списку.", - "MATH_ONLIST_OPERATOR_RANDOM": "випадковий елемент списку", - "MATH_ONLIST_TOOLTIP_RANDOM": "Повертає випадковий елемент зі списку.", - "MATH_MODULO_HELPURL": "https://uk.wikipedia.org/wiki/Ділення_з_остачею", - "MATH_MODULO_TITLE": "остача від %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Повертає остачу від ділення двох чисел.", - "MATH_CONSTRAIN_TITLE": "обмежити %1 від %2 до %3", - "MATH_CONSTRAIN_TOOLTIP": "Обмежує число вказаними межами (включно).", - "MATH_RANDOM_INT_HELPURL": "https://uk.wikipedia.org/wiki/Генерація_випадкових_чисел", - "MATH_RANDOM_INT_TITLE": "випадкове ціле число від %1 до %2", - "MATH_RANDOM_INT_TOOLTIP": "Повертає випадкове ціле число між двома заданими межами включно.", - "MATH_RANDOM_FLOAT_HELPURL": "https://uk.wikipedia.org/wiki/Генерація_випадкових_чисел", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "випадковий дріб", - "MATH_RANDOM_FLOAT_TOOLTIP": "Повертає випадковий дріб від 0,0 (включно) та 1.0 (не включно).", - "TEXT_TEXT_HELPURL": "https://uk.wikipedia.org/wiki/Рядок_(програмування)", - "TEXT_TEXT_TOOLTIP": "Символ, слово або рядок тексту.", - "TEXT_JOIN_HELPURL": "http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_8.html", - "TEXT_JOIN_TITLE_CREATEWITH": "створити текст з", - "TEXT_JOIN_TOOLTIP": "Створити фрагмент тексту шляхом з'єднування будь-якого числа елементів.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "приєднати", - "TEXT_CREATE_JOIN_TOOLTIP": "Додайте, вилучіть або змініть порядок секцій для переналаштування текстового блоку.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Додати елемент до тексту.", - "TEXT_APPEND_TO": "до", - "TEXT_APPEND_APPENDTEXT": "додати текст", - "TEXT_APPEND_TOOLTIP": "Додати деякий текст до змінної '%1'.", - "TEXT_LENGTH_TITLE": "довжина %1", - "TEXT_LENGTH_TOOLTIP": "Повертає число символів (включно з пропусками) у даному тексті.", - "TEXT_ISEMPTY_TITLE": "%1 є порожнім", - "TEXT_ISEMPTY_TOOLTIP": "Повертає істину, якщо вказаний текст порожній.", - "TEXT_INDEXOF_TOOLTIP": "Повертає індекс першого/останнього входження першого тексту в другий. Повертає 0, якщо текст не знайдено.", - "TEXT_INDEXOF_INPUT_INTEXT": "у тексті", - "TEXT_INDEXOF_OPERATOR_FIRST": "знайти перше входження тексту", - "TEXT_INDEXOF_OPERATOR_LAST": "знайти останнє входження тексту", - "TEXT_INDEXOF_TAIL": ".", - "TEXT_CHARAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "TEXT_CHARAT_INPUT_INTEXT": "у тексті", - "TEXT_CHARAT_FROM_START": "отримати символ #", - "TEXT_CHARAT_FROM_END": "отримати символ # з кінця", - "TEXT_CHARAT_FIRST": "отримати перший символ", - "TEXT_CHARAT_LAST": "отримати останній символ", - "TEXT_CHARAT_RANDOM": "отримати випадковий символ", - "TEXT_CHARAT_TAIL": "-ий.", - "TEXT_CHARAT_TOOLTIP": "Повертає символ у зазначеній позиції.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Повертає заданий фрагмент тексту.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "у тексті", - "TEXT_GET_SUBSTRING_START_FROM_START": "отримати підрядок від символу #", - "TEXT_GET_SUBSTRING_START_FROM_END": "отримати підрядок від символу # з кінця", - "TEXT_GET_SUBSTRING_START_FIRST": "отримати підрядок від першого символу", - "TEXT_GET_SUBSTRING_END_FROM_START": "до символу #", - "TEXT_GET_SUBSTRING_END_FROM_END": "до символу # з кінця", - "TEXT_GET_SUBSTRING_END_LAST": "до останнього символу", - "TEXT_GET_SUBSTRING_TAIL": "-ого.", - "TEXT_CHANGECASE_TOOLTIP": "В іншому випадку повертає копію тексту.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "до ВЕРХНЬОГО регістру", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "до нижнього регістру", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Великі Перші Букви", - "TEXT_TRIM_TOOLTIP": "Повертає копію тексту з вилученими пропусками з одного або обох кінців.", - "TEXT_TRIM_OPERATOR_BOTH": "вилучити крайні пропуски з обох кінців", - "TEXT_TRIM_OPERATOR_LEFT": "вилучити пропуски з лівого боку", - "TEXT_TRIM_OPERATOR_RIGHT": "вилучити пропуски з правого боку", - "TEXT_PRINT_TITLE": "друк %1", - "TEXT_PRINT_TOOLTIP": "Надрукувати заданий текст, числа або інші значення.", - "TEXT_PROMPT_TYPE_TEXT": "запит тексту з повідомленням", - "TEXT_PROMPT_TYPE_NUMBER": "запит числа з повідомленням", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Запитати у користувача число.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Запитати у користувача деякий текст.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "створити порожній список", - "LISTS_CREATE_EMPTY_TOOLTIP": "Повертає список, довжиною 0, що не містить записів даних", - "LISTS_CREATE_WITH_TOOLTIP": "Створює список з будь-якою кількістю елементів.", - "LISTS_CREATE_WITH_INPUT_WITH": "створити список з", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "список", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Додайте, вилучіть або змініть порядок секцій для переналаштування блока списку.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Додати елемент до списку.", - "LISTS_REPEAT_TOOLTIP": "Створює список, що складається з заданого значення повтореного задану кількість разів.", - "LISTS_REPEAT_TITLE": "створити список з елемента %1 повтореного %2 разів", - "LISTS_LENGTH_TITLE": "довжина %1", - "LISTS_LENGTH_TOOLTIP": "Повертає довжину списку.", - "LISTS_ISEMPTY_TITLE": "%1 є порожнім", - "LISTS_ISEMPTY_TOOLTIP": "Повертає істину, якщо список порожній.", - "LISTS_INLIST": "у списку", - "LISTS_INDEX_OF_FIRST": "знайти перше входження елемента", - "LISTS_INDEX_OF_LAST": "знайти останнє входження елемента", - "LISTS_INDEX_OF_TOOLTIP": "Повертає індекс першого/останнього входження елемента у списку. Повертає 0, якщо елемент не знайдено.", - "LISTS_GET_INDEX_GET": "отримати", - "LISTS_GET_INDEX_GET_REMOVE": "отримати і вилучити", - "LISTS_GET_INDEX_REMOVE": "вилучити", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "# з кінця", - "LISTS_GET_INDEX_FIRST": "перший", - "LISTS_GET_INDEX_LAST": "останній", - "LISTS_GET_INDEX_RANDOM": "випадковий", - "LISTS_GET_INDEX_TAIL": "-ий.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Повертає елемент у заданій позиції у списку. #1 - це перший елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Повертає елемент у заданій позиції у списку. #1 - це останній елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Повертає перший елемент списку.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Повертає останній елемент списку.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Повертає випадковий елемент списку.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Видаляє і повертає елемент у заданій позиції у списку. #1 - це перший елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Видаляє і повертає елемент у заданій позиції у списку. #1 - це останній елемент.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Видаляє і повертає перший елемент списку.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Видаляє і повертає останній елемент списку.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Видаляє і повертає випадковий елемент списоку.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Вилучає зі списку елемент у вказаній позиції. #1 - це перший елемент.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Вилучає зі списку елемент у вказаній позиції. #1 - це останній елемент.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Вилучає перший елемент списку.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Вилучає останній елемент списку.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Вилучає випадковий елемент списку.", - "LISTS_SET_INDEX_SET": "встановити", - "LISTS_SET_INDEX_INSERT": "вставити в", - "LISTS_SET_INDEX_INPUT_TO": "як", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Задає елемент списку у вказаній позиції. #1 - це перший елемент.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Задає елемент списку у вказаній позиції. #1 - це останній елемент.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Задає перший елемент списку.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Задає останній елемент списку.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Задає випадковий елемент у списку.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Вставка елемента у вказану позицію списку. #1 - перший елемент.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Вставляє елемент у вказану позицію списку. #1 - це останній елемент.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Вставляє елемент на початок списку.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Додає елемент у кінці списку.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Випадковим чином вставляє елемент у список.", - "LISTS_GET_SUBLIST_START_FROM_START": "отримати вкладений список з #", - "LISTS_GET_SUBLIST_START_FROM_END": "отримати вкладений список від # з кінця", - "LISTS_GET_SUBLIST_START_FIRST": "отримати вкладений список з першого", - "LISTS_GET_SUBLIST_END_FROM_START": "до #", - "LISTS_GET_SUBLIST_END_FROM_END": "до # з кінця", - "LISTS_GET_SUBLIST_END_LAST": "до останнього", - "LISTS_GET_SUBLIST_TAIL": "символу.", - "LISTS_GET_SUBLIST_TOOLTIP": "Створює копію вказаної частини списку.", - "LISTS_SPLIT_LIST_FROM_TEXT": "зробити з тексту список", - "LISTS_SPLIT_TEXT_FROM_LIST": "зробити зі списку текст", - "LISTS_SPLIT_WITH_DELIMITER": "з розділювачем", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Поділити текст на список текстів, розриваючи на кожному розділювачі.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Злити список текстів у єдиний текст, відокремивши розділювачами.", - "ORDINAL_NUMBER_SUFFIX": "-ий.", - "VARIABLES_GET_TOOLTIP": "Повертає значення цієї змінної.", - "VARIABLES_GET_CREATE_SET": "Створити 'встановити %1'", - "VARIABLES_SET": "встановити %1 до %2", - "VARIABLES_SET_TOOLTIP": "Задає цю змінну рівною входу.", - "VARIABLES_SET_CREATE_GET": "Створити 'отримати %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://uk.wikipedia.org/wiki/Підпрограма", - "PROCEDURES_DEFNORETURN_TITLE": "до", - "PROCEDURES_DEFNORETURN_PROCEDURE": "щось зробити", - "PROCEDURES_BEFORE_PARAMS": "з:", - "PROCEDURES_CALL_BEFORE_PARAMS": "з:", - "PROCEDURES_DEFNORETURN_DO": "блок тексту", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Створює функцію без виводу.", - "PROCEDURES_DEFRETURN_HELPURL": "https://uk.wikipedia.org/wiki/Підпрограма", - "PROCEDURES_DEFRETURN_RETURN": "повернути", - "PROCEDURES_DEFRETURN_TOOLTIP": "Створює функцію з виводом.", - "PROCEDURES_ALLOW_STATEMENTS": "дозволити дії", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Увага: ця функція має дубльовані параметри.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://uk.wikipedia.org/wiki/Підпрограма", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Запустити користувацьку функцію \"%1\".", - "PROCEDURES_CALLRETURN_HELPURL": "https://uk.wikipedia.org/wiki/Підпрограма", - "PROCEDURES_CALLRETURN_TOOLTIP": "Запустити користувацьку функцію \"%1\" і використати її вивід.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "входи", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Додайте, вилучіть або змініть порядок вхідних параметрів для цієї функції.", - "PROCEDURES_MUTATORARG_TITLE": "назва входу:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Додати до функції вхідні параметри.", - "PROCEDURES_HIGHLIGHT_DEF": "Підсвітити визначення функції", - "PROCEDURES_CREATE_DO": "Створити \"%1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Якщо значення істинне, то повернути друге значення.", - "PROCEDURES_IFRETURN_WARNING": "Попередження: цей блок може використовуватися лише в межах визначення функції." -} diff --git a/msg/json/vi.json b/msg/json/vi.json deleted file mode 100644 index dba6f36183..0000000000 --- a/msg/json/vi.json +++ /dev/null @@ -1,304 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Baonguyen21022003", - "Espertus", - "Qneutron", - "Withoutaname", - "Dstream" - ] - }, - "VARIABLES_DEFAULT_NAME": "vật", - "DUPLICATE_BLOCK": "Tạo Bản Sao", - "ADD_COMMENT": "Thêm Chú Giải", - "REMOVE_COMMENT": "Xóa Chú Giải", - "EXTERNAL_INPUTS": "Chỗ Gắn Bên Ngoài", - "INLINE_INPUTS": "Chỗ Gắn Cùng Dòng", - "DELETE_BLOCK": "Xóa Mảnh Này", - "DELETE_X_BLOCKS": "Xóa %1 Mảnh", - "DELETE_ALL_BLOCKS": "Xóa hết %1 mảnh?", - "COLLAPSE_BLOCK": "Thu Nhỏ Mảnh", - "COLLAPSE_ALL": "Thu Nhỏ Mọi Mảnh", - "EXPAND_BLOCK": "Mở Lớn Mảnh", - "EXPAND_ALL": "Mở Lớn Mọi Mảnh", - "DISABLE_BLOCK": "Ngưng Tác Dụng", - "ENABLE_BLOCK": "Phục Hồi Tác Dụng", - "HELP": "Trợ Giúp", - "CHAT": "Trò chuyện với cộng tác viên của bạn bằng cách gõ vào hộp này!", - "AUTH": "Vui lòng cho phép ứng dụng được lưu dữ liệu của bạn và tự động chia sẻ bằng tên của bạn", - "ME": "Tôi", - "CHANGE_VALUE_TITLE": "Thay giá trị thành:", - "NEW_VARIABLE": "Biến mới...", - "NEW_VARIABLE_TITLE": "Tên của biến mới:", - "RENAME_VARIABLE": "Thay tên biến...", - "RENAME_VARIABLE_TITLE": "Thay tên tất cả \"%1\" biến này thành:", - "COLOUR_PICKER_HELPURL": "https://vi.wikipedia.org/wiki/M%C3%A0u_s%E1%BA%AFc", - "COLOUR_PICKER_TOOLTIP": "Chọn một màu từ bảng màu.", - "COLOUR_RANDOM_TITLE": "màu bất kỳ", - "COLOUR_RANDOM_TOOLTIP": "chọn một màu bất kỳ.", - "COLOUR_RGB_TITLE": "Tạo màu từ", - "COLOUR_RGB_RED": "màu đỏ", - "COLOUR_RGB_GREEN": "màu xanh lá cây", - "COLOUR_RGB_BLUE": "màu xanh dương", - "COLOUR_RGB_TOOLTIP": "Tạo màu từ ba màu: đỏ, xanh lá cây, xanh dương với số lượng cụ thể. Mỗi số phải có giá trị từ 0 đến 100.", - "COLOUR_BLEND_TITLE": "pha", - "COLOUR_BLEND_COLOUR1": "màu 1", - "COLOUR_BLEND_COLOUR2": "màu 2", - "COLOUR_BLEND_RATIO": "tỉ lệ", - "COLOUR_BLEND_TOOLTIP": "Pha hai màu với nhau theo tỉ lệ (0 - 100).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "lặp lại %1 lần", - "CONTROLS_REPEAT_INPUT_DO": "thực hiện", - "CONTROLS_REPEAT_TOOLTIP": "Thực hiện các lệnh vài lần.", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "lặp lại trong khi", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "lặp lại cho đến khi", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Miễn là điều kiện còn đúng, thì thực hiện các lệnh.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Miễn là điều kiện còn sai, thì thực hiện các lệnh. Khi điều kiện đúng thì ngưng.", - "CONTROLS_FOR_TOOLTIP": "Đếm từ số đầu đến số cuối. Khi đến mỗi số, gán số vào biến \"%1\" rồi thực hiện các lệnh.", - "CONTROLS_FOR_TITLE": "đếm theo %1 từ %2 đến %3 mỗi lần thêm %4", - "CONTROLS_FOREACH_TITLE": "với mỗi thành phần %1 trong danh sách %2", - "CONTROLS_FOREACH_TOOLTIP": "Trong một danh sách, lấy từng thành phần, gán vào biến \"%1\", rồi thực hiện một số lệnh.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "thoát", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "sang lần lặp tiếp theo", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Thoát khỏi vòng lặp hiện tại.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Bỏ qua phần còn lại trong vòng lặp này, và sang lần lặp tiếp theo.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Chú ý: Mảnh này chỉ có thế dùng trong các vòng lặp.", - "CONTROLS_IF_TOOLTIP_1": "Nếu điều kiện đúng, thực hiện các lệnh.", - "CONTROLS_IF_TOOLTIP_2": "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu sai, thực hiện các lệnh sau.", - "CONTROLS_IF_TOOLTIP_3": "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu không, nếu điều kiện thứ hai đúng, thực hiện các lệnh thứ hai.", - "CONTROLS_IF_TOOLTIP_4": "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu không, nếu điều kiện thứ hai đúng, thực hiện các lệnh thứ hai. Nếu không điều kiện nào đúng, thực hiện các lệnh cuối cùng.", - "CONTROLS_IF_MSG_IF": "nếu", - "CONTROLS_IF_MSG_ELSEIF": "nếu không nếu", - "CONTROLS_IF_MSG_ELSE": "nếu không", - "CONTROLS_IF_IF_TOOLTIP": "Thêm, bỏ, hoặc đổi thứ tự các mảnh con để tạo cấu trúc mới cho mảnh nếu.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Thêm một điều kiện vào mảnh nếu.", - "CONTROLS_IF_ELSE_TOOLTIP": "Cuối cùng, khi không điều kiện nào đúng.", - "LOGIC_COMPARE_HELPURL": "https://vi.wikipedia.org/wiki/B%E1%BA%A5t_%C4%91%E1%BA%B3ng_th%E1%BB%A9c", - "LOGIC_COMPARE_TOOLTIP_EQ": "Hoàn trả giá trị \"đúng\" (true) nếu giá trị hai đầu vào bằng nhau.", - "LOGIC_COMPARE_TOOLTIP_NEQ": "Hoàn trả giá trị \"đúng\" (true) nếu giá trị hai đầu vào không bằng nhau.", - "LOGIC_COMPARE_TOOLTIP_LT": "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất nhỏ hơn đầu vào thứ hai.", - "LOGIC_COMPARE_TOOLTIP_LTE": "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất nhỏ hơn hoặc bằng đầu vào thứ hai.", - "LOGIC_COMPARE_TOOLTIP_GT": "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất lớn hơn đầu vào thứ hai.", - "LOGIC_COMPARE_TOOLTIP_GTE": "Hoàn trả giá trị \"đúng\" (true) nếu đầu vào thứ nhất lớn hơn hoặc bằng đầu vào thứ hai.", - "LOGIC_OPERATION_TOOLTIP_AND": "Hoàn trả \"đúng\" (true) nếu cả hai đầu vào đều đúng.", - "LOGIC_OPERATION_AND": "và", - "LOGIC_OPERATION_TOOLTIP_OR": "Hoàn trả \"đúng\" (true) nếu ít nhất một trong hai đầu vào đúng.", - "LOGIC_OPERATION_OR": "hoặc", - "LOGIC_NEGATE_TITLE": "không %1", - "LOGIC_NEGATE_TOOLTIP": "Hoàn trả \"đúng\" (true) nếu đầu vào sai. Hoàn trả \"sai\" (false) nếu đầu vào đúng.", - "LOGIC_BOOLEAN_TRUE": "đúng", - "LOGIC_BOOLEAN_FALSE": "sai", - "LOGIC_BOOLEAN_TOOLTIP": "Hoàn trả \"đúng\" hoặc \"sai\".", - "LOGIC_NULL": "trống không", - "LOGIC_NULL_TOOLTIP": "Hoàn trả trống không.", - "LOGIC_TERNARY_CONDITION": "kiểm tra", - "LOGIC_TERNARY_IF_TRUE": "nếu đúng", - "LOGIC_TERNARY_IF_FALSE": "nếu sai", - "LOGIC_TERNARY_TOOLTIP": "Kiểm tra điều kiện. Nếu điều kiện đúng, hoàn trả giá trị từ mệnh đề \"nếu đúng\" nếu không đúng, hoàn trả giá trị từ mệnh đề \"nếu sai\".", - "MATH_NUMBER_HELPURL": "https://vi.wikipedia.org/wiki/S%E1%BB%91", - "MATH_NUMBER_TOOLTIP": "Một con số.", - "MATH_ARITHMETIC_HELPURL": "https://vi.wikipedia.org/wiki/S%E1%BB%91_h%E1%BB%8Dc", - "MATH_ARITHMETIC_TOOLTIP_ADD": "Hoàn trả tổng của hai con số.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Hoàn trả hiệu của hai con số.", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Hoàn trả tích của hai con số.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Hoàn trả thương của hai con số.", - "MATH_ARITHMETIC_TOOLTIP_POWER": "Hoàn trả số lũy thừa với số thứ nhất là cơ số và số thứ hai là số mũ.", - "MATH_SINGLE_HELPURL": "https://vi.wikipedia.org/wiki/C%C4%83n_b%E1%BA%ADc_hai", - "MATH_SINGLE_OP_ROOT": "căn bật hai", - "MATH_SINGLE_TOOLTIP_ROOT": "Hoàn trả căn bật hai của số đầu vào.", - "MATH_SINGLE_OP_ABSOLUTE": "giá trị tuyệt đối", - "MATH_SINGLE_TOOLTIP_ABS": "Hoàn trả giá trị tuyệt đối của số đầu vào.", - "MATH_SINGLE_TOOLTIP_NEG": "Đổi dấu của số đầu vào: âm thành dương và dương thành âm, và hoàn trả số mới.", - "MATH_SINGLE_TOOLTIP_LN": "Hoàn trả lôgarit tự nhiên của số đầu vào.", - "MATH_SINGLE_TOOLTIP_LOG10": "Hoàn trả lôgarit cơ số 10 của số đầu vào.", - "MATH_SINGLE_TOOLTIP_EXP": "Hoàn trả lũy thừa của số e với số mũ đầu vào.", - "MATH_SINGLE_TOOLTIP_POW10": "Hoàn trả lũy thừa của số 10 với số mũ đầu vào.", - "MATH_TRIG_HELPURL": "https://vi.wikipedia.org/wiki/H%C3%A0m_l%C6%B0%E1%BB%A3ng_gi%C3%A1c", - "MATH_TRIG_TOOLTIP_SIN": "Hoàn trả Sin của một góc (theo độ).", - "MATH_TRIG_TOOLTIP_COS": "Hoàn trả Cos của một góc (theo độ).", - "MATH_TRIG_TOOLTIP_TAN": "Hoàn trả Tang của một góc (theo độ).", - "MATH_TRIG_TOOLTIP_ASIN": "Hoàn trả Arcsin của một góc (theo độ).", - "MATH_TRIG_TOOLTIP_ACOS": "Hoàn trả Arccos của một góc (theo độ).", - "MATH_TRIG_TOOLTIP_ATAN": "Hoàn trả Arctang của một góc (theo độ).", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Hoàn trả các đẳng số thường gặp: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (vô cực).", - "MATH_IS_EVEN": "chẵn", - "MATH_IS_ODD": "lẻ", - "MATH_IS_PRIME": "là số nguyên tố", - "MATH_IS_WHOLE": "là số nguyên", - "MATH_IS_POSITIVE": "là số dương", - "MATH_IS_NEGATIVE": "là số âm", - "MATH_IS_DIVISIBLE_BY": "chia hết cho", - "MATH_IS_TOOLTIP": "Kiểm tra con số xem nó có phải là số chẵn, lẻ, nguyên tố, nguyên, dương, âm, hay xem nó có chia hết cho số đầu vào hay không. Hoàn trả đúng hay sai.", - "MATH_CHANGE_HELPURL": "https://vi.wikipedia.org/wiki/Ph%C3%A9p_c%E1%BB%99ng", - "MATH_CHANGE_TITLE": "cộng vào %1 giá trị %2", - "MATH_CHANGE_TOOLTIP": "Cộng số đầu vào vào biến \"%1\".", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_ROUND_TOOLTIP": "Làm tròn lên hoặc tròn xuống số đầu vào.", - "MATH_ROUND_OPERATOR_ROUND": "làm tròn", - "MATH_ROUND_OPERATOR_ROUNDUP": "làm tròn lên", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "làm tròn xuống", - "MATH_ONLIST_HELPURL": "", - "MATH_ONLIST_OPERATOR_SUM": "tổng của một danh sách", - "MATH_ONLIST_TOOLTIP_SUM": "Hoàn trả tổng số của tất cả các số trong danh sách.", - "MATH_ONLIST_OPERATOR_MIN": "số nhỏ nhất của một danh sách", - "MATH_ONLIST_TOOLTIP_MIN": "Hoàn trả số nhỏ nhất trong tất cả các số trong danh sách.", - "MATH_ONLIST_OPERATOR_MAX": "số lớn nhât của một danh sách", - "MATH_ONLIST_TOOLTIP_MAX": "Hoàn trả số lớn nhất trong tất cả các số trong danh sách.", - "MATH_ONLIST_OPERATOR_AVERAGE": "giá trị trung bình của một danh sách", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Hoàn trả giá trị trung bình từ của danh sách số.", - "MATH_ONLIST_OPERATOR_MEDIAN": "số trung vị của một danh sách", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Hoàn trả số trung vị của danh sách số.", - "MATH_ONLIST_OPERATOR_MODE": "các mode của một danh sách", - "MATH_ONLIST_TOOLTIP_MODE": "Hoàn trả các số có mặt nhiều nhất trong danh sách.", - "MATH_ONLIST_OPERATOR_STD_DEV": "độ lệch chuẩn của một danh sách", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Hoàn trả độ lệch chuẩn của danh sách số.", - "MATH_ONLIST_OPERATOR_RANDOM": "một số bất kỳ của một danh sách", - "MATH_ONLIST_TOOLTIP_RANDOM": "Hoàn trả một số bất kỳ từ các số trong danh sách.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_MODULO_TITLE": "số dư của %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Chia số thứ nhất cho số thứ hai rồi hoàn trả số dư từ.", - "MATH_CONSTRAIN_TITLE": "giới hạn %1 không dưới %2 không hơn %3", - "MATH_CONSTRAIN_TOOLTIP": "Giới hạn số đầu vào để không dưới số thứ nhất và không hơn số thứ hai.", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_INT_TITLE": "Một số nguyên bất kỳ từ %1 đến %2", - "MATH_RANDOM_INT_TOOLTIP": "Hoàn trả một số nguyên bất kỳ lớn hơn hoặc bằng số đầu và nhỏ hơn hoặc bằng số sau.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "phân số bất kỳ", - "MATH_RANDOM_FLOAT_TOOLTIP": "Hoàn trả một phân số bất kỳ không nhỏ hơn 0.0 và không lớn hơn 1.0.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/string_(computer_science)", - "TEXT_TEXT_TOOLTIP": "Một ký tự, một từ, hay một dòng.", - "TEXT_JOIN_HELPURL": "", - "TEXT_JOIN_TITLE_CREATEWITH": "tạo văn bản từ", - "TEXT_JOIN_TOOLTIP": "Tạo một văn bản từ các thành phần.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "kết nối", - "TEXT_CREATE_JOIN_TOOLTIP": "Thêm, bỏ, hoặc sắp xếp lại các thành phần để tạo dựng mảnh văn bản này.", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "thêm vật mới vào văn bản.", - "TEXT_APPEND_TO": "ở cuối", - "TEXT_APPEND_APPENDTEXT": "thêm văn bản", - "TEXT_APPEND_TOOLTIP": "Thêm một mảng văn bản vào biến \"%1\".", - "TEXT_LENGTH_TITLE": "độ dài của %1", - "TEXT_LENGTH_TOOLTIP": "Hoàn trả số lượng ký tự (kể cả khoảng trắng) trong văn bản đầu vào.", - "TEXT_ISEMPTY_TITLE": "%1 trống không", - "TEXT_ISEMPTY_TOOLTIP": "Hoàn trả “đúng nếu văn bản không có ký tự nào.", - "TEXT_INDEXOF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số 0.", - "TEXT_INDEXOF_INPUT_INTEXT": "trong văn bản", - "TEXT_INDEXOF_OPERATOR_FIRST": "tìm sự có mặt đầu tiên của", - "TEXT_INDEXOF_OPERATOR_LAST": "tìm sự có mặt cuối cùng của", - "TEXT_CHARAT_INPUT_INTEXT": "trong văn bản", - "TEXT_CHARAT_FROM_START": "lấy ký tự thứ", - "TEXT_CHARAT_FROM_END": "lấy từ phía cuối, ký tự thứ", - "TEXT_CHARAT_FIRST": "lấy ký tự đầu tiên", - "TEXT_CHARAT_LAST": "lấy ký tự cuối cùng", - "TEXT_CHARAT_RANDOM": "lấy ký tự bất kỳ", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "Hoàn trả ký tự ở vị trí đặt ra.", - "TEXT_GET_SUBSTRING_TOOLTIP": "Hoàn trả một mảng ký tự ấn định từ trong văn bản.", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "trong văn bản", - "TEXT_GET_SUBSTRING_START_FROM_START": "lấy từ ký tự thứ", - "TEXT_GET_SUBSTRING_START_FROM_END": "lấy từ phía cuối, ký tự thứ", - "TEXT_GET_SUBSTRING_START_FIRST": "lấy từ ký tự đầu tiên", - "TEXT_GET_SUBSTRING_END_FROM_START": "đến ký tự thứ", - "TEXT_GET_SUBSTRING_END_FROM_END": "đến từ phía cuối, ký tự thứ", - "TEXT_GET_SUBSTRING_END_LAST": "đến ký tự cuối cùng", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_TOOLTIP": "Hoàn trả văn bản sau khi chuyển đổi chữ in hoa hay thường.", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "thành CHỮ IN HOA", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "thành chữ thường", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "thành Chữ In Đầu Mỗi Từ", - "TEXT_TRIM_TOOLTIP": "Hoàn trả bản sao của văn bản sau khi xóa khoảng trắng từ một hoặc hai bên.", - "TEXT_TRIM_OPERATOR_BOTH": "cắt các không gian từ cả hai mặt của", - "TEXT_TRIM_OPERATOR_LEFT": "cắt các không gian từ bên trái của", - "TEXT_TRIM_OPERATOR_RIGHT": "cắt các không gian từ bên phải của", - "TEXT_PRINT_TITLE": "in lên màng hình %1", - "TEXT_PRINT_TOOLTIP": "In ra màng hình một văn bản, con số, hay một giá trị đầu vào khác.", - "TEXT_PROMPT_TYPE_TEXT": "Xin người dùng nhập vào văn bản với dòng hướng dẫn", - "TEXT_PROMPT_TYPE_NUMBER": "Xin người dùng nhập vào con số với dòng hướng dẫn", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Xin người dùng nhập vào một con số.", - "TEXT_PROMPT_TOOLTIP_TEXT": "Xin người dùng nhập vào một văn bản.", - "LISTS_CREATE_EMPTY_TITLE": "tạo danh sách trống", - "LISTS_CREATE_EMPTY_TOOLTIP": "Hoàn trả một danh sách, với độ dài 0, không có thành tố nào cả", - "LISTS_CREATE_WITH_TOOLTIP": "Tạo một danh sách bao gồm nhiều vậts, với một số lượng bất kỳ.", - "LISTS_CREATE_WITH_INPUT_WITH": "tạo danh sách gồm", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "danh sách", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Thêm, bỏ, hoặc sắp xếp lại các thành phần để tạo dựng mảnh danh sách này.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Thêm vật vào danh sách.", - "LISTS_REPEAT_TOOLTIP": "Tạo danh sách gồm một số lượng vật nhất định với mỗi vật đều giống nhau.", - "LISTS_REPEAT_TITLE": "tạo danh sách gồm một vật %1 lặp lại %2 lần", - "LISTS_LENGTH_TITLE": "độ dài của %1", - "LISTS_LENGTH_TOOLTIP": "Hoàn trả độ dài của một danh sách.", - "LISTS_ISEMPTY_TITLE": "%1 trống rỗng", - "LISTS_ISEMPTY_TOOLTIP": "Hoàn trả “đúng\" nếu danh sách không có thành tử nào.", - "LISTS_INLIST": "trong dánh sách", - "LISTS_INDEX_OF_FIRST": "tìm sự có mặt đầu tiên của vật", - "LISTS_INDEX_OF_LAST": "tìm sự có mặt cuối cùng của vật", - "LISTS_INDEX_OF_TOOLTIP": "Hoàn trả vị trí xuất hiện đầu/cuối của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số 0.", - "LISTS_GET_INDEX_GET": "lấy thành tố", - "LISTS_GET_INDEX_GET_REMOVE": "lấy và xóa thành tố", - "LISTS_GET_INDEX_REMOVE": "xóa thành tố", - "LISTS_GET_INDEX_FROM_START": "thứ", - "LISTS_GET_INDEX_FROM_END": "(đếm từ cuối) thứ", - "LISTS_GET_INDEX_FIRST": "đầu tiên", - "LISTS_GET_INDEX_LAST": "cuối cùng", - "LISTS_GET_INDEX_RANDOM": "bất kỳ", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "Hoàn trả thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố đầu tiên.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "Hoàn trả thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố cuối cùng.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Hoàn trả thành tố đầu tiên trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Hoàn trả thành tố cuối cùng trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Hoàn trả một thành tố bất kỳ trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố đầu tiên.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố cuối cùng.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Hoàn trả và xóa thành tố đầu tiên trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Hoàn trả và xóa thành tố cuối cùng trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Hoàn trả và xóa mộtthành tố bất kỳ trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "Xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố đầu tiên.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "Xóa thành tố trong danh sách ở vị trí ấn định. Số 1 là thành tố cuối cùng.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Xóa thành tố đầu tiên trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Xóa thành tố cuối cùng trong danh sách.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Xóa thành tố bất kỳ trong danh sách.", - "LISTS_SET_INDEX_SET": "đặt thành tố", - "LISTS_SET_INDEX_INSERT": "gắn chèn vào vị trí", - "LISTS_SET_INDEX_INPUT_TO": "giá trị", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "Đặt giá trị của thành tố ở vị trí ấn định trong một danh sách. #1 là thành tố đầu tiên.", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "Đặt giá trị của thành tố trong một danh sách ở vị trí ấn định từ phía cuối. #1 là thành tố cuối cùng.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Đặt giá trị của thành tố đầu tiên trong danh sách.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Đặt giá trị của thành tố cuối cùng trong danh sách.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Đặt giá trị của thành tố ngẫu nhiên trong danh sách.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "Gắn chèn vật vào danh sách theo vị trí ấn định. #1 là thành tố đầu tiên.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "Gắn chèn vật vào danh sách theo vị trí ấn định từ phía cuối. #1 là thành tố cuối cùng.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Gắn chèn vật vào đầu danh sách.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Gắn thêm vật vào cuối danh sách.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Gắn chèn vật vào danh sách ở vị trí ngẫu nhiên.", - "LISTS_GET_SUBLIST_START_FROM_START": "lấy một danh sách con từ thứ", - "LISTS_GET_SUBLIST_START_FROM_END": "lấy một danh sách con từ (đếm từ cuối) thứ", - "LISTS_GET_SUBLIST_START_FIRST": "lấy một danh sách con từ đầu tiên", - "LISTS_GET_SUBLIST_END_FROM_START": "đến thứ", - "LISTS_GET_SUBLIST_END_FROM_END": "đến (đếm từ cuối) thứ", - "LISTS_GET_SUBLIST_END_LAST": "đến cuối cùng", - "LISTS_GET_SUBLIST_TOOLTIP": "Lấy một mảng của danh sách này để tạo danh sách con.", - "VARIABLES_GET_TOOLTIP": "Hoàn trả giá trị của.", - "VARIABLES_GET_CREATE_SET": "Tạo mảnh \"đặt vào %1\"", - "VARIABLES_SET": "cho %1 bằng %2", - "VARIABLES_SET_TOOLTIP": "Đặt giá trị của biến này thành...", - "VARIABLES_SET_CREATE_GET": "Tạo mảnh \"lấy %1\"", - "PROCEDURES_DEFNORETURN_TITLE": "", - "PROCEDURES_DEFNORETURN_PROCEDURE": "thủ tục", - "PROCEDURES_BEFORE_PARAMS": "với:", - "PROCEDURES_CALL_BEFORE_PARAMS": "với:", - "PROCEDURES_DEFNORETURN_DO": "", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Một thủ tục không có giá trị hoàn trả.", - "PROCEDURES_DEFRETURN_RETURN": "hoàn trả", - "PROCEDURES_DEFRETURN_TOOLTIP": "Một thủ tục có giá trị hoàn trả.", - "PROCEDURES_ALLOW_STATEMENTS": "cho phép báo cáo", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Chú ý: Thủ tục này có lặp lại tên các tham số.", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Chạy một thủ tục không có giá trị hoàn trả.", - "PROCEDURES_CALLRETURN_TOOLTIP": "Chạy một thủ tục có giá trị hoàn trả.", - "PROCEDURES_MUTATORCONTAINER_TITLE": "các tham số", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Thêm, xóa hoặc sắp xếp lại các đầu vào cho hàm này.", - "PROCEDURES_MUTATORARG_TITLE": "biến:", - "PROCEDURES_MUTATORARG_TOOLTIP": "Thêm một đầu vào cho hàm.", - "PROCEDURES_HIGHLIGHT_DEF": "Làm nổi bật thủ tục", - "PROCEDURES_CREATE_DO": "Tạo mảnh \"thực hiện %1\"", - "PROCEDURES_IFRETURN_TOOLTIP": "Khi điều kiện đúng thì hoàn trả một giá trị.", - "PROCEDURES_IFRETURN_WARNING": "Chú ý: Mảnh này chỉ có thể dùng trong một thủ tục." -} diff --git a/msg/json/zh-hans.json b/msg/json/zh-hans.json deleted file mode 100644 index 2242b66d14..0000000000 --- a/msg/json/zh-hans.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Espertus", - "Liuxinyu970226", - "Luotiancheng", - "Qiyue2001", - "Xiaomingyan", - "Yfdyh000", - "아라" - ] - }, - "VARIABLES_DEFAULT_NAME": "项目", - "TODAY": "今天", - "DUPLICATE_BLOCK": "复制", - "ADD_COMMENT": "添加注释", - "REMOVE_COMMENT": "删除注释", - "EXTERNAL_INPUTS": "外部输入", - "INLINE_INPUTS": "单行输入", - "DELETE_BLOCK": "删除块", - "DELETE_X_BLOCKS": "删除 %1 块", - "DELETE_ALL_BLOCKS": "删除所有%1块吗?", - "CLEAN_UP": "清理块", - "COLLAPSE_BLOCK": "折叠块", - "COLLAPSE_ALL": "折叠块", - "EXPAND_BLOCK": "展开块", - "EXPAND_ALL": "展开块", - "DISABLE_BLOCK": "禁用块", - "ENABLE_BLOCK": "启用块", - "HELP": "帮助", - "CHAT": "通过在此框输入与您的合作者沟通!", - "AUTH": "请授权这个应用程序以保存您的作品并共享。", - "ME": "我", - "CHANGE_VALUE_TITLE": "更改值:", - "NEW_VARIABLE": "新变量...", - "NEW_VARIABLE_TITLE": "新变量的名称:", - "RENAME_VARIABLE": "重命名变量...", - "RENAME_VARIABLE_TITLE": "将所有“%1”变量重命名为:", - "COLOUR_PICKER_HELPURL": "https://zh.wikipedia.org/wiki/颜色", - "COLOUR_PICKER_TOOLTIP": "从调色板中选择一种颜色。", - "COLOUR_RANDOM_TITLE": "随机颜色", - "COLOUR_RANDOM_TOOLTIP": "随机选择一种颜色。", - "COLOUR_RGB_TITLE": "颜色", - "COLOUR_RGB_RED": "红色", - "COLOUR_RGB_GREEN": "绿色", - "COLOUR_RGB_BLUE": "蓝色", - "COLOUR_RGB_TOOLTIP": "通过指定红色、绿色和蓝色的量创建一种颜色。所有的值必须介于0和100之间。", - "COLOUR_BLEND_TITLE": "混合", - "COLOUR_BLEND_COLOUR1": "颜色1", - "COLOUR_BLEND_COLOUR2": "颜色2", - "COLOUR_BLEND_RATIO": "比例", - "COLOUR_BLEND_TOOLTIP": "用一个给定的比率(0.0-1.0)混合两种颜色。", - "CONTROLS_REPEAT_HELPURL": "https://zh.wikipedia.org/wiki/For循环", - "CONTROLS_REPEAT_TITLE": "重复 %1 次", - "CONTROLS_REPEAT_INPUT_DO": "执行", - "CONTROLS_REPEAT_TOOLTIP": "多次执行一些语句。", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "重复当", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "重复直到", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "只要值为真,执行一些语句。", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "只要值为假,执行一些语句。", - "CONTROLS_FOR_TOOLTIP": "从起始数到结尾数中取出变量“%1”的值,按指定的时间间隔,执行指定的块。", - "CONTROLS_FOR_TITLE": "使用 %1 从范围 %2 到 %3 每隔 %4", - "CONTROLS_FOREACH_TITLE": "为每个项目 %1 在列表中 %2", - "CONTROLS_FOREACH_TOOLTIP": "遍历每个列表中的项目,将变量“%1”设定到该项中,然后执行某些语句。", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "中断循环", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "继续下一次循环", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "中断包含它的循环。", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "跳过这个循环的剩余部分,并继续下一次迭代。", - "CONTROLS_FLOW_STATEMENTS_WARNING": "警告:此块仅可用于在一个循环内。", - "CONTROLS_IF_TOOLTIP_1": "如果值为真,执行一些语句。", - "CONTROLS_IF_TOOLTIP_2": "如果值为真,则执行语句的第一块;否则,则执行语句的第二块。", - "CONTROLS_IF_TOOLTIP_3": "如果第一个值为真,则执行语句的第一个块;否则,如果第二个值为真,则执行语句的第二块。", - "CONTROLS_IF_TOOLTIP_4": "如果第一个值为真,则执行语句的第一块;否则,如果第二个值为真,则执行语句的第二块;如果没有值为真,则执行语句的最后一块。", - "CONTROLS_IF_MSG_IF": "如果", - "CONTROLS_IF_MSG_ELSEIF": "否则如果", - "CONTROLS_IF_MSG_ELSE": "否则", - "CONTROLS_IF_IF_TOOLTIP": "增加、删除或重新排列各节来重新配置“if”块。", - "CONTROLS_IF_ELSEIF_TOOLTIP": "在if语句块中增加一个条件。", - "CONTROLS_IF_ELSE_TOOLTIP": "添加一个最终的,包括所有情况的节到if块中。", - "LOGIC_COMPARE_HELPURL": "https://zh.wikipedia.org/wiki/不等", - "LOGIC_COMPARE_TOOLTIP_EQ": "如果两个输入结果相等,则返回真。", - "LOGIC_COMPARE_TOOLTIP_NEQ": "如果两个输入结果不相等,则返回真。", - "LOGIC_COMPARE_TOOLTIP_LT": "如果第一个输入结果比第二个小,则返回真。", - "LOGIC_COMPARE_TOOLTIP_LTE": "如果第一个输入结果小于或等于第二个输入结果,则返回真。", - "LOGIC_COMPARE_TOOLTIP_GT": "如果第一个输入结果比第二个大,则返回真。", - "LOGIC_COMPARE_TOOLTIP_GTE": "如果第一个输入结果大于或等于第二个输入结果,则返回真。", - "LOGIC_OPERATION_TOOLTIP_AND": "如果两个输入结果都为真,则返回真。", - "LOGIC_OPERATION_AND": "和", - "LOGIC_OPERATION_TOOLTIP_OR": "如果至少有一个输入结果为真,则返回真。", - "LOGIC_OPERATION_OR": "或", - "LOGIC_NEGATE_HELPURL": "https://zh.wikipedia.org/wiki/逻辑非", - "LOGIC_NEGATE_TITLE": "并非%1", - "LOGIC_NEGATE_TOOLTIP": "如果输入结果为假,则返回真;如果输入结果为真,则返回假。", - "LOGIC_BOOLEAN_TRUE": "真", - "LOGIC_BOOLEAN_FALSE": "错", - "LOGIC_BOOLEAN_TOOLTIP": "同时返回真或假。", - "LOGIC_NULL": "空", - "LOGIC_NULL_TOOLTIP": "返回空值。", - "LOGIC_TERNARY_HELPURL": "https://zh.wikipedia.org/wiki/条件运算符", - "LOGIC_TERNARY_CONDITION": "测试", - "LOGIC_TERNARY_IF_TRUE": "如果为真", - "LOGIC_TERNARY_IF_FALSE": "如果为假", - "LOGIC_TERNARY_TOOLTIP": "检查“test”中的条件。如果条件为真,则返回“if true”的值,否则,则返回“if false”的值。", - "MATH_NUMBER_HELPURL": "https://zh.wikipedia.org/wiki/数", - "MATH_NUMBER_TOOLTIP": "一个数字。", - "MATH_ARITHMETIC_HELPURL": "https://zh.wikipedia.org/wiki/算术", - "MATH_ARITHMETIC_TOOLTIP_ADD": "返回两个数字的和。", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "返回两个数字的区别。", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "返回两个数字的乘积。", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "返回两个数字的商。", - "MATH_ARITHMETIC_TOOLTIP_POWER": "返回第一个数的第二个数次幂。", - "MATH_SINGLE_HELPURL": "https://zh.wikipedia.org/wiki/平方根", - "MATH_SINGLE_OP_ROOT": "平方根", - "MATH_SINGLE_TOOLTIP_ROOT": "返回数的平方根。", - "MATH_SINGLE_OP_ABSOLUTE": "绝对", - "MATH_SINGLE_TOOLTIP_ABS": "返回一个数的绝对值。", - "MATH_SINGLE_TOOLTIP_NEG": "返回数的逻辑非。", - "MATH_SINGLE_TOOLTIP_LN": "返回一个数的自然对数。", - "MATH_SINGLE_TOOLTIP_LOG10": "返回数字的对数。", - "MATH_SINGLE_TOOLTIP_EXP": "返回数的e次幂。", - "MATH_SINGLE_TOOLTIP_POW10": "返回数的10次幂。", - "MATH_TRIG_HELPURL": "https://zh.wikipedia.org/wiki/三角函数", - "MATH_TRIG_TOOLTIP_SIN": "返回指定角度的正弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_COS": "返回指定角度的余弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_TAN": "返回指定角度的正切值(非弧度)。", - "MATH_TRIG_TOOLTIP_ASIN": "返回一个数的反正弦值。", - "MATH_TRIG_TOOLTIP_ACOS": "返回一个数的反余弦值。", - "MATH_TRIG_TOOLTIP_ATAN": "返回指定角度的反正切值。", - "MATH_CONSTANT_HELPURL": "https://zh.wikipedia.org/wiki/数学常数", - "MATH_CONSTANT_TOOLTIP": "返回一个常见常量:π (3.141......),e (2.718...)、φ (1.618...)、 sqrt(2) (1.414......)、sqrt(½) (0.707......)或 ∞(无穷大)。", - "MATH_IS_EVEN": "是偶数", - "MATH_IS_ODD": "是奇数", - "MATH_IS_PRIME": "是质数", - "MATH_IS_WHOLE": "为整数", - "MATH_IS_POSITIVE": "是正值", - "MATH_IS_NEGATIVE": "为负", - "MATH_IS_DIVISIBLE_BY": "可被整除", - "MATH_IS_TOOLTIP": "如果数字是偶数、奇数、非负整数、正数、负数或如果它可被某数字整除,则返回真或假。", - "MATH_CHANGE_HELPURL": "https://zh.wikipedia.org/wiki/%E5%8A%A0%E6%B3%95", - "MATH_CHANGE_TITLE": "更改 %1 由 %2", - "MATH_CHANGE_TOOLTIP": "将一个数添加到变量“%1”。", - "MATH_ROUND_HELPURL": "https://zh.wikipedia.org/wiki/数值修约", - "MATH_ROUND_TOOLTIP": "数字向上或向下舍入。", - "MATH_ROUND_OPERATOR_ROUND": "向下舍入", - "MATH_ROUND_OPERATOR_ROUNDUP": "向上舍入", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "向下舍入", - "MATH_ONLIST_OPERATOR_SUM": "列表中的数的总和", - "MATH_ONLIST_TOOLTIP_SUM": "返回列表中的所有数字的和。", - "MATH_ONLIST_OPERATOR_MIN": "列表中的最小值", - "MATH_ONLIST_TOOLTIP_MIN": "返回列表中最小数。", - "MATH_ONLIST_OPERATOR_MAX": "列表中的最大值", - "MATH_ONLIST_TOOLTIP_MAX": "返回列表中最大数。", - "MATH_ONLIST_OPERATOR_AVERAGE": "列表中的平均数", - "MATH_ONLIST_TOOLTIP_AVERAGE": "返回列表中的数值的平均值。", - "MATH_ONLIST_OPERATOR_MEDIAN": "列表中位数", - "MATH_ONLIST_TOOLTIP_MEDIAN": "返回列表中的中位数。", - "MATH_ONLIST_OPERATOR_MODE": "列表模式", - "MATH_ONLIST_TOOLTIP_MODE": "返回列表中的最常见的项的列表。", - "MATH_ONLIST_OPERATOR_STD_DEV": "列表中的标准差", - "MATH_ONLIST_TOOLTIP_STD_DEV": "返回列表的标准偏差。", - "MATH_ONLIST_OPERATOR_RANDOM": "列表的随机项", - "MATH_ONLIST_TOOLTIP_RANDOM": "从列表中返回一个随机的元素。", - "MATH_MODULO_HELPURL": "https://zh.wikipedia.org/wiki/模除", - "MATH_MODULO_TITLE": "取余数自 %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "返回这两个数字相除后的余数。", - "MATH_CONSTRAIN_TITLE": "限制数字 %1 介于 (低) %2 到 (高) %3", - "MATH_CONSTRAIN_TOOLTIP": "限制数字介于两个指定的数字之间", - "MATH_RANDOM_INT_HELPURL": "https://zh.wikipedia.org/wiki/随机数生成器", - "MATH_RANDOM_INT_TITLE": "从 %1 到 %2 之间的随机整数", - "MATH_RANDOM_INT_TOOLTIP": "返回两个指定的范围(含)之间的随机整数。", - "MATH_RANDOM_FLOAT_HELPURL": "https://zh.wikipedia.org/wiki/随机数生成器", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "随机分数", - "MATH_RANDOM_FLOAT_TOOLTIP": "返回介于(包含)0.0到1.0之间的随机数。", - "TEXT_TEXT_HELPURL": "https://zh.wikipedia.org/wiki/字符串", - "TEXT_TEXT_TOOLTIP": "一个字母、单词或一行文本。", - "TEXT_JOIN_TITLE_CREATEWITH": "建立字串使用", - "TEXT_JOIN_TOOLTIP": "通过串起任意数量的项以建立一段文字。", - "TEXT_CREATE_JOIN_TITLE_JOIN": "加入", - "TEXT_CREATE_JOIN_TOOLTIP": "添加、移除或重新排列各节来重新配置这个文本块。", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "将一个项添加到文本中。", - "TEXT_APPEND_TO": "在", - "TEXT_APPEND_APPENDTEXT": "追加文本", - "TEXT_APPEND_TOOLTIP": "将一些文本追加到变量“%1”。", - "TEXT_LENGTH_TITLE": "%1的长度", - "TEXT_LENGTH_TOOLTIP": "返回提供文本的字母数(包括空格)。", - "TEXT_ISEMPTY_TITLE": "%1是空的", - "TEXT_ISEMPTY_TOOLTIP": "如果提供的文本为空,则返回真。", - "TEXT_INDEXOF_TOOLTIP": "返回在第二个字串中的第一/最后一个匹配项的索引值。如果未找到则返回 0。", - "TEXT_INDEXOF_INPUT_INTEXT": "自文本", - "TEXT_INDEXOF_OPERATOR_FIRST": "寻找第一个出现的文本", - "TEXT_INDEXOF_OPERATOR_LAST": "寻找最后一个出现的文本", - "TEXT_INDEXOF_TAIL": "空白", - "TEXT_CHARAT_INPUT_INTEXT": "于文本中", - "TEXT_CHARAT_FROM_START": "获得字符#", - "TEXT_CHARAT_FROM_END": "获得倒数第#个字符", - "TEXT_CHARAT_FIRST": "获得第一个字符", - "TEXT_CHARAT_LAST": "获得最后一个字符", - "TEXT_CHARAT_RANDOM": "获取随机的字母", - "TEXT_CHARAT_TAIL": "空白", - "TEXT_CHARAT_TOOLTIP": "返回位于指定位置的字母。", - "TEXT_GET_SUBSTRING_TOOLTIP": "返回指定的部分文本。", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "自文本", - "TEXT_GET_SUBSTRING_START_FROM_START": "取得一段字串自#", - "TEXT_GET_SUBSTRING_START_FROM_END": "取得一段字串自#到末尾", - "TEXT_GET_SUBSTRING_START_FIRST": "取得一段字串自第一个字符", - "TEXT_GET_SUBSTRING_END_FROM_START": "到字符#", - "TEXT_GET_SUBSTRING_END_FROM_END": "到倒数第#个字符", - "TEXT_GET_SUBSTRING_END_LAST": "到最后一个字符", - "TEXT_GET_SUBSTRING_TAIL": "空白", - "TEXT_CHANGECASE_TOOLTIP": "使用不同的大小写复制这段文字。", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "为大写", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "为小写", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "为首字母大写", - "TEXT_TRIM_TOOLTIP": "复制这段文字的同时删除两端多余的空格。", - "TEXT_TRIM_OPERATOR_BOTH": "消除两侧空格", - "TEXT_TRIM_OPERATOR_LEFT": "消除左侧空格", - "TEXT_TRIM_OPERATOR_RIGHT": "消除右侧空格", - "TEXT_PRINT_TITLE": "打印%1", - "TEXT_PRINT_TOOLTIP": "打印指定的文字、数字或其他值。", - "TEXT_PROMPT_TYPE_TEXT": "输入数字并显示提示消息", - "TEXT_PROMPT_TYPE_NUMBER": "输入数字并显示提示消息", - "TEXT_PROMPT_TOOLTIP_NUMBER": "提示用户输入数字。", - "TEXT_PROMPT_TOOLTIP_TEXT": "提示用户输入一些文本。", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "创建空列表", - "LISTS_CREATE_EMPTY_TOOLTIP": "返回一个列表,长度为 0,不包含任何数据记录", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "建立一个具有任意数量项目的列表。", - "LISTS_CREATE_WITH_INPUT_WITH": "建立字串使用", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "列表", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "增加、删除或重新排列各部分以此重新配置这个列表块。", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "将一个项添加到列表中。", - "LISTS_REPEAT_TOOLTIP": "建立包含指定重复次数的值的列表。", - "LISTS_REPEAT_TITLE": "建立列表使用项 %1 重复 %2 次", - "LISTS_LENGTH_TITLE": "%1的长度", - "LISTS_LENGTH_TOOLTIP": "返回列表的长度。", - "LISTS_ISEMPTY_TITLE": "%1是空的", - "LISTS_ISEMPTY_TOOLTIP": "如果改列表为空,则返回真。", - "LISTS_INLIST": "在列表中", - "LISTS_INDEX_OF_FIRST": "找出第一个项出现", - "LISTS_INDEX_OF_LAST": "找出最后一个项出现", - "LISTS_INDEX_OF_TOOLTIP": "返回在列表中的第一/最后一个匹配项的索引值。如果找不到项目则返回0。", - "LISTS_GET_INDEX_GET": "获得", - "LISTS_GET_INDEX_GET_REMOVE": "取出并移除", - "LISTS_GET_INDEX_REMOVE": "移除", - "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "倒数第#", - "LISTS_GET_INDEX_FIRST": "第一", - "LISTS_GET_INDEX_LAST": "最后", - "LISTS_GET_INDEX_RANDOM": "随机", - "LISTS_GET_INDEX_TAIL": "空白", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "返回在列表中的指定位置的项。#1是第一个项目。", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "返回在列表中的指定位置的项。#1是最后一项。", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "返回列表中的第一个项目。", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "返回列表中的最后一项。", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "随机返回列表中的一个项目。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "移除并返回列表中的指定位置的项。#1 是第一项。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "移除并返回列表中的指定位置的项。#1 是最后一项。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "移除并返回列表中的第一个项目。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "移除并返回列表中的最后一个项目。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "移除并返回列表中的一个随机项目中。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "移除在列表中的指定位置的项。#1 是第一项。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "删除在列表中的指定位置的项。#1是最后一项。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "移除列表中的第一项", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "移除列表中的最后一项", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "删除列表中的一个随机的项。", - "LISTS_SET_INDEX_SET": "设置", - "LISTS_SET_INDEX_INSERT": "插入在", - "LISTS_SET_INDEX_INPUT_TO": "为", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "设置在列表中指定位置的项。#1是第一项。", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "设置在列表中指定位置的项。#1是最后一项。", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "设置列表中的第一个项目。", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "设置列表中的最后一项。", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "设置列表中一个随机的项目。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "插入在列表中指定位置的项。#1是第一项。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "插入在列表中的指定位置的项。#1是最后一项。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "在列表的起始处添加该项。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "将该项追加到列表的末尾。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "在列表中随机插入项。", - "LISTS_GET_SUBLIST_START_FROM_START": "从#取得子列表", - "LISTS_GET_SUBLIST_START_FROM_END": "从倒数#取得子列表", - "LISTS_GET_SUBLIST_START_FIRST": "从头获得子列表", - "LISTS_GET_SUBLIST_END_FROM_START": "到#", - "LISTS_GET_SUBLIST_END_FROM_END": "到倒数第#", - "LISTS_GET_SUBLIST_END_LAST": "到最后", - "LISTS_GET_SUBLIST_TAIL": "空白", - "LISTS_GET_SUBLIST_TOOLTIP": "复制列表中指定的部分。", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "从文本制作列表", - "LISTS_SPLIT_TEXT_FROM_LIST": "从列表拆出文本", - "LISTS_SPLIT_WITH_DELIMITER": "用分隔符", - "LISTS_SPLIT_TOOLTIP_SPLIT": "拆分文本到文本列表,按每个分隔符拆分。", - "LISTS_SPLIT_TOOLTIP_JOIN": "加入文本列表至一个文本,由分隔符分隔。", - "ORDINAL_NUMBER_SUFFIX": "空白", - "VARIABLES_GET_TOOLTIP": "返回此变量的值。", - "VARIABLES_GET_CREATE_SET": "创建“设定%1”", - "VARIABLES_SET": "赋值 %1 到 %2", - "VARIABLES_SET_TOOLTIP": "设置此变量,以使它和输入值相等。", - "VARIABLES_SET_CREATE_GET": "创建“获得%1”", - "PROCEDURES_DEFNORETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程序", - "PROCEDURES_DEFNORETURN_TITLE": "至", - "PROCEDURES_DEFNORETURN_PROCEDURE": "做点什么", - "PROCEDURES_BEFORE_PARAMS": "与:", - "PROCEDURES_CALL_BEFORE_PARAMS": "与:", - "PROCEDURES_DEFNORETURN_DO": "空白", - "PROCEDURES_DEFNORETURN_TOOLTIP": "创建一个不带输出值的函数。", - "PROCEDURES_DEFRETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程序", - "PROCEDURES_DEFRETURN_RETURN": "返回", - "PROCEDURES_DEFRETURN_TOOLTIP": "创建一个有输出值的函数。", - "PROCEDURES_ALLOW_STATEMENTS": "允许声明", - "PROCEDURES_DEF_DUPLICATE_WARNING": "警告: 此函数具有重复参数。", - "PROCEDURES_CALLNORETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程序", - "PROCEDURES_CALLNORETURN_TOOLTIP": "运行用户定义的函数“%1”。", - "PROCEDURES_CALLRETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程序", - "PROCEDURES_CALLRETURN_TOOLTIP": "运行用户定义的函数“%1”,并使用它的输出值。", - "PROCEDURES_MUTATORCONTAINER_TITLE": "输入", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "添加、删除或重新排此函数的输入。", - "PROCEDURES_MUTATORARG_TITLE": "输入名称:", - "PROCEDURES_MUTATORARG_TOOLTIP": "添加函数输入。", - "PROCEDURES_HIGHLIGHT_DEF": "突出显示函数定义", - "PROCEDURES_CREATE_DO": "创建“%1”", - "PROCEDURES_IFRETURN_TOOLTIP": "如果值为真,则返回第二个值。", - "PROCEDURES_IFRETURN_WARNING": "警告: 仅在定义函数内可使用此块。" -} diff --git a/msg/json/zh-hant.json b/msg/json/zh-hant.json deleted file mode 100644 index b51b0eb3f5..0000000000 --- a/msg/json/zh-hant.json +++ /dev/null @@ -1,298 +0,0 @@ -{ - "@metadata": { - "authors": [ - "Gasolin", - "Wehwei", - "Liuxinyu970226", - "LNDDYL" - ] - }, - "VARIABLES_DEFAULT_NAME": "變量", - "TODAY": "今天", - "DUPLICATE_BLOCK": "複製", - "ADD_COMMENT": "加入註解", - "REMOVE_COMMENT": "移除註解", - "EXTERNAL_INPUTS": "多行輸入", - "INLINE_INPUTS": "單行輸入", - "DELETE_BLOCK": "刪除積木", - "DELETE_X_BLOCKS": "刪除 %1 塊積木", - "DELETE_ALL_BLOCKS": "刪除共%1個積木?", - "COLLAPSE_BLOCK": "收合積木", - "COLLAPSE_ALL": "收合積木", - "EXPAND_BLOCK": "展開積木", - "EXPAND_ALL": "展開積木", - "DISABLE_BLOCK": "停用積木", - "ENABLE_BLOCK": "啟用積木", - "HELP": "說明", - "CHAT": "與您的合作者洽談藉由在此框輸入!", - "ME": "我", - "CHANGE_VALUE_TITLE": "修改值:", - "NEW_VARIABLE": "新變量...", - "NEW_VARIABLE_TITLE": "新變量名稱:", - "RENAME_VARIABLE": "重新命名變量...", - "RENAME_VARIABLE_TITLE": "將所有 \"%1\" 變量重新命名為:", - "COLOUR_PICKER_HELPURL": "https://zh.wikipedia.org/wiki/顏色", - "COLOUR_PICKER_TOOLTIP": "從調色板中選擇一種顏色。", - "COLOUR_RANDOM_TITLE": "隨機顏色", - "COLOUR_RANDOM_TOOLTIP": "隨機選擇一種顏色。", - "COLOUR_RGB_TITLE": "顏色", - "COLOUR_RGB_RED": "紅", - "COLOUR_RGB_GREEN": "綠", - "COLOUR_RGB_BLUE": "藍", - "COLOUR_RGB_TOOLTIP": "透過指定紅、綠、 藍色的值來建立一種顏色。所有的值必須介於 0 和 100 之間。", - "COLOUR_BLEND_TITLE": "混合", - "COLOUR_BLEND_COLOUR1": "顏色 1", - "COLOUR_BLEND_COLOUR2": "顏色 2", - "COLOUR_BLEND_RATIO": "比例", - "COLOUR_BLEND_TOOLTIP": "透過一個比率 (0.0-1.0)來混合兩種顏色。", - "CONTROLS_REPEAT_HELPURL": "https://zh.wikipedia.org/wiki/For迴圈", - "CONTROLS_REPEAT_TITLE": "重複 %1 次", - "CONTROLS_REPEAT_INPUT_DO": "執行", - "CONTROLS_REPEAT_TOOLTIP": "多次執行一些語句", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "重複 當", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "重複 直到", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "當值為真時,執行一些語句", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "當值為否時,執行一些語句", - "CONTROLS_FOR_TOOLTIP": "從起始數到結尾數中取出變數 \"%1\" 的值,按指定的時間間隔,執行指定的積木。", - "CONTROLS_FOR_TITLE": "使用 %1 從範圍 %2 到 %3 每隔 %4", - "CONTROLS_FOREACH_TITLE": "取出每個 %1 自列表 %2", - "CONTROLS_FOREACH_TOOLTIP": "遍歷每個列表中的項目,將變量 '%1' 設定到該項目中,然後執行某些語句", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "停止 迴圈", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "繼續下一個 迴圈", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "離開當前的 迴圈", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "跳過這個迴圈的其餘步驟,並繼續下一次的迴圈運算。", - "CONTROLS_FLOW_STATEMENTS_WARNING": "警告: 此積木僅可用於迴圈內。", - "CONTROLS_IF_TOOLTIP_1": "當值為真時,執行一些語句", - "CONTROLS_IF_TOOLTIP_2": "當值為真時,執行第一個語句,否則則執行第二個語句", - "CONTROLS_IF_TOOLTIP_3": "如果第一個值為真,則執行第一個語句。否則當第二個值為真時,則執行第二個語句", - "CONTROLS_IF_TOOLTIP_4": "如果第一個值為真,則執行第一個語句。否則當第二個值為真時,則執行第二個語句。如果前幾個敘述都不為真,則執行最後一個語句", - "CONTROLS_IF_MSG_IF": "如果", - "CONTROLS_IF_MSG_ELSEIF": "否則如果", - "CONTROLS_IF_MSG_ELSE": "否則", - "CONTROLS_IF_IF_TOOLTIP": "添加、 刪除或重新排列各區塊來此重新配置這個'如果'積木。", - "CONTROLS_IF_ELSEIF_TOOLTIP": "將條件添加到'如果'積木。", - "CONTROLS_IF_ELSE_TOOLTIP": "加入一個最終,所有條件下都都執行的區塊到'如果'積木中", - "LOGIC_COMPARE_HELPURL": "https://zh.wikipedia.org/wiki/不等", - "LOGIC_COMPARE_TOOLTIP_EQ": "如果這兩個輸入區塊內容相等,返回 真。", - "LOGIC_COMPARE_TOOLTIP_NEQ": "如果這兩個輸入區塊內容不相等,返回 真。", - "LOGIC_COMPARE_TOOLTIP_LT": "如果第一個輸入小於第二個輸入,返回 真。", - "LOGIC_COMPARE_TOOLTIP_LTE": "如果第一個輸入是小於或等於第二個輸入,返回 真。", - "LOGIC_COMPARE_TOOLTIP_GT": "如果第一個輸入大於第二個輸入,返回 真。", - "LOGIC_COMPARE_TOOLTIP_GTE": "如果第一個輸入大於或等於第二個輸入,返回 真。", - "LOGIC_OPERATION_TOOLTIP_AND": "如果這兩個輸入值都為 真,則返回 真。", - "LOGIC_OPERATION_AND": "且", - "LOGIC_OPERATION_TOOLTIP_OR": "如果至少一個輸入的值為 真,返回 真。", - "LOGIC_OPERATION_OR": "或", - "LOGIC_NEGATE_TITLE": "非 %1", - "LOGIC_NEGATE_TOOLTIP": "如果輸入的值是 否,則返回 真。如果輸入的值是 真 返回 否。", - "LOGIC_BOOLEAN_TRUE": "真", - "LOGIC_BOOLEAN_FALSE": "否", - "LOGIC_BOOLEAN_TOOLTIP": "返回 真 或 否。", - "LOGIC_NULL": "空", - "LOGIC_NULL_TOOLTIP": "返回 空。", - "LOGIC_TERNARY_HELPURL": "https://zh.wikipedia.org/wiki/條件運算符", - "LOGIC_TERNARY_CONDITION": "測試", - "LOGIC_TERNARY_IF_TRUE": "如果為真", - "LOGIC_TERNARY_IF_FALSE": "如果為非", - "LOGIC_TERNARY_TOOLTIP": "檢查 'test' 中的條件。如果條件為 真,將返回 '如果為 真' 值 ;否則,返回 '如果為 否' 的值。", - "MATH_NUMBER_HELPURL": "https://zh.wikipedia.org/wiki/數", - "MATH_NUMBER_TOOLTIP": "一個數字。", - "MATH_ARITHMETIC_HELPURL": "https://zh.wikipedia.org/wiki/算術", - "MATH_ARITHMETIC_TOOLTIP_ADD": "返回兩個數字的總和。", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "返回兩個數字的差。", - "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "返回兩個數字的乘積。", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "返回兩個數字的商。", - "MATH_ARITHMETIC_TOOLTIP_POWER": "返回第二個數字的指數的第一個數字。", - "MATH_SINGLE_HELPURL": "https://zh.wikipedia.org/wiki/平方根", - "MATH_SINGLE_OP_ROOT": "開根號", - "MATH_SINGLE_TOOLTIP_ROOT": "返回指定數字的平方根。", - "MATH_SINGLE_OP_ABSOLUTE": "絕對值", - "MATH_SINGLE_TOOLTIP_ABS": "返回指定數字的絕對值。", - "MATH_SINGLE_TOOLTIP_NEG": "返回指定數字的 negation。", - "MATH_SINGLE_TOOLTIP_LN": "返回指定數字的自然對數。", - "MATH_SINGLE_TOOLTIP_LOG10": "返回指定數字的對數。", - "MATH_SINGLE_TOOLTIP_EXP": "返回指定數字指數的 e", - "MATH_SINGLE_TOOLTIP_POW10": "返回指定數字指數的10的冪次。", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_TRIG_TOOLTIP_SIN": "返回指定角度的正弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_COS": "返回指定角度的餘弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_TAN": "返回指定角度的正切值(非弧度)。", - "MATH_TRIG_TOOLTIP_ASIN": "返回指定角度的反正弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_ACOS": "返回指定角度的反餘弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_ATAN": "返回指定角度的反正切值。", - "MATH_CONSTANT_HELPURL": "https://zh.wikipedia.org/wiki/數學常數", - "MATH_CONSTANT_TOOLTIP": "返回一個的常見常量: π (3.141......),e (2.718...)、 φ (1.618...)、 開方(2) (1.414......)、 開方(½) (0.707......) 或 ∞ (無窮大)。", - "MATH_IS_EVEN": "是偶數", - "MATH_IS_ODD": "是奇數", - "MATH_IS_PRIME": "是質數", - "MATH_IS_WHOLE": "是非負整數", - "MATH_IS_POSITIVE": "是正值", - "MATH_IS_NEGATIVE": "是負值", - "MATH_IS_DIVISIBLE_BY": "可被整除", - "MATH_IS_TOOLTIP": "如果數字是偶數,奇數,非負整數,正數、 負數或如果它是可被某數字整除,則返回 真 或 否。", - "MATH_CHANGE_HELPURL": "https://zh.wikipedia.org/wiki/加法", - "MATH_CHANGE_TITLE": "修改 %1 自 %2", - "MATH_CHANGE_TOOLTIP": "將數字添加到變量 '%1'。", - "MATH_ROUND_HELPURL": "https://zh.wikipedia.org/wiki/數值簡化", - "MATH_ROUND_TOOLTIP": "將數字向上或向下舍入。", - "MATH_ROUND_OPERATOR_ROUND": "四捨五入", - "MATH_ROUND_OPERATOR_ROUNDUP": "無條件進位", - "MATH_ROUND_OPERATOR_ROUNDDOWN": "無條件捨去", - "MATH_ONLIST_OPERATOR_SUM": "總和 自列表", - "MATH_ONLIST_TOOLTIP_SUM": "返回列表中的所有數字的總和。", - "MATH_ONLIST_OPERATOR_MIN": "最小值 自列表", - "MATH_ONLIST_TOOLTIP_MIN": "返回列表中的最小數字。", - "MATH_ONLIST_OPERATOR_MAX": "最大值 自列表", - "MATH_ONLIST_TOOLTIP_MAX": "返回列表中的最大數字。", - "MATH_ONLIST_OPERATOR_AVERAGE": "平均值 自列表", - "MATH_ONLIST_TOOLTIP_AVERAGE": "返回列表中數值的平均值 (算術平均值)。", - "MATH_ONLIST_OPERATOR_MEDIAN": "中位數 自列表", - "MATH_ONLIST_TOOLTIP_MEDIAN": "返回列表中數值的中位數。", - "MATH_ONLIST_OPERATOR_MODE": "比較眾數 自列表", - "MATH_ONLIST_TOOLTIP_MODE": "返回一個列表中的最常見項目的列表。", - "MATH_ONLIST_OPERATOR_STD_DEV": "標準差 自列表", - "MATH_ONLIST_TOOLTIP_STD_DEV": "返回列表中數字的標準差。", - "MATH_ONLIST_OPERATOR_RANDOM": "隨機抽取 自列表", - "MATH_ONLIST_TOOLTIP_RANDOM": "從列表中返回一個隨機的項目。", - "MATH_MODULO_HELPURL": "https://zh.wikipedia.org/wiki/模除", - "MATH_MODULO_TITLE": "取餘數自 %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "回傳兩個數字相除的餘數", - "MATH_CONSTRAIN_TITLE": "限制數字 %1 介於 (低) %2 到 (高) %3", - "MATH_CONSTRAIN_TOOLTIP": "限制數字介於兩個指定的數字之間", - "MATH_RANDOM_INT_HELPURL": "https://zh.wikipedia.org/wiki/隨機數生成器", - "MATH_RANDOM_INT_TITLE": "取隨機整數介於 (低) %1 到 %2", - "MATH_RANDOM_INT_TOOLTIP": "回傳限制的數字區間內的隨機數字", - "MATH_RANDOM_FLOAT_HELPURL": "https://zh.wikipedia.org/wiki/隨機數生成器", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "取隨機分數", - "MATH_RANDOM_FLOAT_TOOLTIP": "返回介於 (包含) 0.0 到 1.0 之間的隨機數。", - "TEXT_TEXT_HELPURL": "https://zh.wikipedia.org/wiki/字串", - "TEXT_TEXT_TOOLTIP": "字元、 單詞或一行文字。", - "TEXT_JOIN_TITLE_CREATEWITH": "建立字串使用", - "TEXT_JOIN_TOOLTIP": "通過串起任意數量的項目來建立一段文字。", - "TEXT_CREATE_JOIN_TITLE_JOIN": "加入", - "TEXT_CREATE_JOIN_TOOLTIP": "添加、 刪除或重新排列各區塊來此重新配置這個文字積木。", - "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "將一個項目加入到字串中。", - "TEXT_APPEND_TO": "在", - "TEXT_APPEND_APPENDTEXT": "後加入文字", - "TEXT_APPEND_TOOLTIP": "將一些文字追加到變量 '%1'。", - "TEXT_LENGTH_TITLE": "長度 %1", - "TEXT_LENGTH_TOOLTIP": "返回這串文字的字元數(含空格) 。", - "TEXT_ISEMPTY_TITLE": "%1 為空", - "TEXT_ISEMPTY_TOOLTIP": "如果提供的字串為空,則返回 真。", - "TEXT_INDEXOF_TOOLTIP": "返回在第二個字串中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。", - "TEXT_INDEXOF_INPUT_INTEXT": "在字串", - "TEXT_INDEXOF_OPERATOR_FIRST": "尋找 第一個 出現的字串", - "TEXT_INDEXOF_OPERATOR_LAST": "尋找 最後一個 出現的字串", - "TEXT_CHARAT_INPUT_INTEXT": "的字元在字串", - "TEXT_CHARAT_FROM_START": "取得 字元 #", - "TEXT_CHARAT_FROM_END": "取得 倒數第 # 個字元", - "TEXT_CHARAT_FIRST": "取第一個字元", - "TEXT_CHARAT_LAST": "取最後一個字元", - "TEXT_CHARAT_RANDOM": "取隨機一個字元", - "TEXT_CHARAT_TAIL": "", - "TEXT_CHARAT_TOOLTIP": "返回位於指定位置的字元。", - "TEXT_GET_SUBSTRING_TOOLTIP": "返回指定的部分文字。", - "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "自字串", - "TEXT_GET_SUBSTRING_START_FROM_START": "取得一段字串自 #", - "TEXT_GET_SUBSTRING_START_FROM_END": "取得一段字串自 #", - "TEXT_GET_SUBSTRING_START_FIRST": "取得一段字串 自 第一個字元", - "TEXT_GET_SUBSTRING_END_FROM_START": "到 字元 #", - "TEXT_GET_SUBSTRING_END_FROM_END": "到 倒數第 # 個字元", - "TEXT_GET_SUBSTRING_END_LAST": "到 最後一個字元", - "TEXT_CHANGECASE_TOOLTIP": "使用不同的大小寫複製這段文字。", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "轉成 大寫", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "轉成 小寫", - "TEXT_CHANGECASE_OPERATOR_TITLECASE": "轉成 首字母大寫", - "TEXT_TRIM_TOOLTIP": "複製這段文字的同時刪除兩端多餘的空格。", - "TEXT_TRIM_OPERATOR_BOTH": "消除兩側空格", - "TEXT_TRIM_OPERATOR_LEFT": "消除左側空格", - "TEXT_TRIM_OPERATOR_RIGHT": "消除右側空格", - "TEXT_PRINT_TITLE": "印出 %1", - "TEXT_PRINT_TOOLTIP": "印出指定的文字、 數字或其他值。", - "TEXT_PROMPT_TYPE_TEXT": "輸入 文字 並顯示提示訊息", - "TEXT_PROMPT_TYPE_NUMBER": "輸入 數字 並顯示提示訊息", - "TEXT_PROMPT_TOOLTIP_NUMBER": "輸入數字", - "TEXT_PROMPT_TOOLTIP_TEXT": "輸入文字", - "LISTS_CREATE_EMPTY_TITLE": "建立空列表", - "LISTS_CREATE_EMPTY_TOOLTIP": "返回一個長度為 0 的列表,不包含任何資料記錄", - "LISTS_CREATE_WITH_TOOLTIP": "建立一個具備任意數量項目的列表。", - "LISTS_CREATE_WITH_INPUT_WITH": "使用這些值建立列表", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "加入", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "添加、 刪除或重新排列各區塊來此重新配置這個 列表 積木。", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "將一個項目加入到列表中。", - "LISTS_REPEAT_TOOLTIP": "建立包含指定重複次數的 值 的列表。", - "LISTS_REPEAT_TITLE": "建立列表使用項目 %1 重複 %2 次數", - "LISTS_LENGTH_TITLE": "長度 %1", - "LISTS_LENGTH_TOOLTIP": "返回列表的長度。", - "LISTS_ISEMPTY_TITLE": "%1 值為空", - "LISTS_ISEMPTY_TOOLTIP": "如果該列表為空,則返回 真。", - "LISTS_INLIST": "自列表", - "LISTS_INDEX_OF_FIRST": "找出 第一個 項目出現", - "LISTS_INDEX_OF_LAST": "找出 最後一個 項目出現", - "LISTS_INDEX_OF_TOOLTIP": "返回在列表中的第一個/最後一個匹配項目的索引值。如果未找到則返回 0。", - "LISTS_GET_INDEX_GET": "取值", - "LISTS_GET_INDEX_GET_REMOVE": "取出並移除", - "LISTS_GET_INDEX_REMOVE": "移除", - "LISTS_GET_INDEX_FROM_END": "倒數第#筆", - "LISTS_GET_INDEX_FIRST": "第一筆", - "LISTS_GET_INDEX_LAST": "最後一筆", - "LISTS_GET_INDEX_RANDOM": "隨機", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_START": "返回在列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM_END": "返回在列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "返回列表中的第一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "返回列表中的最後一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "返回列表中隨機的一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_START": "移除並返回列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM_END": "移除並返回列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "移除並返回列表中的第一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "移除並返回列表中的最後一個項目", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "移除並返回列表中的隨機一個項目", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_START": "移除在列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM_END": "移除在列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "移除列表中的第一個項目", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "移除列表中的最後一個項目", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "移除列表中隨機的一個項目", - "LISTS_SET_INDEX_SET": "設定", - "LISTS_SET_INDEX_INSERT": "插入到", - "LISTS_SET_INDEX_INPUT_TO": "為", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_START": "設定在列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM_END": "設定在列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "設定列表中的第一個項目", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "設定列表中的最後一個項目", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "設定列表中隨機的一個項目", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_START": "插入在列表中的指定位置的項目。#1 是第一個項目。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM_END": "插入在列表中的指定位置的項目。#1 是最後一個項目。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "在列表的起始處添加一個項目。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "在列表的尾端加入一個項目", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "在列表中隨機插入項目", - "LISTS_GET_SUBLIST_START_FROM_START": "從 # 取得子列表", - "LISTS_GET_SUBLIST_START_FROM_END": "從倒數 # 取得子列表", - "LISTS_GET_SUBLIST_START_FIRST": "從 頭 取得子列表", - "LISTS_GET_SUBLIST_END_FROM_START": "到 #", - "LISTS_GET_SUBLIST_END_FROM_END": "到 倒數 # 位", - "LISTS_GET_SUBLIST_END_LAST": "到 最後", - "LISTS_GET_SUBLIST_TOOLTIP": "複製列表中指定的部分。", - "VARIABLES_GET_TOOLTIP": "返回此變量的值。", - "VARIABLES_GET_CREATE_SET": "創立 '設定 %1'", - "VARIABLES_SET": "賦值 %1 到 %2", - "VARIABLES_SET_TOOLTIP": "設定此變量,好和輸入值相等。", - "VARIABLES_SET_CREATE_GET": "建立 '取得 %1'", - "PROCEDURES_DEFNORETURN_TITLE": "到", - "PROCEDURES_DEFNORETURN_PROCEDURE": "流程", - "PROCEDURES_BEFORE_PARAMS": "與:", - "PROCEDURES_CALL_BEFORE_PARAMS": "與:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "創建一個無回傳值的函數。", - "PROCEDURES_DEFRETURN_RETURN": "回傳", - "PROCEDURES_DEFRETURN_TOOLTIP": "創建一個有回傳值的函數。", - "PROCEDURES_DEF_DUPLICATE_WARNING": "警告: 此函數中有重複的參數。", - "PROCEDURES_CALLNORETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程式", - "PROCEDURES_CALLNORETURN_TOOLTIP": "執行使用者定義的函數 '%1'。", - "PROCEDURES_CALLRETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程式", - "PROCEDURES_CALLRETURN_TOOLTIP": "執行使用者定義的函數 '%1' 並使用它的回傳值", - "PROCEDURES_MUTATORCONTAINER_TITLE": "參數", - "PROCEDURES_MUTATORARG_TITLE": "變量:", - "PROCEDURES_HIGHLIGHT_DEF": "反白顯示函式定義", - "PROCEDURES_CREATE_DO": "建立 '%1'", - "PROCEDURES_IFRETURN_TOOLTIP": "如果值為 真,則返回第二個值。", - "PROCEDURES_IFRETURN_WARNING": "警告: 此積木僅可在定義函式時使用。" -} diff --git a/msg/messages.js b/msg/messages.js index 6467ca968b..6e1b507e79 100644 --- a/msg/messages.js +++ b/msg/messages.js @@ -43,16 +43,16 @@ goog.require('Blockly.Msg'); */ /** - * Tip: Generate URLs for read-only blocks by creating the blocks in the Code app, - * then evaluating this in the console: - * 'http://blockly-demo.appspot.com/static/apps/code/readonly.html?lang=en&xml=' + encodeURIComponent(Blockly.Xml.domToText(Blockly.Xml.workspaceToDom(Blockly.mainWorkspace)).slice(5, -6)) + * Each message is preceded with a tripple-slash comment that becomes the + * message descriptor. The build process extracts these descriptors, adds + * them to msg/json/qqq.json, and they show up in the translation console. */ /// default name - A simple, general default name for a variable, preferably short. /// For more context, see /// [[Translating:Blockly#infrequent_message_types]].\n{{Identical|Item}} Blockly.Msg.VARIABLES_DEFAULT_NAME = 'item'; -/// button text - Botton that sets a calendar to today's date.\n{{Identical|Today}} +/// button text - Button that sets a calendar to today's date.\n{{Identical|Today}} Blockly.Msg.TODAY = 'Today'; // Context menus. @@ -88,6 +88,10 @@ Blockly.Msg.DISABLE_BLOCK = 'Disable Block'; Blockly.Msg.ENABLE_BLOCK = 'Enable Block'; /// context menu - Provide helpful information about the selected block.\n{{Identical|Help}} Blockly.Msg.HELP = 'Help'; +/// context menu - Undo the previous action.\n{{Identical|Undo}} +Blockly.Msg.UNDO = 'Undo'; +/// context menu - Undo the previous undo action.\n{{Identical|Redo}} +Blockly.Msg.REDO = 'Redo'; // Realtime collaboration. /// collaboration instruction - Tell the user that they can talk with other users. @@ -250,11 +254,11 @@ Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = 'Return true if the first input is great Blockly.Msg.LOGIC_OPERATION_HELPURL = 'https://github.com/google/blockly/wiki/Logic#logical-operations'; /// tooltip - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction]. Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = 'Return true if both inputs are true.'; -/// block text - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction]. +/// block text - See [https://en.wikipedia.org/wiki/Logical_conjunction https://en.wikipedia.org/wiki/Logical_conjunction].\n{{Identical|And}} Blockly.Msg.LOGIC_OPERATION_AND = 'and'; /// block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction]. Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = 'Return true if at least one of the inputs is true.'; -/// block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction]. +/// block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction].\n{{Identical|Or}} Blockly.Msg.LOGIC_OPERATION_OR = 'or'; /// url - Information about logical negation. The translation of [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation] is recommended if it exists in the target language. @@ -267,9 +271,9 @@ Blockly.Msg.LOGIC_NEGATE_TOOLTIP = 'Returns true if the input is false. Returns /// url - Information about the logic values ''true'' and ''false''. Consider using the translation of [https://en.wikipedia.org/wiki/Truth_value https://en.wikipedia.org/wiki/Truth_value] if it exists in your language. Blockly.Msg.LOGIC_BOOLEAN_HELPURL = 'https://github.com/google/blockly/wiki/Logic#values'; -/// block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''true''. +/// block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''true''.\n{{Identical|True}} Blockly.Msg.LOGIC_BOOLEAN_TRUE = 'true'; -/// block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''false''. +/// block text - The word for the [https://en.wikipedia.org/wiki/Truth_value logical value] ''false''.\n{{Identical|False}} Blockly.Msg.LOGIC_BOOLEAN_FALSE = 'false'; /// tooltip - Indicates that the block returns either of the two possible [https://en.wikipedia.org/wiki/Truth_value logical values]. Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = 'Returns either true or false.'; @@ -971,6 +975,23 @@ Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ''; /// [[File:Blockly-get-sublist.png]] Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = 'Creates a copy of the specified portion of a list.'; +/// url - Information describing sorting a list. +Blockly.Msg.LISTS_SORT_HELPURL = 'https://github.com/google/blockly/wiki/Lists#sorting-a-list'; +/// Sort as type %1 (numeric or alphabetic) in order %2 (ascending or descending) a list of items %3. +Blockly.Msg.LISTS_SORT_TITLE = 'sort %1 %2 %3'; +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#sorting-a-list]. +Blockly.Msg.LISTS_SORT_TOOLTIP = 'Sort a copy of a list.'; +/// sorting order or direction from low to high value for numeric, or A-Z for alphabetic. +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = 'ascending'; +/// sorting order or direction from high to low value for numeric, or Z-A for alphabetic. +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = 'descending'; +/// sort by treating each item as a number. +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = 'numeric'; +/// sort by treating each item alphabetically, case-sensitive. +Blockly.Msg.LISTS_SORT_TYPE_TEXT = 'alphabetic'; +/// sort by treating each item alphabetically, ignoring differences in case. +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = 'alphabetic, ignore case'; + /// url - Information describing splitting text into a list, or joining a list into text. Blockly.Msg.LISTS_SPLIT_HELPURL = 'https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists'; /// dropdown - Indicates that text will be split up into a list (e.g. "a-b-c" -> ["a", "b", "c"]). diff --git a/package.json b/package.json index cc24f2a905..196338cb80 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,18 @@ { - "name": "blockly", + "name": "scratch-blocks", "version": "1.0.0", - "description": "Blockly is a library for building visual programming editors.", - "keywords": ["blockly"], - "scripts": { - "lint": "jshint ." - }, + "description": "Scratch Blocks is a library for building creative computing interfaces.", + "author": "Massachusetts Institute of Technology", + "license": "Apache-2.0", + "homepage": "https://github.com/LLK/scratch-blocks#readme", "repository": { "type": "git", - "url": "https://github.com/google/blockly.git" - }, - "bugs": { - "url": "https://github.com/google/blockly/issues" + "url": "https://github.com/LLK/scratch-blocks.git" }, - "homepage": "https://developers.google.com/blockly/", - "author": { - "name": "Neil Fraser" + "scripts": { + "test": "./node_modules/.bin/eslint ." }, - "license": "Apache-2.0", - "private": true, "devDependencies": { - "jshint": "latest" - }, - "jshintConfig": { - "globalstrict": true, - "predef": ["Blockly", "goog", "window", "document", "soy", "XMLHttpRequest"], - "sub": true, - "undef": true, - "unused": true + "eslint": "~2.9.0" } } diff --git a/php_compressed.js b/php_compressed.js deleted file mode 100644 index 946cee60b6..0000000000 --- a/php_compressed.js +++ /dev/null @@ -1,77 +0,0 @@ -// Do not edit this file; automatically generated by build.py. -'use strict'; - - -// Copyright 2015 Google Inc. Apache License 2.0 -Blockly.PHP=new Blockly.Generator("PHP");Blockly.PHP.addReservedWords("__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,clone,const,continue,declare,default,die,do,echo,else,elseif,empty,enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,final,for,foreach,function,global,goto,if,implements,include,include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,print,private,protected,public,require,require_once,return,static,switch,throw,trait,try,unset,use,var,while,xor,PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__"); -Blockly.PHP.ORDER_ATOMIC=0;Blockly.PHP.ORDER_CLONE=1;Blockly.PHP.ORDER_NEW=1;Blockly.PHP.ORDER_MEMBER=2;Blockly.PHP.ORDER_FUNCTION_CALL=2;Blockly.PHP.ORDER_INCREMENT=3;Blockly.PHP.ORDER_DECREMENT=3;Blockly.PHP.ORDER_LOGICAL_NOT=4;Blockly.PHP.ORDER_BITWISE_NOT=4;Blockly.PHP.ORDER_UNARY_PLUS=4;Blockly.PHP.ORDER_UNARY_NEGATION=4;Blockly.PHP.ORDER_MULTIPLICATION=5;Blockly.PHP.ORDER_DIVISION=5;Blockly.PHP.ORDER_MODULUS=5;Blockly.PHP.ORDER_ADDITION=6;Blockly.PHP.ORDER_SUBTRACTION=6; -Blockly.PHP.ORDER_BITWISE_SHIFT=7;Blockly.PHP.ORDER_RELATIONAL=8;Blockly.PHP.ORDER_IN=8;Blockly.PHP.ORDER_INSTANCEOF=8;Blockly.PHP.ORDER_EQUALITY=9;Blockly.PHP.ORDER_BITWISE_AND=10;Blockly.PHP.ORDER_BITWISE_XOR=11;Blockly.PHP.ORDER_BITWISE_OR=12;Blockly.PHP.ORDER_CONDITIONAL=13;Blockly.PHP.ORDER_ASSIGNMENT=14;Blockly.PHP.ORDER_LOGICAL_AND=15;Blockly.PHP.ORDER_LOGICAL_OR=16;Blockly.PHP.ORDER_COMMA=17;Blockly.PHP.ORDER_NONE=99; -Blockly.PHP.init=function(a){Blockly.PHP.definitions_=Object.create(null);Blockly.PHP.functionNames_=Object.create(null);Blockly.PHP.variableDB_?Blockly.PHP.variableDB_.reset():Blockly.PHP.variableDB_=new Blockly.Names(Blockly.PHP.RESERVED_WORDS_,"$");var b=[];a=Blockly.Variables.allVariables(a);for(var c=0;c",GTE:">="}[a.getFieldValue("OP")],c="=="==b||"!="==b?Blockly.PHP.ORDER_EQUALITY:Blockly.PHP.ORDER_RELATIONAL,d=Blockly.PHP.valueToCode(a,"A",c)||"0";a=Blockly.PHP.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -Blockly.PHP.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"&&":"||",c="&&"==b?Blockly.PHP.ORDER_LOGICAL_AND:Blockly.PHP.ORDER_LOGICAL_OR,d=Blockly.PHP.valueToCode(a,"A",c);a=Blockly.PHP.valueToCode(a,"B",c);if(d||a){var e="&&"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.PHP.logic_negate=function(a){var b=Blockly.PHP.ORDER_LOGICAL_NOT;return["!"+(Blockly.PHP.valueToCode(a,"BOOL",b)||"true"),b]}; -Blockly.PHP.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.logic_null=function(a){return["null",Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.logic_ternary=function(a){var b=Blockly.PHP.valueToCode(a,"IF",Blockly.PHP.ORDER_CONDITIONAL)||"false",c=Blockly.PHP.valueToCode(a,"THEN",Blockly.PHP.ORDER_CONDITIONAL)||"null";a=Blockly.PHP.valueToCode(a,"ELSE",Blockly.PHP.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,Blockly.PHP.ORDER_CONDITIONAL]};Blockly.PHP.loops={}; -Blockly.PHP.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):Blockly.PHP.valueToCode(a,"TIMES",Blockly.PHP.ORDER_ASSIGNMENT)||"0",c=Blockly.PHP.statementToCode(a,"DO"),c=Blockly.PHP.addLoopTrap(c,a.id);a="";var d=Blockly.PHP.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE),e=b;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.PHP.variableDB_.getDistinctName("repeat_end",Blockly.Variables.NAME_TYPE),a+=e+" = "+b+";\n");return a+("for ("+ -d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};Blockly.PHP.controls_repeat=Blockly.PHP.controls_repeat_ext;Blockly.PHP.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.PHP.valueToCode(a,"BOOL",b?Blockly.PHP.ORDER_LOGICAL_NOT:Blockly.PHP.ORDER_NONE)||"false",d=Blockly.PHP.statementToCode(a,"DO"),d=Blockly.PHP.addLoopTrap(d,a.id);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; -Blockly.PHP.controls_for=function(a){var b=Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.PHP.valueToCode(a,"FROM",Blockly.PHP.ORDER_ASSIGNMENT)||"0",d=Blockly.PHP.valueToCode(a,"TO",Blockly.PHP.ORDER_ASSIGNMENT)||"0",e=Blockly.PHP.valueToCode(a,"BY",Blockly.PHP.ORDER_ASSIGNMENT)||"1",g=Blockly.PHP.statementToCode(a,"DO"),g=Blockly.PHP.addLoopTrap(g,a.id);if(Blockly.isNumber(c)&&Blockly.isNumber(d)&&Blockly.isNumber(e)){var f=parseFloat(c)<=parseFloat(d); -a="for ("+b+" = "+c+"; "+b+(f?" <= ":" >= ")+d+"; "+b;b=Math.abs(parseFloat(e));a=(1==b?a+(f?"++":"--"):a+((f?" += ":" -= ")+b))+(") {\n"+g+"}\n")}else a="",f=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(f=Blockly.PHP.variableDB_.getDistinctName(b+"_start",Blockly.Variables.NAME_TYPE),a+=f+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.PHP.variableDB_.getDistinctName(b+"_end",Blockly.Variables.NAME_TYPE),a+=c+" = "+d+";\n"),d=Blockly.PHP.variableDB_.getDistinctName(b+"_inc",Blockly.Variables.NAME_TYPE), -a+=d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("abs("+e+");\n"),a+="if ("+f+" > "+c+") {\n",a+=Blockly.PHP.INDENT+d+" = -"+d+";\n",a+="}\n",a+="for ("+b+" = "+f+";\n "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+";\n "+b+" += "+d+") {\n"+g+"}\n";return a}; -Blockly.PHP.controls_forEach=function(a){var b=Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_ASSIGNMENT)||"[]",d=Blockly.PHP.statementToCode(a,"DO"),d=Blockly.PHP.addLoopTrap(d,a.id);return""+("foreach ("+c+" as "+b+") {\n"+d+"}\n")}; -Blockly.PHP.controls_flow_statements=function(a){switch(a.getFieldValue("FLOW")){case "BREAK":return"break;\n";case "CONTINUE":return"continue;\n"}throw"Unknown flow statement.";};Blockly.PHP.math={};Blockly.PHP.math_number=function(a){a=parseFloat(a.getFieldValue("NUM"));Infinity==a?a="INF":-Infinity==a&&(a="-INF");return[a,Blockly.PHP.ORDER_ATOMIC]}; -Blockly.PHP.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.PHP.ORDER_ADDITION],MINUS:[" - ",Blockly.PHP.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.PHP.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.PHP.ORDER_DIVISION],POWER:[null,Blockly.PHP.ORDER_COMMA]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.PHP.valueToCode(a,"A",b)||"0";a=Blockly.PHP.valueToCode(a,"B",b)||"0";return c?[d+c+a,b]:["pow("+d+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; -Blockly.PHP.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return a=Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_UNARY_NEGATION)||"0","-"==a[0]&&(a=" "+a),["-"+a,Blockly.PHP.ORDER_UNARY_NEGATION];a="SIN"==b||"COS"==b||"TAN"==b?Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_DIVISION)||"0":Blockly.PHP.valueToCode(a,"NUM",Blockly.PHP.ORDER_NONE)||"0";switch(b){case "ABS":c="abs("+a+")";break;case "ROOT":c="sqrt("+a+")";break;case "LN":c="log("+a+")";break;case "EXP":c="exp("+ -a+")";break;case "POW10":c="pow(10,"+a+")";break;case "ROUND":c="round("+a+")";break;case "ROUNDUP":c="ceil("+a+")";break;case "ROUNDDOWN":c="floor("+a+")";break;case "SIN":c="sin("+a+" / 180 * pi())";break;case "COS":c="cos("+a+" / 180 * pi())";break;case "TAN":c="tan("+a+" / 180 * pi())"}if(c)return[c,Blockly.PHP.ORDER_FUNCTION_CALL];switch(b){case "LOG10":c="log("+a+") / log(10)";break;case "ASIN":c="asin("+a+") / pi() * 180";break;case "ACOS":c="acos("+a+") / pi() * 180";break;case "ATAN":c="atan("+ -a+") / pi() * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.PHP.ORDER_DIVISION]};Blockly.PHP.math_constant=function(a){return{PI:["M_PI",Blockly.PHP.ORDER_ATOMIC],E:["M_E",Blockly.PHP.ORDER_ATOMIC],GOLDEN_RATIO:["(1 + sqrt(5)) / 2",Blockly.PHP.ORDER_DIVISION],SQRT2:["M_SQRT2",Blockly.PHP.ORDER_ATOMIC],SQRT1_2:["M_SQRT1_2",Blockly.PHP.ORDER_ATOMIC],INFINITY:["INF",Blockly.PHP.ORDER_ATOMIC]}[a.getFieldValue("CONSTANT")]}; -Blockly.PHP.math_number_property=function(a){var b=Blockly.PHP.valueToCode(a,"NUMBER_TO_CHECK",Blockly.PHP.ORDER_MODULUS)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return d=Blockly.PHP.provideFunction_("math_isPrime",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if ($n == 2 || $n == 3) {"," return true;"," }"," // False if n is NaN, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3.", -" if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 || $n % 3 == 0) {"," return false;"," }"," // Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {"," if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {"," return false;"," }"," }"," return true;","}"])+"("+b+")",[d,Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d="is_int("+b+")";break;case "POSITIVE":d= -b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.PHP.valueToCode(a,"DIVISOR",Blockly.PHP.ORDER_MODULUS)||"0",d=b+" % "+a+" == 0"}return[d,Blockly.PHP.ORDER_EQUALITY]};Blockly.PHP.math_change=function(a){var b=Blockly.PHP.valueToCode(a,"DELTA",Blockly.PHP.ORDER_ADDITION)||"0";return Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE)+" += "+b+";\n"};Blockly.PHP.math_round=Blockly.PHP.math_single;Blockly.PHP.math_trig=Blockly.PHP.math_single; -Blockly.PHP.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="array_sum("+a+")";break;case "MIN":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="min("+a+")";break;case "MAX":a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="max("+a+")";break;case "AVERAGE":b=Blockly.PHP.provideFunction_("math_mean",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+ -"($myList) {"," return array_sum($myList) / count($myList);","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"array()";a=b+"("+a+")";break;case "MEDIAN":b=Blockly.PHP.provideFunction_("math_median",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($arr) {"," sort($arr,SORT_NUMERIC);"," return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : "," ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2) - 1]) / 2;","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)|| -"[]";a=b+"("+a+")";break;case "MODE":b=Blockly.PHP.provideFunction_("math_modes",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($values) {"," $v = array_count_values($values);"," arsort($v);"," foreach($v as $k => $v){$total = $k; break;}"," return array($total);","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=Blockly.PHP.provideFunction_("math_standard_deviation",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($numbers) {", -" $n = count($numbers);"," if (!$n) return null;"," $mean = array_sum($numbers) / count($numbers);"," foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);"," return sqrt(array_sum($devs) / (count($devs) - 1));","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=Blockly.PHP.provideFunction_("math_random_list",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($list) {"," $x = rand(0, count($list)-1);"," return $list[$x];", -"}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw"Unknown operator: "+b;}return[a,Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.math_modulo=function(a){var b=Blockly.PHP.valueToCode(a,"DIVIDEND",Blockly.PHP.ORDER_MODULUS)||"0";a=Blockly.PHP.valueToCode(a,"DIVISOR",Blockly.PHP.ORDER_MODULUS)||"0";return[b+" % "+a,Blockly.PHP.ORDER_MODULUS]}; -Blockly.PHP.math_constrain=function(a){var b=Blockly.PHP.valueToCode(a,"VALUE",Blockly.PHP.ORDER_COMMA)||"0",c=Blockly.PHP.valueToCode(a,"LOW",Blockly.PHP.ORDER_COMMA)||"0";a=Blockly.PHP.valueToCode(a,"HIGH",Blockly.PHP.ORDER_COMMA)||"Infinity";return["min(max("+b+", "+c+"), "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; -Blockly.PHP.math_random_int=function(a){var b=Blockly.PHP.valueToCode(a,"FROM",Blockly.PHP.ORDER_COMMA)||"0";a=Blockly.PHP.valueToCode(a,"TO",Blockly.PHP.ORDER_COMMA)||"0";return[Blockly.PHP.provideFunction_("math_random_int",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($a, $b) {"," if ($a > $b) {"," return rand($b, $a);"," }"," return rand($a, $b);","}"])+"("+b+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; -Blockly.PHP.math_random_float=function(a){return["(float)rand()/(float)getrandmax()",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.procedures={}; -Blockly.PHP.procedures_defreturn=function(a){for(var b=Blockly.Variables.allVariables(a),c=b.length-1;0<=c;c--){var d=b[c];-1==a.arguments_.indexOf(d)?b[c]=Blockly.PHP.variableDB_.getName(d,Blockly.Variables.NAME_TYPE):b.splice(c,1)}b=b.length?" global "+b.join(", ")+";\n":"";c=Blockly.PHP.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);d=Blockly.PHP.statementToCode(a,"STACK");Blockly.PHP.STATEMENT_PREFIX&&(d=Blockly.PHP.prefixLines(Blockly.PHP.STATEMENT_PREFIX.replace(/%1/g,"'"+ -a.id+"'"),Blockly.PHP.INDENT)+d);Blockly.PHP.INFINITE_LOOP_TRAP&&(d=Blockly.PHP.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+a.id+"'")+d);var e=Blockly.PHP.valueToCode(a,"RETURN",Blockly.PHP.ORDER_NONE)||"";e&&(e=" return "+e+";\n");for(var g=[],f=0;f",GTE:">="}[a.getFieldValue("OP")],c=Blockly.Python.ORDER_RELATIONAL,d=Blockly.Python.valueToCode(a,"A",c)||"0";a=Blockly.Python.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -Blockly.Python.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"and":"or",c="and"==b?Blockly.Python.ORDER_LOGICAL_AND:Blockly.Python.ORDER_LOGICAL_OR,d=Blockly.Python.valueToCode(a,"A",c);a=Blockly.Python.valueToCode(a,"B",c);if(d||a){var e="and"==b?"True":"False";d||(d=e);a||(a=e)}else a=d="False";return[d+" "+b+" "+a,c]};Blockly.Python.logic_negate=function(a){return["not "+(Blockly.Python.valueToCode(a,"BOOL",Blockly.Python.ORDER_LOGICAL_NOT)||"True"),Blockly.Python.ORDER_LOGICAL_NOT]}; -Blockly.Python.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"True":"False",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.logic_null=function(a){return["None",Blockly.Python.ORDER_ATOMIC]}; -Blockly.Python.logic_ternary=function(a){var b=Blockly.Python.valueToCode(a,"IF",Blockly.Python.ORDER_CONDITIONAL)||"False",c=Blockly.Python.valueToCode(a,"THEN",Blockly.Python.ORDER_CONDITIONAL)||"None";a=Blockly.Python.valueToCode(a,"ELSE",Blockly.Python.ORDER_CONDITIONAL)||"None";return[c+" if "+b+" else "+a,Blockly.Python.ORDER_CONDITIONAL]};Blockly.Python.loops={};Blockly.Python.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(parseInt(a.getFieldValue("TIMES"),10)):Blockly.Python.valueToCode(a,"TIMES",Blockly.Python.ORDER_NONE)||"0",b=Blockly.isNumber(b)?parseInt(b,10):"int("+b+")",c=Blockly.Python.statementToCode(a,"DO"),c=Blockly.Python.addLoopTrap(c,a.id)||Blockly.Python.PASS;return"for "+Blockly.Python.variableDB_.getDistinctName("count",Blockly.Variables.NAME_TYPE)+" in range("+b+"):\n"+c}; -Blockly.Python.controls_repeat=Blockly.Python.controls_repeat_ext;Blockly.Python.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.Python.valueToCode(a,"BOOL",b?Blockly.Python.ORDER_LOGICAL_NOT:Blockly.Python.ORDER_NONE)||"False",d=Blockly.Python.statementToCode(a,"DO"),d=Blockly.Python.addLoopTrap(d,a.id)||Blockly.Python.PASS;b&&(c="not "+c);return"while "+c+":\n"+d}; -Blockly.Python.controls_for=function(a){var b=Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE),c=Blockly.Python.valueToCode(a,"FROM",Blockly.Python.ORDER_NONE)||"0",d=Blockly.Python.valueToCode(a,"TO",Blockly.Python.ORDER_NONE)||"0",e=Blockly.Python.valueToCode(a,"BY",Blockly.Python.ORDER_NONE)||"1",g=Blockly.Python.statementToCode(a,"DO"),g=Blockly.Python.addLoopTrap(g,a.id)||Blockly.Python.PASS,f="",h=function(){return Blockly.Python.provideFunction_("upRange", -["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):"," while start <= stop:"," yield start"," start += abs(step)"])},k=function(){return Blockly.Python.provideFunction_("downRange",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):"," while start >= stop:"," yield start"," start -= abs(step)"])};a=function(a,b,c){return"("+a+" <= "+b+") and "+h()+"("+a+", "+b+", "+c+") or "+k()+"("+a+", "+b+", "+c+")"};if(Blockly.isNumber(c)&&Blockly.isNumber(d)&& -Blockly.isNumber(e))c=parseFloat(c),d=parseFloat(d),e=Math.abs(parseFloat(e)),0===c%1&&0===d%1&&0===e%1?(c<=d?(d++,a=0==c&&1==e?d:c+", "+d,1!=e&&(a+=", "+e)):(d--,a=c+", "+d+", -"+e),a="range("+a+")"):(a=ca?Blockly.Python.ORDER_UNARY_SIGN:Blockly.Python.ORDER_ATOMIC;return[a,b]}; -Blockly.Python.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Python.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Python.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Python.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Python.ORDER_MULTIPLICATIVE],POWER:[" ** ",Blockly.Python.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")],c=b[0],b=b[1],d=Blockly.Python.valueToCode(a,"A",b)||"0";a=Blockly.Python.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; -Blockly.Python.math_single=function(a){var b=a.getFieldValue("OP"),c;if("NEG"==b)return c=Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_UNARY_SIGN)||"0",["-"+c,Blockly.Python.ORDER_UNARY_SIGN];Blockly.Python.definitions_.import_math="import math";a="SIN"==b||"COS"==b||"TAN"==b?Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_MULTIPLICATIVE)||"0":Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_NONE)||"0";switch(b){case "ABS":c="math.fabs("+a+")";break;case "ROOT":c="math.sqrt("+ -a+")";break;case "LN":c="math.log("+a+")";break;case "LOG10":c="math.log10("+a+")";break;case "EXP":c="math.exp("+a+")";break;case "POW10":c="math.pow(10,"+a+")";break;case "ROUND":c="round("+a+")";break;case "ROUNDUP":c="math.ceil("+a+")";break;case "ROUNDDOWN":c="math.floor("+a+")";break;case "SIN":c="math.sin("+a+" / 180.0 * math.pi)";break;case "COS":c="math.cos("+a+" / 180.0 * math.pi)";break;case "TAN":c="math.tan("+a+" / 180.0 * math.pi)"}if(c)return[c,Blockly.Python.ORDER_FUNCTION_CALL];switch(b){case "ASIN":c= -"math.asin("+a+") / math.pi * 180";break;case "ACOS":c="math.acos("+a+") / math.pi * 180";break;case "ATAN":c="math.atan("+a+") / math.pi * 180";break;default:throw"Unknown math operator: "+b;}return[c,Blockly.Python.ORDER_MULTIPLICATIVE]}; -Blockly.Python.math_constant=function(a){var b={PI:["math.pi",Blockly.Python.ORDER_MEMBER],E:["math.e",Blockly.Python.ORDER_MEMBER],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",Blockly.Python.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",Blockly.Python.ORDER_MEMBER],SQRT1_2:["math.sqrt(1.0 / 2)",Blockly.Python.ORDER_MEMBER],INFINITY:["float('inf')",Blockly.Python.ORDER_ATOMIC]};a=a.getFieldValue("CONSTANT");"INFINITY"!=a&&(Blockly.Python.definitions_.import_math="import math");return b[a]}; -Blockly.Python.math_number_property=function(a){var b=Blockly.Python.valueToCode(a,"NUMBER_TO_CHECK",Blockly.Python.ORDER_MULTIPLICATIVE)||"0",c=a.getFieldValue("PROPERTY"),d;if("PRIME"==c)return Blockly.Python.definitions_.import_math="import math",Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number",d=Blockly.Python.provideFunction_("math_isPrime",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(n):"," # https://en.wikipedia.org/wiki/Primality_test#Naive_methods", -" # If n is not a number but a string, try parsing it."," if not isinstance(n, Number):"," try:"," n = float(n)"," except:"," return False"," if n == 2 or n == 3:"," return True"," # False if n is negative, is 1, or not whole, or if n is divisible by 2 or 3."," if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:"," return False"," # Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for x in range(6, int(math.sqrt(n)) + 2, 6):"," if n % (x - 1) == 0 or n % (x + 1) == 0:", -" return False"," return True"])+"("+b+")",[d,Blockly.Python.ORDER_FUNCTION_CALL];switch(c){case "EVEN":d=b+" % 2 == 0";break;case "ODD":d=b+" % 2 == 1";break;case "WHOLE":d=b+" % 1 == 0";break;case "POSITIVE":d=b+" > 0";break;case "NEGATIVE":d=b+" < 0";break;case "DIVISIBLE_BY":a=Blockly.Python.valueToCode(a,"DIVISOR",Blockly.Python.ORDER_MULTIPLICATIVE);if(!a||"0"==a)return["False",Blockly.Python.ORDER_ATOMIC];d=b+" % "+a+" == 0"}return[d,Blockly.Python.ORDER_RELATIONAL]}; -Blockly.Python.math_change=function(a){Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number";var b=Blockly.Python.valueToCode(a,"DELTA",Blockly.Python.ORDER_ADDITIVE)||"0";a=Blockly.Python.variableDB_.getName(a.getFieldValue("VAR"),Blockly.Variables.NAME_TYPE);return a+" = ("+a+" if isinstance("+a+", Number) else 0) + "+b+"\n"};Blockly.Python.math_round=Blockly.Python.math_single;Blockly.Python.math_trig=Blockly.Python.math_single; -Blockly.Python.math_on_list=function(a){var b=a.getFieldValue("OP");a=Blockly.Python.valueToCode(a,"LIST",Blockly.Python.ORDER_NONE)||"[]";switch(b){case "SUM":b="sum("+a+")";break;case "MIN":b="min("+a+")";break;case "MAX":b="max("+a+")";break;case "AVERAGE":Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number";b=Blockly.Python.provideFunction_("math_mean",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(myList):"," localList = [e for e in myList if isinstance(e, Number)]", -" if not localList: return"," return float(sum(localList)) / len(localList)"]);b=b+"("+a+")";break;case "MEDIAN":Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number";b=Blockly.Python.provideFunction_("math_median",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(myList):"," localList = sorted([e for e in myList if isinstance(e, Number)])"," if not localList: return"," if len(localList) % 2 == 0:"," return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0", -" else:"," return localList[(len(localList) - 1) // 2]"]);b=b+"("+a+")";break;case "MODE":b=Blockly.Python.provideFunction_("math_modes",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(some_list):"," modes = []"," # Using a lists of [item, count] to keep count rather than dict",' # to avoid "unhashable" errors when the counted item is itself a list or dict.'," counts = []"," maxCount = 1"," for item in some_list:"," found = False"," for count in counts:"," if count[0] == item:", -" count[1] += 1"," maxCount = max(maxCount, count[1])"," found = True"," if not found:"," counts.append([item, 1])"," for counted_item, item_count in counts:"," if item_count == maxCount:"," modes.append(counted_item)"," return modes"]);b=b+"("+a+")";break;case "STD_DEV":Blockly.Python.definitions_.import_math="import math";b=Blockly.Python.provideFunction_("math_standard_deviation",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(numbers):"," n = len(numbers)", -" if n == 0: return"," mean = float(sum(numbers)) / n"," variance = sum((x - mean) ** 2 for x in numbers) / n"," return math.sqrt(variance)"]);b=b+"("+a+")";break;case "RANDOM":Blockly.Python.definitions_.import_random="import random";b="random.choice("+a+")";break;default:throw"Unknown operator: "+b;}return[b,Blockly.Python.ORDER_FUNCTION_CALL]}; -Blockly.Python.math_modulo=function(a){var b=Blockly.Python.valueToCode(a,"DIVIDEND",Blockly.Python.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Python.valueToCode(a,"DIVISOR",Blockly.Python.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Python.ORDER_MULTIPLICATIVE]}; -Blockly.Python.math_constrain=function(a){var b=Blockly.Python.valueToCode(a,"VALUE",Blockly.Python.ORDER_NONE)||"0",c=Blockly.Python.valueToCode(a,"LOW",Blockly.Python.ORDER_NONE)||"0";a=Blockly.Python.valueToCode(a,"HIGH",Blockly.Python.ORDER_NONE)||"float('inf')";return["min(max("+b+", "+c+"), "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]}; -Blockly.Python.math_random_int=function(a){Blockly.Python.definitions_.import_random="import random";var b=Blockly.Python.valueToCode(a,"FROM",Blockly.Python.ORDER_NONE)||"0";a=Blockly.Python.valueToCode(a,"TO",Blockly.Python.ORDER_NONE)||"0";return["random.randint("+b+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.math_random_float=function(a){Blockly.Python.definitions_.import_random="import random";return["random.random()",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.procedures={}; -Blockly.Python.procedures_defreturn=function(a){for(var b=Blockly.Variables.allVariables(a),c=b.length-1;0<=c;c--){var d=b[c];-1==a.arguments_.indexOf(d)?b[c]=Blockly.Python.variableDB_.getName(d,Blockly.Variables.NAME_TYPE):b.splice(c,1)}b=b.length?" global "+b.join(", ")+"\n":"";c=Blockly.Python.variableDB_.getName(a.getFieldValue("NAME"),Blockly.Procedures.NAME_TYPE);d=Blockly.Python.statementToCode(a,"STACK");Blockly.Python.STATEMENT_PREFIX&&(d=Blockly.Python.prefixLines(Blockly.Python.STATEMENT_PREFIX.replace(/%1/g,"'"+ -a.id+"'"),Blockly.Python.INDENT)+d);Blockly.Python.INFINITE_LOOP_TRAP&&(d=Blockly.Python.INFINITE_LOOP_TRAP.replace(/%1/g,'"'+a.id+'"')+d);var e=Blockly.Python.valueToCode(a,"RETURN",Blockly.Python.ORDER_NONE)||"";e?e=" return "+e+"\n":d||(d=Blockly.Python.PASS);for(var g=[],f=0;f - - test colour picker - - - static colour - - - #ff6600 - - - - - #ff6600 - - - - - - - test rgb - - - from rgb - - - - - 100 - - - - - 40 - - - - - 0 - - - - - - - #ff6600 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test colour random - - - - - 100 - - - - - item - - - - - - test name - - - - - item - - - - - - - 7 - - - - - test name - - - - FIRST - - - item - - - - - - - # - - - - - i - - - 2 - - - - - 7 - - - - - test name - TRUE - - - NEQ - - - 0 - - - - - FIRST - - - abcdefABDEF0123456789 - - - - - - FROM_START - - - item - - - - - i - - - - - - - - - - - - - - - - - - - - - - - test blend - - - blend - - - - - #ff0000 - - - - - - - 100 - - - - - 40 - - - - - 0 - - - - - - - 0.4 - - - - - - - #ff2900 - - - - - - diff --git a/tests/generators/functions.xml b/tests/generators/functions.xml deleted file mode 100644 index ce450b11a7..0000000000 --- a/tests/generators/functions.xml +++ /dev/null @@ -1,519 +0,0 @@ - - - - - - - - - - - test recurse - - - - - - - - 3 - - - - - - - -1-2-1-3-1-2-1- - - - - - - - - - - - test procedure - - - - - - - - - 8 - - - - - 2 - - - - - procedure with global - - - proc z - - - - - 4 - - - - - proc w - - - FALSE - - - - - - - - - - FALSE - - - - - procedure no return - TRUE - - - proc w - - - - - proc w - - - FALSE - - - - - - - - - - TRUE - - - - - procedure return - FALSE - - - proc w - - - - - - - - - - - - - - - - - - - - - - - - - procedure 1 - - - proc z - - - DIVIDE - - - proc x - - - - - proc y - - - - - - - - - - - - procedure 2 - - - - - - proc x - - - - - proc w - - - TRUE - - - - - - - - - test function - - - function with arguments - - - - - - - - - 2 - - - - - 3 - - - - - - - -1 - - - - - function with side effect - - - func z - - - - - side effect - - - - - func a - - - unchanged - - - - - func c - - - global - - - - - function with global - - - - - - - - 2 - - - - - - - 3global - - - - - function with scope - - - func a - - - - - unchanged - - - - - function return - TRUE - - - - - - - - TRUE - - - - - - - function no return - FALSE - - - - - - - - FALSE - - - - - - - - - - - - - - - - - - - - - - - - - - - function 1 - - - func z - - - side effect - - - - - - - MINUS - - - func x - - - - - func y - - - - - - - - - - function 2 - - - func a - - - 1 - - - - - - - - - - func a - - - - - func c - - - - - - - - - - function 3 - - - - - - func a - - - - - TRUE - - - - - - - FALSE - - - - - - - - recurse - - - - - - GT - - - n - - - - - 0 - - - - - - - text - - - - - - - - - - - MINUS - - - n - - - - - 1 - - - - - - - - - n - - - - - - - - - - MINUS - - - n - - - - - 1 - - - - - - - - - - - - - text - - - - - - - - - - - - - text - - - - diff --git a/tests/generators/index.html b/tests/generators/index.html deleted file mode 100644 index e30de118c0..0000000000 --- a/tests/generators/index.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - -Blockly Generator Tests - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    -

    Blockly Generator Tests

    - -

    - - -

    - -

    - Generate: - - - - - -

    -
    - -
    - - diff --git a/tests/generators/lists.xml b/tests/generators/lists.xml deleted file mode 100644 index ebbbec9f8a..0000000000 --- a/tests/generators/lists.xml +++ /dev/null @@ -1,2255 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test create - - - test create empty - - - - - - - - - - - test create items - - - - - - TRUE - - - - - love - - - - - - - - - - TRUE - - - - - love - - - - - - - test create repeated - - - - - Eject - - - - - 3 - - - - - - - - - - Eject - - - - - Eject - - - - - Eject - - - - - - - - - - - - - test empty - - - not empty - FALSE - - - - - - - - 0 - - - - - - - - - empty - TRUE - - - - - - - - - - - - - - test length - - - zero length - - - - - - - - - - 0 - - - - - one length - - - - - - - - cat - - - - - - - - - 1 - - - - - three length - - - - - - - - cat - - - - - TRUE - - - - - - - - - - - - 3 - - - - - - - - - - - test find - - - find first - - - FIRST - - - - - - Alice - - - - - Eve - - - - - Bob - - - - - Eve - - - - - - - Eve - - - - - - - 2 - - - - - find last - - - LAST - - - - - - Alice - - - - - Eve - - - - - Bob - - - - - Eve - - - - - - - Eve - - - - - - - 4 - - - - - find none - - - FIRST - - - - - - Alice - - - - - Bob - - - - - Carol - - - - - Dave - - - - - - - Eve - - - - - - - 0 - - - - - - - - - - - test get - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - get first - - - - GET - FIRST - - - list - - - - - - - Kirk - - - - - get last - - - - GET - LAST - - - list - - - - - - - McCoy - - - - - get random - TRUE - - - - POSITIVE - - - FIRST - - - list - - - - - - GET - RANDOM - - - list - - - - - - - - - - - get # - - - - GET - FROM_START - - - list - - - - - 2 - - - - - - - Spock - - - - - get #-end - - - - GET - FROM_END - - - list - - - - - 3 - - - - - - - Kirk - - - - - - - - - - - - - - - - - test get remove - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove first - - - - GET_REMOVE - FIRST - - - list - - - - - - - Kirk - - - - - getremove first list - - - list - - - - - - - - Spock - - - - - McCoy - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove last - - - - GET_REMOVE - LAST - - - list - - - - - - - McCoy - - - - - getremove last list - - - list - - - - - - - - Kirk - - - - - Spock - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove random - TRUE - - - EQ - - - FIRST - - - list - - - - - - GET_REMOVE - RANDOM - - - list - - - - - - - - - 0 - - - - - - - getremove random list - - - - - list - - - - - - - 2 - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove # - - - - GET_REMOVE - FROM_START - - - list - - - - - 2 - - - - - - - Spock - - - - - getremove # list - - - list - - - - - - - - Kirk - - - - - McCoy - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - getremove #-end - - - - GET_REMOVE - FROM_END - - - list - - - - - 3 - - - - - - - Kirk - - - - - getremove #-end list - - - list - - - - - - - - Spock - - - - - McCoy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test remove - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - FIRST - - - list - - - - - remove first list - - - list - - - - - - - - Spock - - - - - McCoy - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - LAST - - - list - - - - - remove last list - - - list - - - - - - - - Kirk - - - - - Spock - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - RANDOM - - - list - - - - - remove random list - - - - - list - - - - - - - 2 - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - FROM_START - - - list - - - - - 2 - - - - - remove # list - - - list - - - - - - - - Kirk - - - - - McCoy - - - - - - - list - - - - - - Kirk - - - - - Spock - - - - - McCoy - - - - - - - - REMOVE - FROM_END - - - list - - - - - 3 - - - - - remove #-end list - - - list - - - - - - - - Spock - - - - - McCoy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test set - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - FIRST - - - x - - - - - Jean-Luc - - - - - set first list - - - x - - - - - - - - Jean-Luc - - - - - Riker - - - - - Crusher - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - LAST - - - x - - - - - Beverly - - - - - set last list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Beverly - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - RANDOM - - - x - - - - - Data - - - - - set random list - - - - - x - - - - - - - 3 - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - FROM_START - - - x - - - - - 3 - - - - - Pulaski - - - - - set # list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Pulaski - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - SET - FROM_END - - - x - - - - - 1 - - - - - Pulaski - - - - - set #-end list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Pulaski - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test insert - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - FIRST - - - x - - - - - Data - - - - - insert first list - - - x - - - - - - - - Data - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - LAST - - - x - - - - - Data - - - - - insert last list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - Data - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - RANDOM - - - x - - - - - Data - - - - - insert random list - - - - - x - - - - - - - 4 - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - FROM_START - - - x - - - - - 3 - - - - - Data - - - - - insert # list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Data - - - - - Crusher - - - - - - - x - - - - - - Picard - - - - - Riker - - - - - Crusher - - - - - - - - INSERT - FROM_END - - - x - - - - - 1 - - - - - Data - - - - - insert #-end list - - - x - - - - - - - - Picard - - - - - Riker - - - - - Data - - - - - Crusher - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test sublist - - - list - - - - - - Columbia - - - - - Challenger - - - - - Discovery - - - - - Atlantis - - - - - Endeavour - - - - - - - sublist # start - - - - FROM_START - FROM_START - - - list - - - - - 2 - - - - - 3 - - - - - - - - - - Challenger - - - - - Discovery - - - - - - - sublist # end - - - - FROM_END - FROM_END - - - list - - - - - 3 - - - - - 2 - - - - - - - - - - Discovery - - - - - Atlantis - - - - - - - sublist first-last - - - - FIRST - LAST - - - list - - - - - - - list - - - - - - - - - - - - - test join - - - list - - - - - - Vulcan - - - - - Klingon - - - - - Borg - - - - - - - join - - - - JOIN - - - list - - - - - , - - - - - - - Vulcan,Klingon,Borg - - - - - - - - - test split - - - list - - - - SPLIT - - - Vulcan,Klingon,Borg - - - - - , - - - - - - - join - - - list - - - - - - - - Vulcan - - - - - Klingon - - - - - Borg - - - - - - - - - - diff --git a/tests/generators/logic.xml b/tests/generators/logic.xml deleted file mode 100644 index b702b5ee39..0000000000 --- a/tests/generators/logic.xml +++ /dev/null @@ -1,786 +0,0 @@ - - - - - True - TRUE - - - TRUE - - - - - False - FALSE - - - FALSE - - - - - Not true - TRUE - - - - - FALSE - - - - - - - Not false - FALSE - - - - - TRUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test if - - - - - FALSE - - - - - if false - - - - - ok - - - FALSE - - - - - - - TRUE - - - - - ok - - - TRUE - - - - - - - if true - TRUE - - - ok - - - - - ok - - - FALSE - - - - - - - - FALSE - - - - - if/else false - - - - - ok - - - TRUE - - - - - - - if/else false - TRUE - - - ok - - - - - ok - - - FALSE - - - - - - - - TRUE - - - - - ok - - - TRUE - - - - - - - if/else true - - - - - if/else true - TRUE - - - ok - - - - - ok - - - FALSE - - - - - - - - FALSE - - - - - elseif 1 - - - - - TRUE - - - - - ok - - - TRUE - - - - - - - TRUE - - - - - elseif 2 - - - - - elseif 3 - - - - - elseif 4 - TRUE - - - ok - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test equalities - - - Equal yes - TRUE - - - EQ - - - 2 - - - - - 2 - - - - - - - Equal no - FALSE - - - EQ - - - 3 - - - - - 4 - - - - - - - Not equal yes - TRUE - - - NEQ - - - 5 - - - - - 6 - - - - - - - Not equal no - FALSE - - - EQ - - - 3 - - - - - 4 - - - - - - - Smaller yes - TRUE - - - LT - - - 5 - - - - - 6 - - - - - - - Smaller no - FALSE - - - LT - - - 7 - - - - - 7 - - - - - - - Greater yes - TRUE - - - GT - - - 9 - - - - - 8 - - - - - - - Greater no - FALSE - - - GT - - - 10 - - - - - 10 - - - - - - - Smaller-equal yes - TRUE - - - LTE - - - 11 - - - - - 11 - - - - - - - Smaller-equal no - FALSE - - - LTE - - - 13 - - - - - 12 - - - - - - - Greater-equal yes - TRUE - - - GTE - - - 14 - - - - - 14 - - - - - - - Greater-equal no - FALSE - - - GTE - - - 15 - - - - - 16 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test or - - - Or true/true - TRUE - - - OR - - - TRUE - - - - - TRUE - - - - - - - Or false/true - TRUE - - - OR - - - FALSE - - - - - TRUE - - - - - - - Or true/false - TRUE - - - OR - - - TRUE - - - - - FALSE - - - - - - - Or false/false - FALSE - - - OR - - - FALSE - - - - - FALSE - - - - - - - - - - - - - - - test and - - - And true/true - TRUE - - - AND - - - TRUE - - - - - TRUE - - - - - - - And false/true - FALSE - - - AND - - - FALSE - - - - - TRUE - - - - - - - And true/false - FALSE - - - AND - - - TRUE - - - - - FALSE - - - - - - - And false/false - FALSE - - - AND - - - FALSE - - - - - FALSE - - - - - - - - - - - - - - - test ternary - - - if true - - - - - TRUE - - - - - 42 - - - - - 99 - - - - - - - 42 - - - - - if true - - - - - FALSE - - - - - 42 - - - - - 99 - - - - - - - 99 - - - - - - - - diff --git a/tests/generators/loops1.xml b/tests/generators/loops1.xml deleted file mode 100644 index 70fb34c1cb..0000000000 --- a/tests/generators/loops1.xml +++ /dev/null @@ -1,275 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - test foreach - - - log - - - - - - - - x - - - - - - a - - - - - b - - - - - c - - - - - - - log - - - x - - - - - - - for loop - - - log - - - - - abc - - - - - - - - - - - - test while - - - WHILE - - - FALSE - - - - - while 0 - - - - - UNTIL - - - TRUE - - - - - until 0 - - - - - count - - - 1 - - - - - WHILE - - - NEQ - - - count - - - - - 10 - - - - - - - count - - - 1 - - - - - - - while 10 - - - count - - - - - 10 - - - - - count - - - 1 - - - - - UNTIL - - - EQ - - - count - - - - - 10 - - - - - - - count - - - 1 - - - - - - - until 10 - - - count - - - - - 10 - - - - - - - - - - - - - - - - - - - - - - test repeat - - - count - - - 0 - - - - - - - 10 - - - - - count - - - 1 - - - - - - - repeat 10 - - - count - - - - - 10 - - - - - - - - - - diff --git a/tests/generators/loops2.xml b/tests/generators/loops2.xml deleted file mode 100644 index 4307f6d10a..0000000000 --- a/tests/generators/loops2.xml +++ /dev/null @@ -1,850 +0,0 @@ - - - - - - - - - - - - - - - test count by - - - log - - - - - - - - x - - - 1 - - - - - 8 - - - - - 2 - - - - - log - - - x - - - - - - - count up ints - - - log - - - - - 1357 - - - - - log - - - - - - - - x - - - 8 - - - - - 1 - - - - - 2 - - - - - log - - - x - - - - - - - count down ints - - - log - - - - - 8642 - - - - - loglist - - - - - - x - - - 1 - - - - - 8 - - - - - 1.5 - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count with floats - - - loglist - - - - - - - - 1 - - - - - 2.5 - - - - - 4 - - - - - 5.5 - - - - - 7 - - - - - - - loglist - - - - - - x - - - ADD - - - 1 - - - - - 0 - - - - - - - ADD - - - 8 - - - - - 0 - - - - - - - MINUS - - - 1 - - - - - 2 - - - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count up non-trivial ints - - - loglist - - - - - - - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - - - loglist - - - - - - x - - - ADD - - - 8 - - - - - 0 - - - - - - - ADD - - - 1 - - - - - 0 - - - - - - - 2 - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count down non-trivial ints - - - loglist - - - - - - - - 8 - - - - - 6 - - - - - 4 - - - - - 2 - - - - - - - loglist - - - - - - x - - - ADD - - - 5 - - - - - 0.5 - - - - - - - ADD - - - 1 - - - - - 0 - - - - - - - ADD - - - 1 - - - - - 0 - - - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count with floats - - - loglist - - - - - - - - 5.5 - - - - - 4.5 - - - - - 3.5 - - - - - 2.5 - - - - - 1.5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test count - - - log - - - - - - - - x - - - 1 - - - - - 8 - - - - - log - - - x - - - - - - - count up - - - log - - - - - 12345678 - - - - - log - - - - - - - - x - - - 8 - - - - - 1 - - - - - log - - - x - - - - - - - count down - - - log - - - - - 87654321 - - - - - loglist - - - - - - x - - - ADD - - - 1 - - - - - 0 - - - - - - - ADD - - - 4 - - - - - 0 - - - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count up non-trivial - - - loglist - - - - - - - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - - - loglist - - - - - - x - - - ADD - - - 3 - - - - - 1 - - - - - - - ADD - - - 1 - - - - - 0 - - - - - - - - INSERT - LAST - - - loglist - - - - - x - - - - - - - count down non-trivial - - - loglist - - - - - - - - 4 - - - - - 3 - - - - - 2 - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/generators/loops3.xml b/tests/generators/loops3.xml deleted file mode 100644 index 6cd5e0c758..0000000000 --- a/tests/generators/loops3.xml +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - - - - - - - - - test continue - - - log - - - - - - - - count - - - 0 - - - - - WHILE - - - NEQ - - - count - - - - - 8 - - - - - - - count - - - 1 - - - - - - - EQ - - - count - - - - - 5 - - - - - - - CONTINUE - - - - - log - - - count - - - - - - - - - - - while continue - - - log - - - - - 1234678 - - - - - log - - - - - - - - count - - - 0 - - - - - UNTIL - - - EQ - - - count - - - - - 8 - - - - - - - count - - - 1 - - - - - - - EQ - - - count - - - - - 5 - - - - - - - CONTINUE - - - - - log - - - count - - - - - - - - - - - until continue - - - log - - - - - 1234678 - - - - - log - - - - - - - - x - - - 1 - - - - - 8 - - - - - - - EQ - - - x - - - - - 5 - - - - - - - CONTINUE - - - - - log - - - x - - - - - - - - - count continue - - - log - - - - - 1234678 - - - - - log - - - - - - - - x - - - - - - a - - - - - b - - - - - c - - - - - d - - - - - - - - - EQ - - - x - - - - - c - - - - - - - CONTINUE - - - - - log - - - x - - - - - - - - - for continue - - - log - - - - - abd - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test break - - - count - - - 1 - - - - - WHILE - - - NEQ - - - count - - - - - 10 - - - - - - - - - EQ - - - count - - - - - 5 - - - - - - - BREAK - - - - - count - - - 1 - - - - - - - - - while break - - - count - - - - - 5 - - - - - count - - - 1 - - - - - UNTIL - - - EQ - - - count - - - - - 10 - - - - - - - - - EQ - - - count - - - - - 5 - - - - - - - BREAK - - - - - count - - - 1 - - - - - - - - - until break - - - count - - - - - 5 - - - - - log - - - - - - - - x - - - 1 - - - - - 8 - - - - - - - EQ - - - x - - - - - 5 - - - - - - - BREAK - - - - - log - - - x - - - - - - - - - count break - - - log - - - - - 1234 - - - - - log - - - - - - - - x - - - - - - a - - - - - b - - - - - c - - - - - d - - - - - - - - - EQ - - - x - - - - - c - - - - - - - BREAK - - - - - log - - - x - - - - - - - - - for break - - - log - - - - - ab - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/generators/math.xml b/tests/generators/math.xml deleted file mode 100644 index 38b28c3b53..0000000000 --- a/tests/generators/math.xml +++ /dev/null @@ -1,1591 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test operations on single - - - sqrt - - - ROOT - - - 25 - - - - - - - 5 - - - - - abs - - - ABS - - - -25 - - - - - - - 25 - - - - - negate - - - NEG - - - -25 - - - - - - - 25 - - - - - ln - - - LN - - - 1 - - - - - - - 0 - - - - - log10 - - - LOG10 - - - 100 - - - - - - - 2 - - - - - exp - - - EXP - - - 2 - - - - - - - 7.38905609893065 - - - - - power10 - - - POW10 - - - 2 - - - - - - - 100 - - - - - - - - - - - - - - - - - - - test arithmetic - - - add - - - ADD - - - 1 - - - - - 2 - - - - - - - 3 - - - - - subtract - - - MINUS - - - 1 - - - - - 2 - - - - - - - -1 - - - - - multiply - - - MULTIPLY - - - 4 - - - - - 2.5 - - - - - - - 10 - - - - - divide - - - DIVIDE - - - 8.2 - - - - - -5 - - - - - - - -1.64 - - - - - power - - - POWER - - - 10 - - - - - 4 - - - - - - - 10000 - - - - - - - - - - - - - - - test trig - - - sin - - - SIN - - - 90 - - - - - - - 1 - - - - - cos - - - COS - - - 180 - - - - - - - -1 - - - - - tan - - - TAN - - - 0 - - - - - - - 0 - - - - - asin - - - ASIN - - - -1 - - - - - - - -90 - - - - - acos - - - ACOS - - - 1 - - - - - - - 0 - - - - - atan - - - ATAN - - - 1 - - - - - - - 45 - - - - - - - - - - - - - - - - - test constant - - - const pi - - - ROUNDDOWN - - - MULTIPLY - - - PI - - - - - 1000 - - - - - - - - - 3141 - - - - - const e - - - ROUNDDOWN - - - MULTIPLY - - - E - - - - - 1000 - - - - - - - - - 2718 - - - - - const golden - - - ROUNDDOWN - - - MULTIPLY - - - GOLDEN_RATIO - - - - - 1000 - - - - - - - - - 1618 - - - - - const sqrt 2 - - - ROUNDDOWN - - - MULTIPLY - - - SQRT2 - - - - - 1000 - - - - - - - - - 1414 - - - - - const sqrt 0.5 - - - ROUNDDOWN - - - MULTIPLY - - - SQRT1_2 - - - - - 1000 - - - - - - - - - 707 - - - - - const infinity - TRUE - - - LT - - - 9999 - - - - - INFINITY - - - - - - - - - - - - - - - - - - - test number properties - - - even - TRUE - - - - EVEN - - - 42 - - - - - - - odd - FALSE - - - - ODD - - - 42.1 - - - - - - - prime 5 - TRUE - - - - PRIME - - - 5 - - - - - - - prime 25 - FALSE - - - - PRIME - - - 25 - - - - - - - prime negative - FALSE - - - - PRIME - - - -31.1 - - - - - - - whole - FALSE - - - - WHOLE - - - PI - - - - - - - positive - TRUE - - - - POSITIVE - - - INFINITY - - - - - - - negative - TRUE - - - - NEGATIVE - - - -42 - - - - - - - divisible - TRUE - - - - DIVISIBLE_BY - - - 42 - - - - - 2 - - - - - - - - - - - - - - - - - - - - - - - - - test round - - - round - - - ROUND - - - 42.42 - - - - - - - 42 - - - - - round up - - - ROUNDUP - - - -42.42 - - - - - - - -42 - - - - - round down - - - ROUNDDOWN - - - 42.42 - - - - - - - 42 - - - - - - - - - - - test change - - - varToChange - - - 100 - - - - - varToChange - - - 42 - - - - - change - - - varToChange - - - - - 142 - - - - - - - - - - - - - - - assert list equal - - - equal - - - TRUE - - - - - - - - NEQ - - - - - a - - - - - - - - - b - - - - - - - - - equal - - - FALSE - - - - - - - x - - - 1 - - - - - - - a - - - - - - - - - NEQ - - - - GET - FROM_START - - - a - - - - - x - - - - - - - - GET - FROM_START - - - b - - - - - x - - - - - - - - - equal - - - FALSE - - - - - BREAK - - - - - - - - - - - - - - - equal - - - - - - - list equality - - - a - - - - - b - - - - - - - - - - - - - equal - - - - - test operations on list - - - sum - - - - SUM - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - 12 - - - - - min - - - - MIN - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - 3 - - - - - max - - - - MAX - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - 5 - - - - - average - - - - AVERAGE - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - 4 - - - - - median - - - - MEDIAN - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 1 - - - - - - - - - 3.5 - - - - - modes - TRUE - - - - - - - - - - MODE - - - - - - 3 - - - - - 4 - - - - - 3 - - - - - - - - - - - - 3 - - - - - - - - - standard dev - - - - STD_DEV - - - - - - 3 - - - - - 3 - - - - - 3 - - - - - - - - - 0 - - - - - random - TRUE - - - GT - - - FIRST - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - RANDOM - - - - - - 3 - - - - - 4 - - - - - 5 - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - test mod - - - mod - - - - - 42 - - - - - 5 - - - - - - - 2 - - - - - - - test constraint - - - constraint - - - - - 100 - - - - - 0 - - - - - 42 - - - - - - - 42 - - - - - - - test random integer - - - rand - - - - - 5 - - - - - 10 - - - - - - - randRange - TRUE - - - AND - - - GTE - - - rand - - - - - 5 - - - - - - - LTE - - - rand - - - - - 10 - - - - - - - - - randInteger - TRUE - - - - WHOLE - - - rand - - - - - - - - - - - - - test random fraction - - - rand - - - - - - randFloat - TRUE - - - AND - - - GTE - - - rand - - - - - 0 - - - - - - - LTE - - - rand - - - - - 1 - - - - - - - - - - - - diff --git a/tests/generators/text.xml b/tests/generators/text.xml deleted file mode 100644 index 39a5879a9f..0000000000 --- a/tests/generators/text.xml +++ /dev/null @@ -1,707 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - test length - - - length - - - - - Google - - - - - - - 6 - - - - - length - - - - - - - - - - - - 0 - - - - - - - - - test empty - - - not empty - FALSE - - - - - Google - - - - - - - empty - TRUE - - - - - - - - - - - - - - - - test create text - - - single text - - - - - - Hello - - - - - - - Hello - - - - - double text - - - - - - K - - - - - 9 - - - - - - - K9 - - - - - triple text - - - - - - 1 - - - - - 2 - - - - - 3 - - - - - - - 123 - - - - - - - - - - - test append item - - - item - - - Miserable - - - - - item - - - Failure - - - - - append text - - - item - - - - - MiserableFailure - - - - - item - - - 12 - - - - - item - - - 34 - - - - - append number - - - item - - - - - 1234 - - - - - - - - - - - - - - - - - test substring - - - text - - - 123456789 - - - - - substring # start - - - - FROM_START - FROM_START - - - text - - - - - 2 - - - - - 3 - - - - - - - 23 - - - - - substring # end - - - - FROM_END - FROM_END - - - text - - - - - 3 - - - - - 2 - - - - - - - 78 - - - - - substring first-last - - - - FIRST - LAST - - - text - - - - - - - text - - - - - - - - - - - - - test find - - - first find - - - FIRST - - - Banana - - - - - an - - - - - - - 2 - - - - - last find - - - LAST - - - Banana - - - - - an - - - - - - - 4 - - - - - no find - - - FIRST - - - Banana - - - - - Peel - - - - - - - 0 - - - - - - - - - - - test letter - - - letter # - - - - FROM_START - - - Blockly - - - - - 3 - - - - - - - o - - - - - letter # from end - - - - FROM_END - - - Blockly - - - - - 3 - - - - - - - k - - - - - first letter - - - - FIRST - - - Blockly - - - - - - - B - - - - - last letter - - - - LAST - - - Blockly - - - - - - - y - - - - - random letter - TRUE - - - - POSITIVE - - - FIRST - - - Blockly - - - - - - RANDOM - - - Blockly - - - - - - - - - - - - - - - - - - - - - test case - - - uppercase - - - UPPERCASE - - - Hello World - - - - - - - HELLO WORLD - - - - - lowercase - - - LOWERCASE - - - Hello World - - - - - - - hello world - - - - - titlecase - - - TITLECASE - - - heLLo WorlD - - - - - - - Hello World - - - - - - - - - - - test trim - - - trim both - - - BOTH - - - abc def - - - - - - - abc def - - - - - trim left - - - LEFT - - - abc def - - - - - - - abc def - - - - - trim right - - - RIGHT - - - abc def - - - - - - - abc def - - - - - - - - - - diff --git a/tests/generators/unittest.js b/tests/generators/unittest.js deleted file mode 100644 index 560e6b91fe..0000000000 --- a/tests/generators/unittest.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Unit test blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Blocks['unittest_main'] = { - // Container for unit tests. - init: function() { - this.setColour(65); - this.appendDummyInput() - .appendField('run tests'); - this.appendStatementInput('DO'); - this.setTooltip('Executes the enclosed unit tests,\n' + - 'then prints a summary.'); - }, - getVars: function() { - return ['unittestResults']; - } -}; - -Blockly.Blocks['unittest_assertequals'] = { - // Asserts that a value equals another value. - init: function() { - this.setColour(65); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.appendDummyInput() - .appendField(new Blockly.FieldTextInput('test name'), 'MESSAGE'); - this.appendValueInput('ACTUAL', null) - .appendField('actual'); - this.appendValueInput('EXPECTED', null) - .appendField('expected'); - this.setTooltip('Tests that "actual == expected".'); - }, - getVars: function() { - return ['unittestResults']; - } -}; - -Blockly.Blocks['unittest_assertvalue'] = { - // Asserts that a value is true, false, or null. - init: function() { - this.setColour(65); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.appendDummyInput() - .appendField(new Blockly.FieldTextInput('test name'), 'MESSAGE'); - this.appendValueInput('ACTUAL', Boolean) - .appendField('assert') - .appendField(new Blockly.FieldDropdown( - [['true', 'TRUE'], ['false', 'FALSE'], ['null', 'NULL']]), 'EXPECTED'); - this.setTooltip('Tests that the value is true, false, or null.'); - }, - getVars: function() { - return ['unittestResults']; - } -}; - -Blockly.Blocks['unittest_fail'] = { - // Always assert an error. - init: function() { - this.setColour(65); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.appendDummyInput() - .appendField(new Blockly.FieldTextInput('test name'), 'MESSAGE') - .appendField('fail'); - this.setTooltip('Records an error.'); - }, - getVars: function() { - return ['unittestResults']; - } -}; diff --git a/tests/generators/unittest_dart.js b/tests/generators/unittest_dart.js deleted file mode 100644 index 280595fc3c..0000000000 --- a/tests/generators/unittest_dart.js +++ /dev/null @@ -1,156 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2014 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 Generating Dart for unit test blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Dart['unittest_main'] = function(block) { - // Container for unit tests. - var resultsVar = Blockly.Dart.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.Dart.provideFunction_( - 'unittest_report', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' // Create test report.', - ' List report = [];', - ' StringBuffer summary = new StringBuffer();', - ' int fails = 0;', - ' for (int x = 0; x < ' + resultsVar + '.length; x++) {', - ' if (' + resultsVar + '[x][0]) {', - ' summary.write(".");', - ' } else {', - ' summary.write("F");', - ' fails++;', - ' report.add("");', - ' report.add("FAIL: ${' + resultsVar + '[x][2]}");', - ' report.add(' + resultsVar + '[x][1]);', - ' }', - ' }', - ' report.insert(0, summary.toString());', - ' report.add("");', - ' report.add("Ran ${' + resultsVar + '.length} tests.");', - ' report.add("");', - ' if (fails != 0) {', - ' report.add("FAILED (failures=$fails)");', - ' } else {', - ' report.add("OK");', - ' }', - ' return report.join("\\n");', - '}']); - // Setup global to hold test results. - var code = resultsVar + ' = [];\n'; - // Run tests (unindented). - code += Blockly.Dart.statementToCode(block, 'DO') - .replace(/^ /, '').replace(/\n /g, '\n'); - var reportVar = Blockly.Dart.variableDB_.getDistinctName( - 'report', Blockly.Variables.NAME_TYPE); - code += 'String ' + reportVar + ' = ' + functionName + '();\n'; - // Destroy results. - code += resultsVar + ' = null;\n'; - // Print the report to the console (that's where errors will go anyway). - code += 'print(' + reportVar + ');\n'; - return code; -}; - -Blockly.Dart['unittest_main'].defineAssert_ = function() { - var resultsVar = Blockly.Dart.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.Dart.provideFunction_( - 'unittest_assertequals', - [ 'void ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(dynamic actual, dynamic expected, String message) {', - ' // Asserts that a value equals another value.', - ' if (' + resultsVar + ' == null) {', - ' throw "Orphaned assert: ${message}";', - ' }', - ' bool equals(a, b) {', - ' if (a == b) {', - ' return true;', - ' } else if (a is List && b is List) {', - ' if (a.length != b.length) {', - ' return false;', - ' }', - ' for (num i = 0; i < a.length; i++) {', - ' if (!equals(a[i], b[i])) {', - ' return false;', - ' }', - ' }', - ' return true;', - ' }', - ' return false;', - ' }', - ' if (equals(actual, expected)) {', - ' ' + resultsVar + '.add([true, "OK", message]);', - ' } else {', - ' ' + resultsVar + '.add([false, ' + - '"Expected: $expected\\nActual: $actual", message]);', - ' }', - '}']); - return functionName; -}; - -Blockly.Dart['unittest_assertequals'] = function(block) { - // Asserts that a value equals another value. - var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.Dart.valueToCode(block, 'ACTUAL', - Blockly.Dart.ORDER_NONE) || 'null'; - var expected = Blockly.Dart.valueToCode(block, 'EXPECTED', - Blockly.Dart.ORDER_NONE) || 'null'; - return Blockly.Dart['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.Dart['unittest_assertvalue'] = function(block) { - // Asserts that a value is true, false, or null. - var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.Dart.valueToCode(block, 'ACTUAL', - Blockly.Dart.ORDER_NONE) || 'null'; - var expected = block.getFieldValue('EXPECTED'); - if (expected == 'TRUE') { - expected = 'true'; - } else if (expected == 'FALSE') { - expected = 'false'; - } else if (expected == 'NULL') { - expected = 'null'; - } - return Blockly.Dart['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.Dart['unittest_fail'] = function(block) { - // Always assert an error. - var resultsVar = Blockly.Dart.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.Dart.provideFunction_( - 'unittest_fail', - [ 'void ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + - '(String message) {', - ' // Always assert an error.', - ' if (' + resultsVar + ' == null) {', - ' throw "Orphaned assert fail: ${message}";', - ' }', - ' ' + resultsVar + '.add([false, "Fail.", message]);', - '}']); - return functionName + '(' + message + ');\n'; -}; diff --git a/tests/generators/unittest_javascript.js b/tests/generators/unittest_javascript.js deleted file mode 100644 index ed5415c0be..0000000000 --- a/tests/generators/unittest_javascript.js +++ /dev/null @@ -1,160 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating JavaScript for unit test blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.JavaScript['unittest_main'] = function(block) { - // Container for unit tests. - var resultsVar = Blockly.JavaScript.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.JavaScript.provideFunction_( - 'unittest_report', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '() {', - ' // Create test report.', - ' var report = [];', - ' var summary = [];', - ' var fails = 0;', - ' for (var x = 0; x < ' + resultsVar + '.length; x++) {', - ' if (' + resultsVar + '[x][0]) {', - ' summary.push(".");', - ' } else {', - ' summary.push("F");', - ' fails++;', - ' report.push("");', - ' report.push("FAIL: " + ' + resultsVar + '[x][2]);', - ' report.push(' + resultsVar + '[x][1]);', - ' }', - ' }', - ' report.unshift(summary.join(""));', - ' report.push("");', - ' report.push("Number of tests run: " + ' + resultsVar + - '.length);', - ' report.push("");', - ' if (fails) {', - ' report.push("FAILED (failures=" + fails + ")");', - ' } else {', - ' report.push("OK");', - ' }', - ' return report.join("\\n");', - '}']); - // Setup global to hold test results. - var code = resultsVar + ' = [];\n'; - // Run tests (unindented). - code += Blockly.JavaScript.statementToCode(block, 'DO') - .replace(/^ /, '').replace(/\n /g, '\n'); - var reportVar = Blockly.JavaScript.variableDB_.getDistinctName( - 'report', Blockly.Variables.NAME_TYPE); - code += 'var ' + reportVar + ' = ' + functionName + '();\n'; - // Destroy results. - code += resultsVar + ' = null;\n'; - // Send the report to the console (that's where errors will go anyway). - code += 'console.log(' + reportVar + ');\n'; - return code; -}; - -Blockly.JavaScript['unittest_main'].defineAssert_ = function(block) { - var resultsVar = Blockly.JavaScript.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.JavaScript.provideFunction_( - 'assertEquals', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(actual, expected, message) {', - ' // Asserts that a value equals another value.', - ' if (!' + resultsVar + ') {', - ' throw "Orphaned assert: " + message;', - ' }', - ' function equals(a, b) {', - ' if (a === b) {', - ' return true;', - ' } else if ((typeof a == "number") && (typeof b == "number") &&', - ' (a.toPrecision(15) == b.toPrecision(15))) {', - ' return true;', - ' } else if (a instanceof Array && b instanceof Array) {', - ' if (a.length != b.length) {', - ' return false;', - ' }', - ' for (var i = 0; i < a.length; i++) {', - ' if (!equals(a[i], b[i])) {', - ' return false;', - ' }', - ' }', - ' return true;', - ' }', - ' return false;', - ' }', - ' if (equals(actual, expected)) {', - ' ' + resultsVar + '.push([true, "OK", message]);', - ' } else {', - ' ' + resultsVar + '.push([false, ' + - '"Expected: " + expected + "\\nActual: " + actual, message]);', - ' }', - '}']); - return functionName; -}; - -Blockly.JavaScript['unittest_assertequals'] = function(block) { - // Asserts that a value equals another value. - var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.JavaScript.valueToCode(block, 'ACTUAL', - Blockly.JavaScript.ORDER_COMMA) || 'null'; - var expected = Blockly.JavaScript.valueToCode(block, 'EXPECTED', - Blockly.JavaScript.ORDER_COMMA) || 'null'; - return Blockly.JavaScript['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.JavaScript['unittest_assertvalue'] = function(block) { - // Asserts that a value is true, false, or null. - var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.JavaScript.valueToCode(block, 'ACTUAL', - Blockly.JavaScript.ORDER_COMMA) || 'null'; - var expected = block.getFieldValue('EXPECTED'); - if (expected == 'TRUE') { - expected = 'true'; - } else if (expected == 'FALSE') { - expected = 'false'; - } else if (expected == 'NULL') { - expected = 'null'; - } - return Blockly.JavaScript['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.JavaScript['unittest_fail'] = function(block) { - // Always assert an error. - var resultsVar = Blockly.JavaScript.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.JavaScript.provideFunction_( - 'unittest_fail', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + - '(message) {', - ' // Always assert an error.', - ' if (!' + resultsVar + ') {', - ' throw "Orphaned assert fail: " + message;', - ' }', - ' ' + resultsVar + '.push([false, "Fail.", message]);', - '}']); - return functionName + '(' + message + ');\n'; -}; diff --git a/tests/generators/unittest_php.js b/tests/generators/unittest_php.js deleted file mode 100644 index 429831ae97..0000000000 --- a/tests/generators/unittest_php.js +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2015 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 Generating PHP for unit test blocks. - * @author daarond@gmail.com (Daaron Dwyer) - */ -'use strict'; - -Blockly.PHP['unittest_main'] = function(block) { - // Container for unit tests. - var resultsVar = Blockly.PHP.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.PHP.provideFunction_( - 'unittest_report', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '() {', - 'global ' + resultsVar + ';', - ' // Create test report.', - ' $report = array();', - ' $summary = array();', - ' $fails = 0;', - ' for ($x = 0; $x < count(' + resultsVar + '); $x++) {', - ' if (' + resultsVar + '[$x][0]) {', - ' array_push($summary, ".");', - ' } else {', - ' array_push($summary, "F");', - ' $fails++;', - ' array_push($report,"");', - ' array_push($report, "FAIL: " . ' + resultsVar + '[$x][2]);', - ' array_push($report, ' + resultsVar + '[$x][1]);', - ' }', - ' }', - ' array_unshift($report, implode("",$summary));', - ' array_push($report, "");', - ' array_push($report, "Number of tests run: " . count(' + resultsVar + '));', - ' array_push($report, "");', - ' if ($fails) {', - ' array_push($report, "FAILED (failures=" . $fails + ")");', - ' } else {', - ' array_push($report, "OK");', - ' }', - ' return implode("\\n", $report);', - '}']); - // Setup global to hold test results. - var code = resultsVar + ' = array();\n'; - // Run tests (unindented). - code += Blockly.PHP.statementToCode(block, 'DO') - .replace(/^ /, '').replace(/\n /g, '\n'); - var reportVar = Blockly.PHP.variableDB_.getDistinctName( - 'report', Blockly.Variables.NAME_TYPE); - code += reportVar + ' = ' + functionName + '();\n'; - // Destroy results. - code += resultsVar + ' = null;\n'; - // Send the report to the console (that's where errors will go anyway). - code += 'print(' + reportVar + ');\n'; - return code; -}; - -Blockly.PHP['unittest_main'].defineAssert_ = function(block) { - var resultsVar = Blockly.PHP.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.PHP.provideFunction_( - 'assertEquals', - [ ' function equals($a, $b) {', - ' if ($a === $b) {', - ' return true;', - ' } else if ((is_numeric($a)) && (is_numeric($b)) &&', - ' (round($a,15) == round($b,15))) {', - ' return true;', - ' } else if (is_array($a) && is_array($b)) {', - ' if (count($a) != count($b)) {', - ' return false;', - ' }', - ' for ($i = 0; $i < count($a); $i++) {', - ' if (!equals($a[$i], $b[$i])) {', - ' return false;', - ' }', - ' }', - ' return true;', - ' }', - ' return false;', - ' }', - 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($actual, $expected, $message) {', - 'global ' + resultsVar + ';', - ' // Asserts that a value equals another value.', - ' if (!is_array(' + resultsVar + ')) {', - ' throw new Exception("Orphaned assert: " . $message);', - ' }', - ' if (equals($actual, $expected)) {', - ' array_push(' + resultsVar + ', [true, "OK", $message]);', - ' } else {', - ' array_push(' + resultsVar + ', [false, ' + - '"Expected: " . $expected . "\\nActual: " . $actual, $message]);', - ' }', - '}']); - return functionName; -}; - -Blockly.PHP['unittest_assertequals'] = function(block) { - // Asserts that a value equals another value. - var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.PHP.valueToCode(block, 'ACTUAL', - Blockly.PHP.ORDER_COMMA) || 'null'; - var expected = Blockly.PHP.valueToCode(block, 'EXPECTED', - Blockly.PHP.ORDER_COMMA) || 'null'; - return Blockly.PHP['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.PHP['unittest_assertvalue'] = function(block) { - // Asserts that a value is true, false, or null. - var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.PHP.valueToCode(block, 'ACTUAL', - Blockly.PHP.ORDER_COMMA) || 'null'; - var expected = block.getFieldValue('EXPECTED'); - if (expected == 'TRUE') { - expected = 'true'; - } else if (expected == 'FALSE') { - expected = 'false'; - } else if (expected == 'NULL') { - expected = 'null'; - } - return Blockly.PHP['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ');\n'; -}; - -Blockly.PHP['unittest_fail'] = function(block) { - // Always assert an error. - var resultsVar = Blockly.PHP.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.PHP.provideFunction_( - 'unittest_fail', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + - '($message) {', - 'global ' + resultsVar + ';', - ' // Always assert an error.', - ' if (!' + resultsVar + ') {', - ' throw new Exception("Orphaned assert fail: " . $message);', - ' }', - ' array_push(' + resultsVar + ', [false, "Fail.", $message]);', - '}']); - return functionName + '(' + message + ');\n'; -}; diff --git a/tests/generators/unittest_python.js b/tests/generators/unittest_python.js deleted file mode 100644 index fc64d6efc8..0000000000 --- a/tests/generators/unittest_python.js +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * 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 Generating Python for unit test blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -Blockly.Python['unittest_main'] = function(block) { - // Container for unit tests. - var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.Python.provideFunction_( - 'unittest_report', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '():', - ' # Create test report.', - ' report = []', - ' summary = []', - ' fails = 0', - ' for (success, log, message) in ' + resultsVar + ':', - ' if success:', - ' summary.append(".")', - ' else:', - ' summary.append("F")', - ' fails += 1', - ' report.append("")', - ' report.append("FAIL: " + message)', - ' report.append(log)', - ' report.insert(0, "".join(summary))', - ' report.append("")', - ' report.append("Number of tests run: %d" % len(' + resultsVar + '))', - ' report.append("")', - ' if fails:', - ' report.append("FAILED (failures=%d)" % fails)', - ' else:', - ' report.append("OK")', - ' return "\\n".join(report)']); - - // Setup global to hold test results. - var code = resultsVar + ' = []\n'; - // Run tests (unindented). - code += Blockly.Python.statementToCode(block, 'DO') - .replace(/^ /, '').replace(/\n /g, '\n'); - var reportVar = Blockly.Python.variableDB_.getDistinctName( - 'report', Blockly.Variables.NAME_TYPE); - code += reportVar + ' = ' + functionName + '()\n'; - // Destroy results. - code += resultsVar + ' = None\n'; - // Print the report. - code += 'print(' + reportVar + ')\n'; - return code; -}; - -Blockly.Python['unittest_main'].defineAssert_ = function() { - var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var functionName = Blockly.Python.provideFunction_( - 'assertEquals', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + - '(actual, expected, message):', - ' # Asserts that a value equals another value.', - ' if ' + resultsVar + ' == None:', - ' raise Exception("Orphaned assert equals: " + message)', - ' if actual == expected:', - ' ' + resultsVar + '.append((True, "OK", message))', - ' else:', - ' ' + resultsVar + '.append((False, ' + - '"Expected: %s\\nActual: %s" % (expected, actual), message))']); - return functionName; -}; - -Blockly.Python['unittest_assertequals'] = function(block) { - // Asserts that a value equals another value. - var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.Python.valueToCode(block, 'ACTUAL', - Blockly.Python.ORDER_NONE) || 'None'; - var expected = Blockly.Python.valueToCode(block, 'EXPECTED', - Blockly.Python.ORDER_NONE) || 'None'; - return Blockly.Python['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ')\n'; -}; - -Blockly.Python['unittest_assertvalue'] = function(block) { - // Asserts that a value is true, false, or null. - var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE')); - var actual = Blockly.Python.valueToCode(block, 'ACTUAL', - Blockly.Python.ORDER_NONE) || 'None'; - var expected = block.getFieldValue('EXPECTED'); - if (expected == 'TRUE') { - expected = 'True'; - } else if (expected == 'FALSE') { - expected = 'False'; - } else if (expected == 'NULL') { - expected = 'None'; - } - return Blockly.Python['unittest_main'].defineAssert_() + - '(' + actual + ', ' + expected + ', ' + message + ')\n'; -}; - -Blockly.Python['unittest_fail'] = function(block) { - // Always assert an error. - var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', - Blockly.Variables.NAME_TYPE); - var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.Python.provideFunction_( - 'fail', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(message):', - ' # Always assert an error.', - ' if ' + resultsVar + ' == None:', - ' raise Exception("Orphaned assert equals: " + message)', - ' ' + resultsVar + '.append((False, "Fail.", message))']); - return functionName + '(' + message + ')\n'; -}; diff --git a/tests/generators/variables.xml b/tests/generators/variables.xml deleted file mode 100644 index dfb77e5397..0000000000 --- a/tests/generators/variables.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - item - - - 123 - - - - - variable - - - item - - - - - 123 - - - - - if - - - 123 - - - - - reserved variable - - - if - - - - - 123 - - - - - - - - - - - - diff --git a/tests/horizontal_playground.html b/tests/horizontal_playground.html new file mode 100644 index 0000000000..d7d58f8557 --- /dev/null +++ b/tests/horizontal_playground.html @@ -0,0 +1,410 @@ + + + + + + + Horizontal Playground + + + + + + + + + + + + + + +
    +
    + + + + + +

    Horizontal Blocks

    +

    + Show + - Hide +

    + + + +

    + +   + +
    + +

    + +

    + Log events:   + +

    + +

    + Log flyout events:   + +

    + +

    + Enable sounds (after refresh):   + +

    + +

    + Stress test:   + + +

    + +

    + Glows:   + + + + +

    + +

    + + +

    + + diff --git a/tests/jsunit/block_test.js b/tests/jsunit/block_test.js deleted file mode 100644 index de4f36ffdf..0000000000 --- a/tests/jsunit/block_test.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2015 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. - */ -'use strict'; - -function test_getBlockById() { - var workspace = new Blockly.Workspace(); - var blockA = workspace.newBlock(''); - var blockB = workspace.newBlock(''); - assertEquals('Find blockA.', blockA, Blockly.Block.getById(blockA.id)); - assertEquals('Find blockB.', blockB, Blockly.Block.getById(blockB.id)); - assertEquals('No block found.', null, - Blockly.Block.getById('I do not exist.')); - blockA.dispose(); - assertEquals('Can\'t find blockA.', null, Blockly.Block.getById(blockA.id)); - assertEquals('BlockB exists.', blockB, Blockly.Block.getById(blockB.id)); - workspace.clear(); - assertEquals('Can\'t find blockB.', null, Blockly.Block.getById(blockB.id)); -} diff --git a/tests/jsunit/connection_db_test.js b/tests/jsunit/connection_db_test.js new file mode 100644 index 0000000000..010cfcbebf --- /dev/null +++ b/tests/jsunit/connection_db_test.js @@ -0,0 +1,309 @@ +/** + * @license + * Blockly Tests + * + * Copyright 2015 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. + */ +'use strict'; + +function verify_DB_(msg, expected, db) { + var equal = (expected.length == db.length); + if (equal) { + for (var x = 0; x < expected.length; x++) { + if (expected[x] != db[x]) { + equal = false; + break; + } + } + } + if (equal) { + assertTrue(msg, true); + } else { + assertEquals(msg, expected, db); + } +} + +function test_DB_addConnection() { + var db = new Blockly.ConnectionDB(); + var o2 = {y_: 2, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + db.addConnection(o2); + verify_DB_('Adding connection #2', [o2], db); + + var o4 = {y_: 4, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + db.addConnection(o4); + verify_DB_('Adding connection #4', [o2, o4], db); + + var o1 = {y_: 1, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + db.addConnection(o1); + verify_DB_('Adding connection #1', [o1, o2, o4], db); + + var o3a = {y_: 3, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + db.addConnection(o3a); + verify_DB_('Adding connection #3a', [o1, o2, o3a, o4], db); + + var o3b = {y_: 3, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + db.addConnection(o3b); + verify_DB_('Adding connection #3b', [o1, o2, o3b, o3a, o4], db); +} + +function test_DB_removeConnection() { + var db = new Blockly.ConnectionDB(); + var o1 = {y_: 1, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + var o2 = {y_: 2, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + var o3a = {y_: 3, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + var o3b = {y_: 3, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + var o3c = {y_: 3, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + var o4 = {y_: 4, sourceBlock_: {}, + getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; + db.addConnection(o1); + db.addConnection(o2); + db.addConnection(o3c); + db.addConnection(o3b); + db.addConnection(o3a); + db.addConnection(o4); + verify_DB_('Adding connections 1-4', [o1, o2, o3a, o3b, o3c, o4], db); + + db.removeConnection_(o2); + verify_DB_('Removing connection #2', [o1, o3a, o3b, o3c, o4], db); + + db.removeConnection_(o4); + verify_DB_('Removing connection #4', [o1, o3a, o3b, o3c], db); + + db.removeConnection_(o1); + verify_DB_('Removing connection #1', [o3a, o3b, o3c], db); + + db.removeConnection_(o3a); + verify_DB_('Removing connection #3a', [o3b, o3c], db); + + db.removeConnection_(o3c); + verify_DB_('Removing connection #3c', [o3b], db); + + db.removeConnection_(o3b); + verify_DB_('Removing connection #3b', [], db); +} + +function test_DB_getNeighbours() { + var db = new Blockly.ConnectionDB(); + + // Search an empty list. + assertEquals(helper_getNeighbours(db, + 10 /* x */, 10 /* y */, 100 /* radius */).length, 0); + + // Set up some connections. + for (var i = 0; i < 10; i++) { + db.addConnection(helper_createConnection(0, i, + Blockly.PREVIOUS_STATEMENT, null, true)); + } + + // Test block belongs at beginning. + var result = helper_getNeighbours(db, 0, 0, 4); + assertEquals(5, result.length); + for (i = 0; i < result.length; i++) { + assertNotEquals(result.indexOf(db[i]), -1); // contains + } + + // Test block belongs at middle. + result = helper_getNeighbours(db, 0, 4, 2); + assertEquals(5, result.length); + for (i = 0; i < result.length; i++) { + assertNotEquals(result.indexOf(db[i + 2]), -1); // contains + } + + // Test block belongs at end. + result = helper_getNeighbours(db, 0, 9, 4); + assertEquals(5, result.length); + for (i = 0; i < result.length; i++) { + assertNotEquals(result.indexOf(db[i + 5]), -1); // contains + } + + // Test block has no neighbours due to being out of range in the x direction. + result = helper_getNeighbours(db, 10, 9, 4); + assertEquals(result.length, 0); + + // Test block has no neighbours due to being out of range in the y direction. + result = helper_getNeighbours(db, 0, 19, 4); + assertEquals(result.length, 0); + + // Test block has no neighbours due to being out of range diagonally. + result = helper_getNeighbours(db, -2, -2, 2); + assertEquals(result.length, 0); +} + +function test_DB_findPositionForConnection() { + var db = new Blockly.ConnectionDB(); + db.addConnection(helper_createConnection(0, 0, Blockly.PREVIOUS_STATEMENT, + null, true)); + db.addConnection(helper_createConnection(0, 1, Blockly.PREVIOUS_STATEMENT, + null, true)); + db.addConnection(helper_createConnection(0, 2, Blockly.PREVIOUS_STATEMENT, + null, true)); + db.addConnection(helper_createConnection(0, 4, Blockly.PREVIOUS_STATEMENT, + null, true)); + db.addConnection(helper_createConnection(0, 5, Blockly.PREVIOUS_STATEMENT, + null, true)); + + assertEquals(5, db.length); + var conn = helper_createConnection(0, 3, Blockly.PREVIOUS_STATEMENT, null, + true); + assertEquals(3, db.findPositionForConnection_(conn)); +} + +function test_DB_findConnection() { + var db = new Blockly.ConnectionDB(); + for (var i = 0; i < 10; i++) { + db.addConnection(helper_createConnection(i, 0, + Blockly.PREVIOUS_STATEMENT, null, true)); + db.addConnection(helper_createConnection(0, i, + Blockly.PREVIOUS_STATEMENT, null, true)); + } + + var conn = helper_createConnection(3, 3, Blockly.PREVIOUS_STATEMENT, null, + true); + db.addConnection(conn); + assertEquals(conn, db[db.findConnection(conn)]); + + conn = helper_createConnection(3, 3, Blockly.PREVIOUS_STATEMENT, null, true); + assertEquals(-1, db.findConnection(conn)); +} + +function test_DB_ordering() { + var db = new Blockly.ConnectionDB(); + for (var i = 0; i < 10; i++) { + db.addConnection(helper_createConnection(0, 9 - i, + Blockly.PREVIOUS_STATEMENT), null, true); + } + + for (i = 0; i < 10; i++) { + assertEquals(i, db[i].y_); + } + + // quasi-random + var xCoords = [-29, -47, -77, 2, 43, 34, -59, -52, -90, -36, -91, 38, 87, -20, + 60, 4, -57, 65, -37, -81, 57, 58, -96, 1, 67, -79, 34, 93, -90, -99, -62, + 4, 11, -36, -51, -72, 3, -50, -24, -45, -92, -38, 37, 24, -47, -73, 79, + -20, 99, 43, -10, -87, 19, 35, -62, -36, 49, 86, -24, -47, -89, 33, -44, + 25, -73, -91, 85, 6, 0, 89, -94, 36, -35, 84, -9, 96, -21, 52, 10, -95, 7, + -67, -70, 62, 9, -40, -95, -9, -94, 55, 57, -96, 55, 8, -48, -57, -87, 81, + 23, 65]; + var yCoords = [-81, 82, 5, 47, 30, 57, -12, 28, 38, 92, -25, -20, 23, -51, 73, + -90, 8, 28, -51, -15, 81, -60, -6, -16, 77, -62, -42, -24, 35, 95, -46, + -7, 61, -16, 14, 91, 57, -38, 27, -39, 92, 47, -98, 11, -33, -72, 64, 38, + -64, -88, -35, -59, -76, -94, 45, -25, -100, -95, 63, -97, 45, 98, 99, 34, + 27, 52, -18, -45, 66, -32, -38, 70, -73, -23, 5, -2, -13, -9, 48, 74, -97, + -11, 35, -79, -16, -77, 83, -57, -53, 35, -44, 100, -27, -15, 5, 39, 33, + -19, -20, -95]; + for (i = 0; i < xCoords.length; i++) { + db.addConnection(helper_createConnection(xCoords[i], yCoords[i], + Blockly.PREVIOUS_STATEMENT), null, true); + } + + for (i = 1; i < xCoords.length; i++) { + assertTrue(db[i].y_ >= db[i - 1].y_); + } +} + +function test_SearchForClosest() { + var db = new Blockly.ConnectionDB(); + var sharedWorkspace = {id: "Shared workspace"}; + + // Search an empty list. + assertEquals(null, helper_searchDB(db, 10 /* x */, 10 /* y */, + 100 /* radius */)); + + db.addConnection(helper_createConnection(100, 0, Blockly.PREVIOUS_STATEMENT, + sharedWorkspace, true)); + assertEquals(null, helper_searchDB(db, 0, 0, 5, sharedWorkspace)); + + db = new Blockly.ConnectionDB(); + for (var i = 0; i < 10; i++) { + var tempConn = helper_createConnection(0, i, Blockly.PREVIOUS_STATEMENT, + sharedWorkspace, true); + tempConn.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + db.addConnection(tempConn); + } + + // Should be at 0, 9. + var last = db[db.length - 1]; + // Correct connection is last in db; many connections in radius. + assertEquals(last, helper_searchDB(db, 0, 10, 15, sharedWorkspace)); + // Nothing nearby. + assertEquals(null, helper_searchDB(db, 100, 100, 3, sharedWorkspace)); + // First in db, exact match. + assertEquals(db[0], helper_searchDB(db, 0, 0, 0, sharedWorkspace)); + + tempConn = helper_createConnection(6, 6, Blockly.PREVIOUS_STATEMENT, + sharedWorkspace, true); + tempConn.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + db.addConnection(tempConn); + tempConn = helper_createConnection(5, 5, Blockly.PREVIOUS_STATEMENT, + sharedWorkspace, true); + tempConn.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + db.addConnection(tempConn); + + var result = helper_searchDB(db, 4, 6, 3, sharedWorkspace); + assertEquals(5, result.x_); + assertEquals(5, result.y_); +} + + +function helper_getNeighbours(db, x, y, radius) { + return db.getNeighbours(helper_createConnection(x, y, Blockly.NEXT_STATEMENT, + null, true), + radius); +} + +function helper_searchDB(db, x, y, radius, shared_workspace) { + var tempConn = helper_createConnection(x, y, + Blockly.NEXT_STATEMENT, shared_workspace, true); + tempConn.sourceBlock_ = helper_makeSourceBlock(shared_workspace); + var closest = db.searchForClosest(tempConn, radius, {x: 0, y: 0}); + return closest.connection; +} + +function helper_makeSourceBlock(sharedWorkspace) { + return {workspace: sharedWorkspace, + parentBlock_: null, + getParent: function() { return null; }, + movable_: true, + isMovable: function() { return true; }, + isShadow: function() { return false; }, + isInsertionMarker: function() { return false; }, + getFirstStatementConnection: function() { return null; } + }; +} + +function helper_createConnection(x, y, type, opt_shared_workspace, + opt_rendered) { + var workspace = opt_shared_workspace ? opt_shared_workspace : {}; + if (opt_rendered) { + var conn = new Blockly.RenderedConnection({workspace: workspace}, type); + } else { + var conn = new Blockly.Connection({workspace: workspace}, type); + } + conn.x_ = x; + conn.y_ = y; + return conn; +} \ No newline at end of file diff --git a/tests/jsunit/connection_test.js b/tests/jsunit/connection_test.js index c7f897168a..f98f8802a1 100644 --- a/tests/jsunit/connection_test.js +++ b/tests/jsunit/connection_test.js @@ -2,7 +2,7 @@ * @license * Blockly Tests * - * Copyright 2015 Google Inc. + * Copyright 2016 Google Inc. * https://developers.google.com/blockly/ * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,79 +17,319 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +/** + * @fileoverview Tests for connection logic. + * @author fenichel@google.com (Rachel Fenichel) + */ 'use strict'; -function verify_DB_(msg, expected, db) { - var equal = (expected.length == db.length); - if (equal) { - for (var x = 0; x < expected.length; x++) { - if (expected[x] != db[x]) { - equal = false; - break; - } - } - } - if (equal) { - assertTrue(msg, true); - } else { - assertEquals(msg, expected, db); - } -} - -function test_DB_addConnection() { - var db = new Blockly.ConnectionDB(); - var o2 = {y_: 2, sourceBlock_: {}}; - db.addConnection_(o2); - verify_DB_('Adding connection #2', [o2], db); - - var o4 = {y_: 4, sourceBlock_: {}}; - db.addConnection_(o4); - verify_DB_('Adding connection #4', [o2, o4], db); - - var o1 = {y_: 1, sourceBlock_: {}}; - db.addConnection_(o1); - verify_DB_('Adding connection #1', [o1, o2, o4], db); - - var o3a = {y_: 3, sourceBlock_: {}}; - db.addConnection_(o3a); - verify_DB_('Adding connection #3a', [o1, o2, o3a, o4], db); - - var o3b = {y_: 3, sourceBlock_: {}}; - db.addConnection_(o3b); - verify_DB_('Adding connection #3b', [o1, o2, o3b, o3a, o4], db); -} - -function test_DB_removeConnection() { - var db = new Blockly.ConnectionDB(); - var o1 = {y_: 1, sourceBlock_: {}}; - var o2 = {y_: 2, sourceBlock_: {}}; - var o3a = {y_: 3, sourceBlock_: {}}; - var o3b = {y_: 3, sourceBlock_: {}}; - var o3c = {y_: 3, sourceBlock_: {}}; - var o4 = {y_: 4, sourceBlock_: {}}; - db.addConnection_(o1); - db.addConnection_(o2); - db.addConnection_(o3c); - db.addConnection_(o3b); - db.addConnection_(o3a); - db.addConnection_(o4); - verify_DB_('Adding connections 1-4', [o1, o2, o3a, o3b, o3c, o4], db); - - db.removeConnection_(o2); - verify_DB_('Removing connection #2', [o1, o3a, o3b, o3c, o4], db); - - db.removeConnection_(o4); - verify_DB_('Removing connection #4', [o1, o3a, o3b, o3c], db); - - db.removeConnection_(o1); - verify_DB_('Removing connection #1', [o3a, o3b, o3c], db); - - db.removeConnection_(o3a); - verify_DB_('Removing connection #3a', [o3b, o3c], db); - - db.removeConnection_(o3c); - verify_DB_('Removing connection #3c', [o3b], db); - - db.removeConnection_(o3b); - verify_DB_('Removing connection #3b', [], db); +var input; +var output; +var previous; +var next; + +var dummyWorkspace; + +function connectionTest_setUp() { + dummyWorkspace = {}; + input = new Blockly.Connection({workspace: dummyWorkspace}, + Blockly.INPUT_VALUE); + output = new Blockly.Connection({workspace: dummyWorkspace}, + Blockly.OUTPUT_VALUE); + previous = new Blockly.Connection({workspace: dummyWorkspace}, + Blockly.PREVIOUS_STATEMENT); + next = new Blockly.Connection({workspace: dummyWorkspace}, + Blockly.NEXT_STATEMENT); +} + +function connectionTest_tearDown() { + input = null; + output = null; + previous = null; + next = null; + dummyWorkspace = null; +} + +var isMovableFn = function() { return true; }; +/** + * These tests check that the reasons for failures to connect are consistent + * (internal view of error states). + */ +function testCanConnectWithReason_TargetNull() { + connectionTest_setUp(); + + assertEquals(Blockly.Connection.REASON_TARGET_NULL, + input.canConnectWithReason_(null)); + + connectionTest_tearDown(); +} + +function testCanConnectWithReason_Disconnect() { + connectionTest_setUp(); + + var tempConnection = new Blockly.Connection({workspace: dummyWorkspace, isMovable: isMovableFn}, + Blockly.OUTPUT_VALUE); + Blockly.Connection.connectReciprocally_(input, tempConnection); + assertEquals(Blockly.Connection.CAN_CONNECT, + input.canConnectWithReason_(output)); + + connectionTest_tearDown(); +} + +function testCanConnectWithReason_DifferentWorkspaces() { + connectionTest_setUp(); + + input = new Blockly.Connection({workspace: {}}, Blockly.INPUT_VALUE); + output = new Blockly.Connection({workspace: dummyWorkspace}, + Blockly.OUTPUT_VALUE); + + assertEquals(Blockly.Connection.REASON_DIFFERENT_WORKSPACES, + input.canConnectWithReason_(output)); + + connectionTest_tearDown(); +} + + +function testCanConnectWithReason_Self() { + connectionTest_setUp(); + + var block = {type_: "test block"}; + input.sourceBlock_ = block; + assertEquals(Blockly.Connection.REASON_SELF_CONNECTION, + input.canConnectWithReason_(input)); + + connectionTest_tearDown(); +} + +function testCanConnectWithReason_Type() { + connectionTest_setUp(); + + assertEquals(Blockly.Connection.REASON_WRONG_TYPE, + input.canConnectWithReason_(previous)); + assertEquals(Blockly.Connection.REASON_WRONG_TYPE, + input.canConnectWithReason_(next)); + + assertEquals(Blockly.Connection.REASON_WRONG_TYPE, + output.canConnectWithReason_(previous)); + assertEquals(Blockly.Connection.REASON_WRONG_TYPE, + output.canConnectWithReason_(next)); + + assertEquals(Blockly.Connection.REASON_WRONG_TYPE, + previous.canConnectWithReason_(input)); + assertEquals(Blockly.Connection.REASON_WRONG_TYPE, + previous.canConnectWithReason_(output)); + + assertEquals(Blockly.Connection.REASON_WRONG_TYPE, + next.canConnectWithReason_(input)); + assertEquals(Blockly.Connection.REASON_WRONG_TYPE, + next.canConnectWithReason_(output)); + + connectionTest_tearDown(); +} + +function testCanConnectWithReason_CanConnect() { + connectionTest_setUp(); + + assertEquals(Blockly.Connection.CAN_CONNECT, + previous.canConnectWithReason_(next)); + assertEquals(Blockly.Connection.CAN_CONNECT, + next.canConnectWithReason_(previous)); + assertEquals(Blockly.Connection.CAN_CONNECT, + input.canConnectWithReason_(output)); + assertEquals(Blockly.Connection.CAN_CONNECT, + output.canConnectWithReason_(input)); + + connectionTest_tearDown(); +} + +/** + * The next set of tests checks that exceptions are being thrown at the correct + * times (external view of errors). + */ +function testCheckConnection_Self() { + connectionTest_setUp(); + var block = {type_: "test block"}; + input.sourceBlock_ = block; + try { + input.checkConnection_(input); + fail(); + } catch (e) { + // expected + } + + connectionTest_tearDown(); +} + +function testCheckConnection_TypeInputPrev() { + connectionTest_setUp(); + try { + input.checkConnection_(previous); + fail(); + } catch (e) { + // expected + } + + connectionTest_tearDown(); +} + +function testCheckConnection_TypeInputNext() { + connectionTest_setUp(); + try { + input.checkConnection_(next); + fail(); + } catch (e) { + // expected + } + + connectionTest_tearDown(); +} + +function testCheckConnection_TypeOutputPrev() { + connectionTest_setUp(); + try { + output.checkConnection_(previous); + fail(); + } catch (e) { + // expected + } + + connectionTest_tearDown(); +} + +function testCheckConnection_TypePrevInput() { + connectionTest_setUp(); + try { + previous.checkConnection_(input); + fail(); + } catch (e) { + // expected + } + + connectionTest_tearDown(); +} + +function testCheckConnection_TypePrevOutput() { + connectionTest_setUp(); + try { + previous.checkConnection_(output); + fail(); + } catch (e) { + // expected + } + + connectionTest_tearDown(); +} + +function testCheckConnection_TypeNextInput() { + connectionTest_setUp(); + try { + next.checkConnection_(input); + fail(); + } catch (e) { + // expected + } + + connectionTest_tearDown(); +} + +function testCheckConnection_TypeNextOutput() { + connectionTest_setUp(); + try { + next.checkConnection_(output); + fail(); + } catch (e) { + // expected + } + + connectionTest_tearDown(); +} + +function test_isConnectionAllowed_Distance() { + var sharedWorkspace = {}; + // Two connections of opposite types near each other. + var one = helper_createConnection(5 /* x */, 10 /* y */, + Blockly.INPUT_VALUE, null, true); + one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + + var two = helper_createConnection(10 /* x */, 15 /* y */, + Blockly.OUTPUT_VALUE, null, true); + two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + + assertTrue(one.isConnectionAllowed(two, 20.0)); + // Move connections farther apart. + two.x_ = 100; + two.y_ = 100; + assertFalse(one.isConnectionAllowed(two, 20.0)); +} + +function test_isConnectionAllowed_Unrendered() { + var sharedWorkspace = {}; + + var one = helper_createConnection(5 /* x */, 10 /* y */, + Blockly.INPUT_VALUE); + one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + + // Don't offer to connect an already connected left (male) value plug to + // an available right (female) value plug. + var two = helper_createConnection(0, 0, Blockly.OUTPUT_VALUE); + two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + + assertTrue(one.isConnectionAllowed(two)); + var three = helper_createConnection(0, 0, Blockly.INPUT_VALUE); + three.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + + Blockly.Connection.connectReciprocally_(two, three); + assertFalse(one.isConnectionAllowed(two)); + + // Don't connect two connections on the same block. + two.sourceBlock_ = one.sourceBlock_; + assertFalse(one.isConnectionAllowed(two)); +} + +function test_isConnectionAllowed_NoNext() { + var sharedWorkspace = {}; + var one = helper_createConnection(0, 0, Blockly.NEXT_STATEMENT); + one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + one.sourceBlock_.nextConnection = one; + + var two = helper_createConnection(0, 0, Blockly.PREVIOUS_STATEMENT); + two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + + assertTrue(two.isConnectionAllowed(one)); + + var three = helper_createConnection(0, 0, Blockly.PREVIOUS_STATEMENT); + three.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + three.sourceBlock_.previousConnection = three; + Blockly.Connection.connectReciprocally_(one, three); + + assertFalse(two.isConnectionAllowed(one)); +} + +function test_isConnectionAllowed_InsertionMarker() { + var sharedWorkspace = {}; + // Two connections of opposite types near each other. + var one = helper_createConnection(5 /* x */, 10 /* y */, + Blockly.INPUT_VALUE); + one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + + // The second one is an insertion marker. + var two = helper_createConnection(10 /* x */, 15 /* y */, + Blockly.OUTPUT_VALUE); + two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); + two.sourceBlock_.isInsertionMarker = function() { + return true; + }; + + assertFalse(one.isConnectionAllowed(two, 20.0)); +} + +function testCheckConnection_Okay() { + connectionTest_setUp(); + previous.checkConnection_(next); + next.checkConnection_(previous); + input.checkConnection_(output); + output.checkConnection_(input); + + connectionTest_tearDown(); } diff --git a/tests/jsunit/db_test.js b/tests/jsunit/db_test.js new file mode 100644 index 0000000000..45fc62a4b3 --- /dev/null +++ b/tests/jsunit/db_test.js @@ -0,0 +1,76 @@ +/** + * @license + * Blockly Tests + * + * Copyright 2016 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. + */ +'use strict'; + +function test_DB_getNeighbours() { + var db = new Blockly.ConnectionDB(); + + // Search an empty list. + assertEquals(helper_getNeighbours(db, 10 /* x */, 10 /* y */, 100 /* radius */).length, 0); + + // Set up some connections. + for (var i = 0; i < 10; i++) { + db.addConnection_(helper_createConnection(0, i, Blockly.PREVIOUS_STATEMENT)); + } + + // Test block belongs at beginning + var result = helper_getNeighbours(db, 0, 0, 4); + assertEquals(5, result.length); + for (i = 0; i < result.length; i++) { + assertNotEquals(result.indexOf(db[i]), -1); // contains + } + + // Test block belongs at middle + result = helper_getNeighbours(db, 0, 4, 2); + assertEquals(5, result.length); + for (i = 0; i < result.length; i++) { + assertNotEquals(result.indexOf(db[i + 2]), -1); // contains + } + + // Test block belongs at end + result = helper_getNeighbours(db, 0, 9, 4); + assertEquals(5, result.length); + for (i = 0; i < result.length; i++) { + assertNotEquals(result.indexOf(db[i + 5]), -1); // contains + } + + // Test block has no neighbours due to being out of range in the x direction + result = helper_getNeighbours(db, 10, 9, 4); + assertEquals(result.length, 0); + + // Test block has no neighbours due to being out of range in the y direction + result = helper_getNeighbours(db, 0, 19, 4); + assertEquals(result.length, 0); + + // Test block has no neighbours due to being out of range diagonally + result = helper_getNeighbours(db, -2, -2, 2); + assertEquals(result.length, 0); +} + +function helper_getNeighbours(db, x, y, radius) { + return db.getNeighbours(helper_createConnection(x, y, Blockly.NEXT_STATEMENT), radius); +} + +function helper_createConnection(x, y, type) { + var conn = new Blockly.Connection({workspace: {}}, type); + conn.x_ = x; + conn.y_ = y; + return conn; +} \ No newline at end of file diff --git a/tests/jsunit/horizontal_tests.html b/tests/jsunit/horizontal_tests.html new file mode 100644 index 0000000000..90e2ca50d7 --- /dev/null +++ b/tests/jsunit/horizontal_tests.html @@ -0,0 +1,23 @@ + + + + + Unit Tests for Horizontal Scratch-Blockly + + + + + + + + + + + + + + + + + + diff --git a/tests/jsunit/index.html b/tests/jsunit/index.html index 9c3df0ea67..dc14d97a61 100644 --- a/tests/jsunit/index.html +++ b/tests/jsunit/index.html @@ -2,17 +2,9 @@ - Unit Tests for Blockly - - - - - - - - - + Vertical tests + Horizontal tests diff --git a/tests/jsunit/svg_test.js b/tests/jsunit/svg_test.js new file mode 100644 index 0000000000..5e7bfee601 --- /dev/null +++ b/tests/jsunit/svg_test.js @@ -0,0 +1,159 @@ +/** + * @license + * Blockly Tests + * + * Copyright 2016 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. + */ +'use strict'; + +var svgTest_workspace; + +function svgTest_setUp() { + svgTest_workspace = Blockly.inject('blocklyDiv', + {toolbox: document.getElementById('toolbox')}); +} + +function svgTest_tearDown() { + svgTest_workspace.dispose(); + svgTest_workspace = null; +} + +/** + * Create a block with one field. Must be called after svgTest_setUp(). + * @return {!Blockly.Block} The new block with one field. + */ +function svgTest_newOneFieldBlock() { + Blockly.Blocks['one_field_block'] = { + init: function() { + this.jsonInit({ + 'message0': '%1', + 'args0': [ + { + 'type': 'field_input', + 'name': 'FIELD' + } + ] + }); + } + }; + + var block = svgTest_workspace.newBlock('one_field_block'); + block.initSvg(); + block.render(false); + return block; +} + +/** + * Create a block with two fields. Must be called after svgTest_setUp(). + * @return {!Blockly.Block} The new block with two fields. + */ +function svgTest_newTwoFieldBlock() { + Blockly.Blocks['two_field_block'] = { + init: function() { + this.jsonInit({ + 'message0': 'text_field %1', + 'args0': [ + { + 'type': 'field_input', + 'name': 'FIELD' + } + ] + }); + } + }; + + var block = svgTest_workspace.newBlock('two_field_block'); + block.initSvg(); + block.render(false); + return block; +} + +/** + * Check that the clicking the block shows the editor when the block has one + * field. + */ +function test_oneFieldBlock_blockClickShowsEditor() { + svgTest_setUp(); + + try { + var block = svgTest_newOneFieldBlock(); + + var showEditorCalled = false; + block.getField('FIELD').showEditor_ = function() { + showEditorCalled = true; + }; + + block.getSvgRoot().dispatchEvent(new Event('mouseup')); + assertTrue('showEditor_() not called', showEditorCalled); + } finally { + svgTest_tearDown(); + } +} + +/** + * Check that the clicking the field shows the editor when the block has more + * than one field. + */ +function test_twoFieldBlock_fieldClickShowsEditor() { + svgTest_setUp(); + + try { + var block = svgTest_newTwoFieldBlock(); + + var showEditorCalled = false; + block.getField('FIELD').showEditor_ = function() { + showEditorCalled = true; + }; + + block.getField('FIELD').getSvgRoot().dispatchEvent(new Event('mouseup')); + assertTrue('showEditor_() not called', showEditorCalled); + } finally { + svgTest_tearDown(); + } +} + +/** + * Check that blocks with one field have the text cursor style. + */ +function test_oneFieldBlock_blockCursorStyleIsText() { + svgTest_setUp(); + + try { + var block = svgTest_newOneFieldBlock(); + + assertEquals('text', block.getSvgRoot().style.cursor); + } finally { + svgTest_tearDown(); + } +} + + +/** + * Check that blocks with two fields have the text cursor style on the field + * group. + */ +function test_twoFieldBlock_fieldCursorStyleIsText() { + svgTest_setUp(); + + try { + var block = svgTest_newTwoFieldBlock(); + + assertEquals('text', block.getField('FIELD').getSvgRoot().style.cursor); + } finally { + svgTest_tearDown(); + } +} + diff --git a/tests/jsunit/vertical_tests.html b/tests/jsunit/vertical_tests.html new file mode 100644 index 0000000000..bec47ee72d --- /dev/null +++ b/tests/jsunit/vertical_tests.html @@ -0,0 +1,23 @@ + + + + + Unit Tests for Vertical Scratch-Blockly + + + + + + + + + + + + + + + + + + diff --git a/tests/jsunit/workspace_test.js b/tests/jsunit/workspace_test.js index 2033b9ae01..87ff3bb988 100644 --- a/tests/jsunit/workspace_test.js +++ b/tests/jsunit/workspace_test.js @@ -82,3 +82,18 @@ function test_getWorkspaceById() { assertEquals('WorkspaceB exists.', workspaceB, Blockly.Workspace.getById(workspaceB.id)); } + +function test_getBlockById() { + var workspace = new Blockly.Workspace(); + var blockA = workspace.newBlock(''); + var blockB = workspace.newBlock(''); + assertEquals('Find blockA.', blockA, workspace.getBlockById(blockA.id)); + assertEquals('Find blockB.', blockB, workspace.getBlockById(blockB.id)); + assertEquals('No block found.', null, + workspace.getBlockById('I do not exist.')); + blockA.dispose(); + assertEquals('Can\'t find blockA.', null, workspace.getBlockById(blockA.id)); + assertEquals('BlockB exists.', blockB, workspace.getBlockById(blockB.id)); + workspace.clear(); + assertEquals('Can\'t find blockB.', null, workspace.getBlockById(blockB.id)); +} diff --git a/tests/multi_playground.html b/tests/multi_playground.html new file mode 100644 index 0000000000..51fa487a40 --- /dev/null +++ b/tests/multi_playground.html @@ -0,0 +1,263 @@ + + + + +Multi-toolbox Playground + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + LTRRTL
    Vertical layout; toolbox at start +
    +
    +
    +
    Vertical layout; toolbox at end +
    +
    +
    +
    Horizontal layout; toolbox at start +
    +
    +
    +
    Horizontal layout; toolbox at end +
    +
    +
    +
    + + + + + + + + diff --git a/tests/playground.html b/tests/playground.html deleted file mode 100644 index d8fadd60e7..0000000000 --- a/tests/playground.html +++ /dev/null @@ -1,550 +0,0 @@ - - - - -Blockly Playground - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - -

    Blockly Playground

    - -

    Show - - Hide

    - - - -

    - -   - -
    - -   - -   - -   - -
    - -

    -
    - -

    - Stress test: - - -

    - - - diff --git a/tests/spec.png b/tests/spec.png new file mode 100644 index 0000000000..edd26975cf Binary files /dev/null and b/tests/spec.png differ diff --git a/tests/spectool.html b/tests/spectool.html new file mode 100644 index 0000000000..f6ac71b6c8 --- /dev/null +++ b/tests/spectool.html @@ -0,0 +1,163 @@ + + + + +Spec tool + + + + + + + + + + + + + + + + + + + +
    + + + +

    Spec tool!

    + + + + diff --git a/tests/vertical_playground.html b/tests/vertical_playground.html new file mode 100644 index 0000000000..699dcf9860 --- /dev/null +++ b/tests/vertical_playground.html @@ -0,0 +1,313 @@ + + + + + + + Vertical Playground + + + + + + + + + + + + + + +
    +
    + + + + + +

    Vertical Blocks

    +

    Warning: Work in Progress

    +

    + Show + - Hide +

    + + + +

    + +   + +
    + +
    + +

    + +
    + +

    + Log events:   + +

    + +

    + Glows:   + + + + +

    + +

    + Log flyout events:   + +

    + +

    + Enable sounds (after refresh):   + +

    + +

    + + +

    + +